# 2. 變數與輸入

## I. 變數

### A. 什麼是變數

相信之前如果有學過一點點程式設計的大家都已經對「變數」這名稱不陌生了，我們可以簡單地把變數想像成一個盒子，這個盒子一次可以放一筆資料進去，但當我們再放新的一筆資料進盒子裡，前一筆資料就會被迫消失囉!

> 其實，變數代表著一段記憶體空間

### B. 為何需要變數

電腦畢竟是人類所開發出的產品，因此思維模式肯定與人類相去不遠，人類不論從眼、耳、鼻、舌、手等感知器官所偵測到的訊息都必須存放在腦中，因此，電腦也同樣需要一個空間儲存所得到的訊息，那就利用變數吧!

> 執行中的程式通常都會放在記憶體當中，因此我們需要開設記憶體空間來存放程式執行期間所需要的絕大部分資料

### C. 變數的命名規則

1. 變數名稱的開頭必須是英文字母或底線

   > `_number` `tem2p` `Act_3` 這些都是允許的變數名稱
2. 變數名稱不得是數字開頭

   > `7zz` `2u` 這種都不允許
3. 變數名稱只能含有(`A~z`, `0~9`, 和 `_` )&#x20;

   > `Act-3` 是不被允許的名稱唷
4. 變數名稱的英文字母大小寫是有區別的

   > `Aoe` `aOE` `aoe` 各是不同的變數
5. 關鍵字不得當變數名稱

   > `False` `await` `else` `import` `pass` `None` `break` `except` `in` `raise` `True` `class` `finally` `is` `return` `and` `continue` `for` `lambda` `try` `as` `def` `from` `nonlocal` `while` `assert` `del` `global` `not` `with` `async` `elif` `if` `or` `yield`

### D. 變數的創立

```python
Age = 50 # Age變數，放入50
_weight = 64 # _weight變數，放入64
name = "Alan" # name變數，放入Alan
```

也可一次放入多個值到多個變數裡

```python
Age, _weight, name = 50, 64, "Alan"
```

**注意!** 資料放入至變數的盒子中在程式的世界稱為：**指定**(assign)

> 變數的指定是由右邊放至左邊，有方向性

**注意!** 在程式碼的世界裡 `=` 是**指定**值給變數的意思，與數學的 `=` 不同

### E. 印出變數裡的值

> 變數與數字一樣不需要用 `""` 或 `''` 括住唷

```python
_weight = 64
print(_weight) # 64
```

一次印出多個變數的值

```python
Age = 50
_weight = 64
name = "Alan"
print(Age, _weight, name) # 50 64 Alan
```

### F. 變數間的相互操作

#### 相互指定

```python
google_founder1 = 'Larry Page'
google_founder2 = 'Sergey Brin'

google_founder1 = google_founder2
print(google_founder1) # Sergey Brin
```

#### 四則運算

```python
n1 = 3
n2 = 10 
print(n1 % n2) # 3
```

> 嘗試把 `%` 換成其它四則運算符號

#### 相加

數字型態

```python
TSMC = 2230
MTK = 2454

TSMC = TSMC + MTK
print(TSMC) # 4684
```

字串型態

```python
TSMC = '2230'
MTK = '2454'

TSMC = TSMC + MTK
print(TSMC) # 22302454
```

<mark style="color:red;">**注意!**</mark> <mark style="color:red;">`a = a + b`</mark> <mark style="color:red;"></mark><mark style="color:red;">可以簡寫為</mark> <mark style="color:red;"></mark><mark style="color:red;">`a += b`</mark><mark style="color:red;">【</mark><mark style="color:red;">`+=`</mark> <mark style="color:red;"></mark><mark style="color:red;">之間不可有空格】</mark>

同理，<mark style="color:red;">`a = a % b`</mark> <mark style="color:red;"></mark><mark style="color:red;">或</mark> <mark style="color:red;"></mark><mark style="color:red;">`a = a // b`</mark> <mark style="color:red;"></mark><mark style="color:red;">這類四則運算也可以簡寫為</mark> <mark style="color:red;"></mark><mark style="color:red;">`a %= b`</mark> <mark style="color:red;"></mark><mark style="color:red;">或</mark> <mark style="color:red;"></mark><mark style="color:red;">`a //= b`</mark>

#### 交換

方法一：(直接交換)

```python
a = '辣椒'
b = '雞腿'

a, b = b, a

print(a, b) # 雞腿 辣椒
```

方法二：(透過另一個中介變數交換)

```python
a = '辣椒'
b = '雞腿'

tmp = a
a = b
b = tmp

print(a, b) # 雞腿 辣椒
```

### G. 變數型態(資料型態)

#### Python 的變數型態主要分為以下三類

