---
# System prepended metadata

title: Python 教學

---

# Python 教學

### 1. 注意事項
* 由於沒有大括號，所以 Python 需使用「縮排」(indent)。
* Python 句末不需要分號。
* 不用使用資料型別來宣告變數。  ex : int variable;
* 註解都是使用 `#`。
* 目前 Python 的社群已相當成熟，所以市面上已有許多套件可以使用，那引用這些套件就要使用以下的方法 : 
```python=
import os
import pandas as pd
from time import time
```
* Python 是使用「直譯器」。 v.s 編譯 (compile)

### 2. 變數宣告及運算

如同注意事項所說，變數宣告並不需要使用資料型別，而是直接使用 `=` 來賦予值，直譯器會「自動」幫你識別資料型態。

```python=
variable = 1
print(type(variable))    # int

variable = 'a'
variable = "string"
variable = True
```

而運算子有 `+`, `-`, `*`, `/`, `//`, `%`，其中 `//` 比較特殊，它是叫做整數除法，就是除完後無條件捨去小數點。 <註> : 整數並沒有範圍，可以視為無限大，但很耗空間。

```python=
num1 = 7
num2 = 3

print(num1 + num2)    # 10
print(num1 - num2)    # 4
print(num1 * num2)    # 21
print(num1 / num2)    # 2.333
print(num1 // num2)   # 2
```
若兩個整數相除，結果還是會是小數，若我們要強制轉型 (只留整數)，除了使用整數除法外，還能使用 : 
```python=
num3 = int(num1 / num2)
```


### 3. if - else 呈述句
當我們面臨「滿足這些條件才要執行」的時候，我們就必須使用 if-else 呈述句，那在搭配 if-else 時會有選擇運算子，包括 `==` (等於), `!=` (不等於), `~` (否)，而有多個條件時，我們還會使用 `and` (且), `or` (或)。

範例 : 

```python=
num = 6

if num % 2 == 0 and num < 10:
    print("1 yes")    # 1 yes
elif num % 2 == 0 and num > 10:
    print("2 yes")
else:
    print("unknown")
```

巢狀 if-else :
```python=
year = 2023

if year % 4 == 0:
    if year % 400 == 0:
        print("leap year")
    elif year % 100 == 0:
        print("normal year")
    else:
        print("leap year")
else:
    print("normal year")    # normal year
```


### 4. 迴圈

迴圈就是能夠重複地做很多事，而範圍便是由後面的 `range()` 訂的。而有以下幾種分別 : 
* range(a, b, n) : 從 a 到 b-1，每次增加 n
    * range(1, 10, 1) : 從 1 到 9，每次遞增 1 。
    * range(10, 1, -1) : 從 10 到 2，每次遞增 -1 。
    * range(1, 10, 2) : 從 1 到 8，每次遞增 2 。
```python=
for idx in range(1, 10, 1):
    print(idx)
```

while 迴圈 : 

```python=
cnt = 1
while cnt < 10:
    print(cnt)
    cnt = cnt + 1
```

### 5. 串列 (list)

串列 (list) 有點像陣列，但我們並不需要先宣告他的大小，而是直接使用 `[]` 來代表他就可以。

```python=
list1 = [1, 2, 3]
```

而要如何將元素加進去 list 裡面呢? 使用 `append()`。

```python=
list1.append(4)
print(list1)    # [1, 2, 3, 4]
```

list 裡面可以包含不同類型的資料，例如 : 

```python=
list1 = ["I am kevin.", 1, True, [1, 2, 3]]
```

我們可以利用 `for` 迴圈來遍歷 list，一共有兩種方法 : 
1. 先利用 `len(list1)` 來取得串列的大小，在使用 `idx` 來當索引值，便可以利用索引值讀去串列的內容 : 
```python=
length = len(list1)    # length = 4
for idx in range(length):
    print(list1[idx], endl=" ")    # 1 2 3 4
```

2. 利用 `in` 來「直接讀取」串列裡面的內容 : 
```python=
for num in list1:
    print(num, endl=" ") # 1 2 3 4
```

### 6. 元組 (tuple)

tuple 也是用來儲存資料的一種資料結構，不過不同於 list 的地方是，tuple 內部的元素並不能進行「更動」，若更動它，直譯器就會直接給我們錯誤的訊息。我們可以使用 `()` 來代表 tuple。

```python=
tuples = (1, 2, 3)
tuples[2] = 4
```

錯誤訊息 : 
```
Traceback (most recent call last):
  File "python.py", line 2, in <module>
    tuples[2] = 4
TypeError: 'tuple' object does not support item assignment
```

### 7. 字典 (dictionary)

字典有兩種儲存的值，一個是 key，一個是 value。key 會對到 value: 
* 一個 key 對到 一個 value。

我們通常會以 `{}` 來代表 dictionary，而儲存格式會是 `key: value`，key 跟 value 沒有指定的資料型態，所以意思是都可以。

```python=
dict1 = {
    "a": 3,
    "b": 4,
    "c": 5,
}
```

若要讀取 value，則只需要讀取 `dict[key]` 即可。ex : 

```python=
print(dict1["a"])
```

如何遍歷 dictionary ? 使用 `dict.items()` 去讀取 dictionary 的每一行。

```python=
for key, value in dict1.items():
    print(key, value)
    
# a 3
# b 4
# c 5
```

### 8. 函式 (def)

當我們需要多次用到某段程式碼，或想要讓 debug 變方便，則我們就需要將程式碼「模組化 (module)」。

簡而言之，就是將程式碼切片(slice)，變成許多大大小小的函式。

```python=
def add(a, b):
    return a+b

c = add(1, 2)    # c = 3
```

1. 函式可以回傳多個值。
2. 函式回傳的資料型態並不受限制。
3. 函式裡面可以再寫函式。

```python=
def calculator(a: int, b: int) -> list:
    def to_list(a, b, c, d):
        list1 = [a, b, c, d]
        return list1
    
    list2 = to_list(a+b, a-b, a*b, a/b)
    return list2

list2 = calculator(4, 2)
print(list2)
```

如果只是想宣告，但還不想寫，我們可以利用 `pass` 來先省略。

```python=
def skip():
    pass
```