# 資料的型別、儲存、運算
:::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`型態:

**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程式設計入門`