# 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
```