# 資料的型別、儲存、運算 :::info 我們發明電腦,來處理龐大的數據資料。 為了建構虛擬世界的一切人、事、物,我們必須先把所有人事物的資料都數據化,所以衍伸出了多種資料型態,本章節介紹資料型別的種類、儲存方式及運算方式 ::: ## 資料型態 在電腦領域中,最常見的三種資料類型如下 * `數值(Numeric)` * `字串(String)` * `布林值(Boolean)` ### 數值(Numeric) 數值又可以分成`整數(Integer)`與`浮點數(Float)` 例如1, 3, 1000都是整數,而2.5, 6.845是浮點數 ### 字串(String) `字串`由`字元(character)`所構成,例如Apple,是五個字元長度的字串。 ### 布林值(Boolean) 布林值是在電腦科學中,所定義的邏輯資料型別,就只有`True`, `False`兩種值。 在實務面上,我們利用它來表示,一個條件的真偽。 例如:2 < 3為 `True` 以下總結整理Python的基本資料型態 | 型態名稱 | python型態名稱 | 範例 | | -------- | -------- | -------- | | 布林 | `bool` | `True` `False` | | 整數 | `int` | `100` `5566` | | 浮點數 | `float` | `3.14` `500.0` | | 字串 | `str` | `Apple` `Banana` | ### 進階資料型態 又稱為容器資料型別,我們將在[《Python容器資料型別》](https://hackmd.io/@howkii-studio/advanced_datatype)做詳細介紹。 ### 自訂資料型態 除了Python內建的資料型別,為了實務面需求,使用者可以自行定義資料型別,我們在[《物件與類別》](https://hackmd.io/@howkii-studio/object_class)再詳細介紹。 ## 變數 在程式設計中,有個重要觀念是,程式開發者可以自行宣告,定義`變數(Variable)`,也就是**幫電腦記憶體的空間地址**取名,以便使用記憶體空間**儲存資料**並隨時取用,來進行各種資料運算。 ### 在Python中宣告、使用變數 **1. 宣告變數** 宣告變數包括兩件事,命名與賦予值,例如: ```=python num = 0 ``` 我們命名了一個`int`資料物件,名稱為`num`,初始值為`0` :::warning **Python的變數命名規則** - 命名名稱只能包含以下字元 - 大/小寫字母 - 數字 - 底線(_) - 不同大小寫的變數名稱,視為不同的變數 - 名稱開頭必須是字母或底線,不可以用數字開頭 - 不可以使用Python的保留字,例如`False` `True` `For` `if` ::: :::info **培養好的變數命名風格** - 命名簡潔但清楚用途: `num`或`number` - 全部使用小寫: `num` - 適時利用底線: `num_a` ::: **2. 檢查變數的型態** 使用`type`語法,範例如下: ```=python num = 0 print(type(num)) ``` 可以看到結果執行如下,確認`num`是`int`型態: ![](https://i.imgur.com/7Migvsp.png =100x20) **3. 變數型態可以視情況轉換** - 轉換成整數:使用`int()` - 轉換成字串:使用`str()` - 轉換成布林值:使用`bool()` ## 資料的運算 各種資料型態的變數,有自己的運算方式,請熟悉`運算子(operator)`的使用: ### 數值(Numeric): `int` `float` `complex` - 指定運算(Assign) | 運算子 |功用 | | -------- | -------- | | = | 將值指定給變數 | ```` pyhton= # 將3這個數值指定給x,讓x成為一個整數型態的變數,初始值為3 x = 3 ```` - 算術運算 :::info 請注意以上運算子,在各程式語言會使用不同的符號表示,本教材是以Python為例 ::: | 運算子 | 功用 | | -------- | -------- | | + | 將兩個數值相加 | | - | 將兩個數值相減 | | * | 將兩個數值相乘 | | / | 將兩個數值相除 | | // | 將兩個數值相除取商數 | | % | 將兩個數值相除取餘數 | | ** | 將兩個數值進行次方運算 | :::warning 運算順序: - 最優先處理**括號內**運算式 - 再根據運算子優先順序(上表為優先順序由低到高) - 若運算子優先順序相等,**從左到右**處理 ::: 其中有幾個比較少見的運算,我用例子跟大家說明 ```` pyhton= # x為4,因為8除以2的商數為4 x = 8 // 2 # y為1,因為9除以4的餘數為1 y = 9 % 4 # z為8,因為2的3次方為8 z = 2 ** 3 ```` :::warning 若你進行變數的宣告,如果是以下方式 ```python x = "123" ``` 這個x就會是一個**字串型態**,初始值為123的變數,而不是一個整數123,因為字串,你就不能將x進行數值的四則運算處理 ::: - 關係運算 數值之間是可以進行大小的比較運算,請參考以下運算子: | 運算子 | 功用 | | -------- | -------- | | > | 大於 | | < | 小於 | | == | 相等 | | != | 不相等 | | >= | 大於等於 | | <= | 小於等於 | 對於關係運算,我們可以用Boolean來表示結果 ```` pyhton= # x為True,因為2確實小於3 x = 2 < 3 # y為False,因為4並不小於5 y = 4 > 5 ```` - 位元邏輯運算 在Python中,可以將整數化為二進位數字進行運算 位元的運算用途很廣,其中最常被用到的是AND運算,用於影像處理,將圖片用位元表示,透過跟目標去掉的範圍做AND運算,達到處理後效果。 另一個例子是權限管理,透過AND運算做密碼比對,確認該成員是否可進入系統。 位元的AND運算非常地常用,在黑白點陣圖(bitmap)影像,每個 bit 代表一個黑白像素(pixel),所以每個 byte 代表 8 bits,可以看到左邊的影像是個 V 字,右邊的遮罩影像是個圓形。把這兩個影像每個 byte 做 AND 的結果如下所示,等於是把 V 影像剪裁(crop)在圓形範圍之內了,所以 V 的兩支銳角不見了。利用這個技巧,可以用 AND 去裁切掉影像不要的部分。 AND 的運算的一個常見用途則是用在權限管理上,所謂使用者 a 對物品 b 的權限,應當是「 a 有權限使用物品、而 b 剛也有開放被使用的權限」的時候,a 才得以使用 b 物品,如果 a 有使用物品的權限但是 b 不是公開物品,那麼 a 無法使用 b 物品,換言之,如果 b 是公開物品,但是 a 沒有使用任何物品的權限(比如權限等級只是訪客等級),a 也不能使用 b 物品,所以很顯然地「a 是否有權限使用物品 b」是一個 AND 運算 反之,OR 運算則用於**「影像重疊」或「賦予權限」** 比較特別的是 XOR運算,他的特色是「a和b不同的時候 a^b 才 1,否則 a^b 必為 0」,所以 (a^b)^b 等於 a 自己,以影像處理來說,A影像對 B 影像做 XOR,會把 B 影像重疊在 A 之上(但是部分像素會反白),然後再對同一張 B 影像做一次 XOR 則能夠恢復 A 的原貌,所以 XOR 可以做到影像的「暫時」重疊 (或移動中的影像),從前經常用於簡單動畫、滑鼠游標或輔助線的顯示上。 | 運算子 | 功用 | 備註| | -------- | -------- | -------- | | ~ | not | 0變成1、1變成0 | | & | and | 皆為1才是1,否則都是0 | | \| | or | 皆為0才是0,否則都是1 | | ^ | XOR | 相同為0,不同為1 | ```python= a = 8 b = 4 print(~a) print(a & b) print(a | b) print(a ^ b) ``` - 位元位移運算 有兩種位元位移運算子可以使用 | 運算子 | 功用 | 備註| | -------- | -------- | -------- | | << | 左移 | 左移n位,等同於乘以2的n次方 | | >> | 右移 | 右移n位,等同於除以2的n次方 | 位元移動的一大用途,是加速乘法、除法運算,可以注意到,`x<<1`相當於`x*2`,`x>>1`相當於`x/2`,由於位元運算只需要把數字往前、後移動,位元運算的速度是比一般乘法還要快上許多。 範例程式碼: ```python= print(12<<2) #48 print(12>>2) #3 ``` 2. 字串(String) - 指定運算 跟數值一樣,字串也有指定運算 | 運算子 |功用 | | -------- | -------- | | = | 將值指定給變數 | ```` pyhton= # 將Hello World這個字串指定給x,讓x成為一個字串型態的變數,初始值為Hello World x = "Hello World" ```` - 字串運算 Python本身內建許多,對於字串變數的操作,例如將多個字串進行拼接 ```` python= # 變數z的值為Bon Jovi,也就是x, 空白, y 三個字串拼接後的結果 x = Bon y = Jovi z = x + " " + y ```` :::info 💡Tips: 因篇幅有限,更多字串運算子,請參考[Python3 官方文件](https://docs.python.org/3/library/string.html) ::: 3. 布林值(Boolean) - 指定運算 跟數值、字串一樣,布林值也有指定運算 | 運算子 | 功用 | | ------ | -------------- | | = | 將值指定給變數 | ```` pyhton= # 將True這個布林值指定給x,讓x成為一個布林值型態的變數,初始值為True x = True ```` - 邏輯運算 | 運算子 | 功用 | -------- | -------- | and | 多個條件同時為真,則結果為真 | or | 多個條件其中之一為真,則結果為真 | not | 將一個布林值轉換為相反值 我們透過以下範例來了解實際運算結果 ``` pyhton= a = 1 b = 2 # 因為a==b為False,a<b為True,兩者進行and運算,所以x為False x = (a==b) and (a<b) # 因為a==b為False,a<b為True,兩者進行or運算,所以y為True y = (a==b) or (a<b) # 因為a>b為False,進行not運算,所以z為True z = not(a>b) ``` ## 變數資料的輸出 ### f-string(Python3.6以上開始適用) - 基本使用方式 ```=python= word1 = "Hello" print(f'{word1} World') #輸出Hello World ``` - 沿用新式格式化的格式化語法 - `>`: 空格 - `^`: 填補 ```=python= word1 = "Hello" word2 = "World" print(f'{word1:>10}{word2:.^10}') ``` - 檢查目前的變數內容 ```=python= word1 = "Hello" print(f'{word1 =}') ``` - 輸出部分字串 ``` =python= word1 = "Hello" print(f'{word1[0:2]}') #輸出He ``` ###### tags: `Python程式設計入門`