## Python基本語法 - 2
#### **Gino**
---
## 練習題!
----
[CRCOJ](https://oj.crc.cnmc.tw/)
- 0001 Hello OJ!
- 0002 不要學我說話
- 0003 一元一次方程式
- 0004 長方形愛好者
- 0009 社課不能當人
- 0010 計時
- 0018 北極熊大遷徙
- 0020 星座判斷
- 0021 分糖果
- 0022 分糖果2
- 0023 好氣喔!店員是破腦
- 0027 飛機上的奧客
---
## 條件判斷
- 比較運算子
- 條件運算子
- if-else
----
## 比較運算子
----
### 常見的:
- $<$
- $>$
- $<$
- $>=$
- $==$ (注意不是一個等於!)
- $!=$
----
### $=$ v.s. $==$
```python=
a = 3 # 將變數a設為3
a == 3 # 檢查a是否等於3
```
----
## 條件運算子
----
not
and
or
(優先度:not > and > or)
----
### **not**
```python=
print(3 == 5) # False
print(not 3 == 5) # True
```
```cpp=
cout << (3 == 5) << endl;
cout << !(3 == 5) << endl;
```
----
### **and**
```python=
print(5 < 3 and 10 > 6) # False
print(5 > 3 and 10 > 6) # True
```
```cpp=
cout << (5 < 3 && 10 > 6) << endl;
cout << (5 > 3 && 10 > 6) << endl;
```
----
### **or**
```python=
print(5 < 3 or 10 < 6) # False
print(5 > 3 or 10 < 6) # True
```
```cpp=
cout << (5 < 3 || 10 < 6) << endl;
cout << (5 > 3 || 10 < 6) << endl;
```
----
## if-else
----
### **if**
```python=
if 條件:
(條件成立要做的事)
# ^ 這裡記得要縮排(鍵盤左上角tab)
```
```cpp=
if (條件) {
條件成立要做的事
}
```
----
### **巢狀if - if裡面還有if**
```python=
if 條件A:
if 條件B:
(要做的事)
```
```cpp=
if (A) {
if (B) {
...
}
}
```
----
### **if else**
```python=
if 條件:
...
else:
(條件不成立要做的事)
```
```cpp=
if (條件) {
...
} else {
(條件不成立要做的事)
}
```
----
### **elif (否則如果)**
```python=
if 條件A:
...
elif 條件B: # A不成立才會判斷B
...
elif 條件C: # AB不成立才會判斷C
...
else: # ABC都不成立
...
```
```cpp=
if (A) {
...
} else if (B) {
...
} else if (C) {
...
} else {
...
}
```
---
## 迴圈
- while
- for
----
## while
----
### **while 迴圈**
```python=
while 條件:
... # 只要條件成立就會一直執行
```
```cpp=
while (條件) {
...
}
```
----
### **無窮迴圈**
```python=
while True:
...
```
```cpp=
while (1) {
...
}
```
----
### **break**
```python=
while ...:
...
if 某件事情發生了:
break # 直接離開while迴圈
...
```
```cpp=
while (...) {
...
if (某件事情發生了) {
break;
}
...
}
```
----
### **continue**
```python=
while ...:
...
if 某件事情發生了:
continue # 跳到下一次迴圈
...
```
```cpp=
while (...) {
...
if (某件事情發生了) {
continue;
}
...
}
```
----
## for
----
### **計數迴圈**
```python=
for i in range(10):
...
```
```cpp=
for (int i = 0; i < 10; i++) {
...
}
```
----
備註: range()可以建構一個整數序列
```python=
range(開始, 結束, 間隔)
```
開始值 - 預設為0
結束值 - 一定要有
間隔值 - 預設為1
----
```python=
range(5) # 0, 1, 2, 3, 4
range(2, 5) # 2, 3, 4
range(1, 10, 2) # 1, 3, 5, 7, 9
range(9, 0, -1) # 9, 8, 7, 6, 5, 4, 3, 2, 1
```
----
### **巢狀迴圈 - 迴圈裡面的迴圈**
```python=
for i in range(10):
for j in range(10):
...
```
```cpp=
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
...
}
}
```
---
## list - 列表
### **Python的陣列**
---
**與C++的陣列不同之處**
1. 可任意變換調整大小
2. list可以儲存任何東西,不一定要同個型態
3. list內建很多種函式,使用起來非常彈性、方便
---
還記得C++ STL裡的vector嗎?
可以把list想成是功能更強大的vector
---
### **list的用法**
- **◆建立◆**
- 取值
- 修改
- 檢查
- 遍歷
----
```python=
a = [1, 2, 3, 4]
a = list(1, 2, 3, 4)
```
建立
(list是用中括號包起來的)
----
```python=
a = [1, '2', True, [3, 4, 5]]
```
list裡面可以塞任何東西,甚至另外一個list
----
```python=
a = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
```
**二維list**
list裡面都是裝list
----
```python=
a = [2 for i in range(5)] # 2 2 2 2 2
a = [i for i in range(4)] # 0 1 2 3
a = [i*2 + 5 for i in range(3)] # 5 7 9
```
用for迴圈建立一個list
這個做法叫做**Comprehension**
----
### 輸入一個list
----
當輸入長這樣的時候...
```python
4 2 4 3
```
----
如果直接用input()的話...
```python=
a = input()
```
----
檢查a是不是一個list
```python=
print(type(a))
print(a)
```
輸出:
```python
<class 'str'>
4 2 4 3
```
此時a只是一個字串,而不是我們要的list。
----
幸好Python內建各種好用的函式
以下將介紹輸入list需要的加工程序
----
```python
input() # '4 2 4 3'
```
先把那一行輸入字串吃進來
----
```python
input().split(' ') # ['4', '2', '4', '3']
```
接著把那個字串按照空格' '切割開來
此時Python切下來的部分包成一個list
----
注意到這樣切下來的數字還是字串型態
所以我們需要轉換型別
```python
map(int, input().split(' ')) # 4, 2, 4, 3
```
----
```python
map(型態, list)
```
map可以將list裡面的所有東西轉換成指定型態
list轉換完後的資料組稱作迭代器(iterator)
----
```python
a = list(map(int, input().split(' ')))
```
因此最後再把這個迭代器轉回list就大功告成了!
----

---
### **list的用法**
- 建立
- **◆取值◆**
- 修改
- 檢查
- 遍歷
----
```python=
a = [1, 2, 3, 4]
print(a[0]) # 1
print(a[2]) # 3
```
跟C++一樣,用中括號
第一個東西的索引值一樣是0
----
```python=
a = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
print(a[0][1]) # 2
print(a[2][0]) # 7
```
**二維list取值**
----
```python=
a = [1, 2, 3, 4]
print(a[-1]) # 4
print(a[-3]) # 2
```
Python索引值可以是負的!
----
Python超好用語法
- **slice**
----
**slice**
取得資料組裡面一段連續區間
a[開始:結束:間隔]
- 開始: 預設是0
- 結束: 預設是最後一個(包含)
- 間隔: 預設是1
(有沒有發現其實跟range一樣?)
----
```python=
a = [0, 1, 2, 3, 4, 5]
print(a[2:4]) # 2 3
print(a[:4]) # 0 1 2 3
print(a[2:]) # 2 3 4 5
print(a[:]) # 0 1 2 3 4 5
print(a[::-1]) # 5 4 3 2 1 0
```
---
### **list的用法**
- 建立
- 取值
- **◆修改◆**
- 檢查
- 遍歷
----
```python=
a = [0, 0, 0, 0]
a[2] = 1
print(a) # 0, 0, 1, 0
```
直接修改
----
```python=
a = [1, 2, 3, 4]
a.append(5) # 1 2 3 4 5
a.extend([6, 7, 8]) # 1 2 3 4 5 6 7 8
a += [9, 10, 11] # 1 2 3 4 5 ... 9 10 11
```
新增
----
```python=
a = [1, 3, 4, 5]
a.insert(1, 2) # 1 2 3 4 5
```
插入2到a[1]
後面的資料會被往後擠
----
```python=
a = [1, 2, 2.5, 3, 4, 5]
a.pop() # 1 2 2.5 3 4
a.pop(2) # 1 2 3 4
a.remove(3) # 1 2 4
```
刪除
- pop: 刪除指定位置
- remove: 刪除指定資料
- 如果資料有重複 → 刪除第1個出現的
----
```python=
a = [1, 2, 3, 4]
a.clear()
print(a) # []
del a
print(a) # Error
```
- clear: 清空list
- del: 刪除整個list
----
```python=
a = [1, 2, 3, 4]
a.reverse() # 4, 3, 2, 1
```
原地反轉list
----
```python=
a = [1, 2, 3, 4]
b = a[:]
b = a.copy()
b = [i for i in a]
```
複製一個list
----
複製一個list
不要用`b = a`!
想知道原因
可以跳到簡報講解**list運作原理**的地方
或是下課可以來敲講師OuO
---
### **list的用法**
- 建立
- 取值
- 修改
- **◆檢查◆**
- 遍歷
----
```python=
a = [1, 2, 3, 4]
print(len(a)) # 4
```
取得長度
----
```python=
a = [1, 2, 3, 4, 4, 4, 4]
print(a.count(4)) # 4
print(a.index(4)) # 3
```
- count: 檢查出現幾次
- index: 檢查第一次出現的位置
- 找不到就會發生錯誤
----
```python=
a = [1, 2, 3, 4, 5]
if 3 in a:
print("YES")
else:
print("NO")
# YES
```
檢查資料有沒有出現
---
### **list的用法**
- 建立
- 取值
- 修改
- 檢查
- **◆遍歷◆**
----
```python=
a = [1, 2, 3, 4, 5]
for i in range(len(a)):
print(a[i]) # 1 2 3 4 5
```
用索引值遍歷
----
```python=
a = [1, 2, 3, 4, 5]
for i in a:
print(i) # 1 2 3 4 5
```
----
#### enumerate() 函式
----
```python=
a = ['a', 'b', 'c', 'd']
for item in enumerate(a):
print(item)
"""
(0, 'a')
(1, 'b')
(2, 'c')
(3, 'd')
"""
```
enumerate - 枚舉
把a裡面的物件列舉出來
用括號包著
左邊是**索引值**,右邊是**物件**
----
```python=
a = ['a', 'b', 'c', 'd']
for index, item in enumerate(a):
print(index, item)
"""
0 'a'
1 'b'
2 'c'
3 'd'
"""
```
也可以用兩個變數,一個存索引值,另一個存物件
----
```python=
a = ['a', 'b', 'c', 'd']
for index, item in enumerate(a, start=97):
print(index, item)
"""
97 a
98 b
99 c
100 d
"""
```
可以自己指定開始值,不一定是索引值
(補充:a的ascii碼是97, b是98, 依此類推)
---
### list的運作原理
----
還記得嗎?
- list可以任意調整大小
- list可以儲存任何元素
- 複製list時不要用`a = b`
上面這些特性都跟list的運作原理有關!
----
**\我大指標/**

(可以動態調整大小其實跟C++的vector幾乎一樣)
<!-- ***************************************** -->
<!-- ***************************************** -->
<!-- ***************************************** -->
<!-- ***************************************** -->
<!-- ***************************************** -->
<!-- ***************************************** -->
----
複製list不可以用`a = b`
是因為`a`, `b`都會指向同一個list
因此修改`a`的資料時,`b`也會跟著變動
---
## 你不需要那麼勤勞
----
(剛學完list)
OS: 蛤~要記好多函式喔...
背不起來QwQ
----
Python因為可以用的東西真的太多了
所以很多函式其實是**要用到的時候再查**就行了
(但基本的語法一定要熟)
{"metaMigratedAt":"2023-06-15T21:48:29.013Z","metaMigratedFrom":"YAML","title":"Python基本語法 - 2","breaks":true,"slideOptions":"{\"transition\":\"fade\",\"spotlight\":{\"enabled\":false}}","contributors":"[{\"id\":\"ac1507e0-f05c-4708-bdd2-c56d13fb0dbb\",\"add\":13685,\"del\":5864}]"}