![](https://i.imgur.com/3jFHbG7.png)

#### 變數型態的轉換

`int(a)`：將變數`a`轉換成為整數

`float(b)`：將變數`b`轉換成為浮點數

`str(c)`：將變數`c`轉換成為**字串**

```python
# 想想看下方程式碼的執行結果為何是如此?
s = '80' # 字串型態的80
print(s) # 80
print(s*3) # 808080
s = int(s) # 將變入型態由字串轉為整數
print(s) # 80
print(s*3) # 240
```

此外

```python
# 在此之前，下方寫法是不被允許的
print('3' + 3) # TypeError: can only concatenate str (not "int") to str

# 但在學了型態轉換的概念後，我們可以如下改寫
print('3' + str(3)) # 33
```

但是，不能轉的型態就無法轉，例如：

```python
ss = "hello" 
int(ss) # ValueError: invalid literal for int() with base 10: 'hello'
```

#### 確認變數型態

`type(a)`：變數`a`的資料型態

`type(3.14)`：`3.14`的資料型態

`type("It's always a good time")`：`It's always a good time`的資料型態

```python
print(type(3.14)) # <class 'float'>
print(type(10)) # <class 'int'>
print(type('人生的筆畫錯了無法抹滅， 卻可以多加幾筆讓錯誤變美麗')) # <class 'str'>
```

#### 字元與編碼的轉換

`chr`：將**字元**轉成**編碼**(ASCII code) 或 (Unicode)

`ord`：將編碼轉為字元

`eval`將舉凡`list`、`tuple`、`dict`、`str`、變數都轉為數字型態

> ASCII：8 bits，共可儲存128個不同字元。只用於英文字母及符號
>
> Unicode：16 bits，共可儲存65536個不同字元，因此可以包含各國語言及ASCII code(前128個值保留給ASCII code)
>
> utf-8：可視作能調整長度的Unicode，也是目前網路遵循的編碼方式，用1\~4個bytes表示字元

### H. 刪除變數

```python
box = "打我呀笨蛋"
del box # 刪除變數 box
print (box) # NameError: name 'box' is not defined
```

## II. 輸入

前面有提到過\~ 人們由感官接收到外界的資訊需要存在大腦後再進行判斷，電腦接收到的資料則是存在記憶體中(變數)

> 在Python中，我們利用`input()` 讀取鍵盤輸入資料

```python
get = input() # 假設鍵盤輸入 hao da
print(get) # hao da
```

`get` 變數會存放我們鍵盤所輸入的值(也就是記憶體的某段空間)

**照打上方程式碼練習執行看看**

### A. 包含提示字串的輸入

在input後的小括號中放入一列字串可以提示使用者如何輸入正確數值給此程式

```python
get = input("請輸入一個小數") # 假設輸入3.1416
print(get) # 3.1416
```

```python
get = input("請輸入您的體重：") # 假設輸入500
print("您的體重為" + get + "公斤") # 您的體重為500公斤
```

### B. 輸入多個值給多個變數

> `split()` 中文翻作：分開，作用是將輸入的值利用**空格**做分隔，分別放進不同變數中

```python
a, b, c = input('請輸入三字經：').split() # ：人之初 性本善 性相近
print(a, b, c) # 人之初 性本善 性相近
```

```python
n1, n2 = input('請輸入兩個整數：').split() # 55 66
print(n1 + n2) # 5566

n1, n2 = input('請輸入兩個小數：').split() # 5.5 6.6
print(n1 + n2) # 5.56.6
```

**注意!** `input()` 讀進來的值，型態一律為 `string(str)` 字串型態

> `split()` 小括號中若放入不同符號。則表示用該符號當分隔

```python
n1, n2 = input('請輸入兩個整數：').split('*') # 55 66
print(n1, n2) # ValueError: not enough values to unpack (expected 2, got 1)
```

```python
n1, n2 = input('請輸入兩個整數：').split('*') # 55*66
print(n1, n2) # 55 66
```

#### 輸入多個值並同時轉型態

> 下方程式碼中的 `map` 是翻譯作：映射、投影

```python
n1, n2 = map(int, input('請輸入兩個整數：').split()) # 55 66
print(n1 + n2) # 121

n1, n2 = map(float, input('請輸入兩個小數：').split()) # 5.5 6.6
print(n1 + n2) # 12.1
```

## III.  **異常處理(t**ry ... except)(補充)

有時候，我們會希望程式在錯誤情況發生時，跳出某些警告，而不是讓程式直接停止導致需要重新執行

範例如下

```python
try:
    # 嘗試執行一些程式碼
except:
    # 當程式出現異常時執行這邊的程式碼
```

執行看看下方程式碼

```python
# 嘗試輸入4或40看看結果
try:
    x, y = map(int, input('請輸入兩個數，來得到相除後的結果：').split())
    print(x / y)
except:
    print('除數不可以為0')
```

可以有多個`except`應付多種情況

```python
while True:
    try:
        x, y = map(int, input('請輸入兩個數，來得到相除後的結果：').split())
        print(x / y)
    except ZeroDivisionError:
        print('除數不可以為0')
    except ValueError:
        print('輸入格式有誤')
    except:
        print('程式出現其它異常')
```

## IV. 學習單

{% embed url="<https://docs.google.com/presentation/d/e/2PACX-1vQwyis4rUTgTDv6FE_RpMs8CWC01N1RhtBJeJLxYW-Kq9vqTdgzg_ktH03qeZyynJqxE-BcBuHXurs7/embed?start=false&loop=false&delayms=10000>" %}
