## 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就大功告成了! ---- ![](https://i.imgur.com/YF3jIJS.png) --- ### **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的運作原理有關! ---- **\我大指標/** ![](https://i.imgur.com/b3fIBps.png) (可以動態調整大小其實跟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}]"}
    472 views