---
# System prepended metadata

title: 資料的型別、儲存、運算
tags: [Python程式設計入門]

---

# 資料的型別、儲存、運算
:::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變成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程式設計入門`