# 第二天 Python入門實作班上課記錄 ###### tags: `python` #### 定義一個list和一個set ```python= a = [1, 2, 3, 1] # list b = {1, 2, 3, 1} # set a.append(99) # list 新增資料 print(a[2]) b.add(99) b.add(9) b.add(99) b.remove(1) for value in b: print(value) ``` 說明: 1. list與set可以透過左右兩邊的括號分辨,中括號為list,大括號為set 2. set只能透過for-in迴圈取出裡面的元素值 #### dict(字典) ```python= name = input('請輸入姓名:') score = int(input('請輸入國文成績:')) scores = {'aaron':99} scores['test'] = 100 scores[name] = score del scores['aaron'] print(scores) ``` 說明: 1. 字典dict內的每一筆資料都是由key和value組成 2. value可以透過索引運算子+key來取得 3. 指派一個值到dict時,如果該key不存在,則為新增資料,否則為修改資料 #### Tuple ```python= a = (1, 2, 3) b = [1, 2, 3] c = 1, 2, 3, d = 1 e = 1, print(d) print(e) ``` 1. Tuple左右兩邊為小括號 2. Tuple特性和list幾乎相同,差別在Tuple在建立後無法修改內容 3. 第一行和第三行是建立tuple的兩種方式 #### random模組 ```python= import random a = random.randint(1, 10) # 產生1~10之間的隨機整數 print(a) b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] random.shuffle(b) print(b) ``` 說明: 1. `random.randint()`用來產生指定的兩個數字之間的隨機整數 2. `random.shuffle()`用來將list內的元素打亂 #### 小試身手-猜拳遊戲 ```python= import random SCISSORS = 1 STONE = 2 PAPER = 3 pc = random.randint(1, 3) # 1 = 剪刀, 2 = 石頭, 3 = 布 print('電腦出:', ['剪刀', '石頭', '布'][pc - 1]) player = int( input('請出拳(1=剪刀, 2=石頭, 3=布):') ) if pc == SCISSORS and player == STONE: print('你贏了') elif pc == SCISSORS and player == PAPER: print('你輸了') elif pc == STONE and player == SCISSORS: print('你輸了') elif pc == STONE and player == PAPER: print('你贏了') elif pc == PAPER and player == SCISSORS: print('你贏了') elif pc == PAPER and player == STONE: print('你輸了') else: print('平手') ``` #### 常用的字串操作方法 ```python= a = 'today Is a nICe day'; print(a.upper()) # 將字串內英文字元全部轉為大寫 print(a.lower()) # 將字串內英文字元全部轉為小寫 print(a.capitalize()) # 將字串內第一個英文字元轉為大寫 print(a.title()) # 將字串內每個英文單字的第一個字元轉為大寫 print(len(a)) # 計算字串長度 a = 'abcdefghijk' print(','.join(a)) # 將字串內的每個字元之間都加上逗點 print(a + '3') # 將兩個字串串接在一起 print('a' * 10) # 將字串的內容重覆10次 name = 'aaron' age = 18 # f-string: 將字串與變數組合在一起 print(f'My name is {name}, I\m {age + 10} years old') ``` #### 索引切片運算子 ```python= a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] print(a[0:3]) print(a[3:]) # 取到最後一個 print(a[:2]) # 從第一個取 print(a[:]) print(a[:-1]) print(a[-3:-1]) print(a[-1:-3]) print(a[::2]) print(a[::-1]) # a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] print(a[-3:-1:-1]) print(a[-1:-3:-1]) ``` 執行結果: ``` [1, 2, 3] [4, 5, 6, 7, 8, 9, 0] [1, 2] [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] [1, 2, 3, 4, 5, 6, 7, 8, 9] [8, 9] [] [1, 3, 5, 7, 9] [0, 9, 8, 7, 6, 5, 4, 3, 2, 1] [] [0, 9] ``` > 注意: > 當最後一個step為負數時,其掃描方向為由右置左,需注意start需大於end參數,否則會取不到值 #### range()方法: 產生一串指定範圍的數字 ```python= print(list(range(10, 0, -1))) for j in range(2, 10): for i in range(1, 10): print(f'{j} x {i} = {j * i}') ``` 說明: 1. range()通常會和for-in迴圈搭配,用來指定迴圈執行的次數 #### while迴圈 ```python= a = 0 while a < 3: print('*') a += 1 ``` #### 迴圈內可以使用的兩個指令 - break: 結束回圈 - continue: 忽略迴圈剩下程式碼,重頭執行 #### 猜數字遊戲 ```python= import random answer = random.randint(0, 5) while True: player = int(input('猜一個數字:')) if answer == player: print('猜對了, 遊戲結束') break else: print('猜錯.') ``` 說明: 1. `while True:`為一個無窮迴圈 2. 第八行當使用者猜對數字時使用`break`指令跳離迴圈 #### 將一個list內的偶數加總 ```python= a = [1, 44, 5, 78, 93, 21] total = 0 for val in a: if val % 2 == 1: continue total += val print(f'偶數的總和為{total}') ``` #### 將一個list內的奇數挑出來顯示到畫面上 ```python= a = [1, 2, 3, 4, 5, 6, 7] i = 0 while i < len(a): i += 1 if i >= len(a): break if i % 2 == 0: continue print(a[i]) ``` #### 計算階層 ```python= fact_val = 1 for val in range(2, 4): # 3的階層 fact_val *= val print('3的階層為:', fact_val) fact_val = 1 for val in range(2, 5): # 4的階層 fact_val *= val print('4的階層為:', fact_val) ``` #### 計算階層(函式版) ```python= def fact(num): # 定義函式, 有num參數 fact_val = 1 for val in range(2, num + 1): # 某個階層 fact_val *= val print(f'{num}的階層為:{fact_val}') fact(3) # 呼叫fact函式 fact(4) # 呼叫fact函式 fact(5) # 呼叫fact函式 ``` #### 一個可以對調兩個變數的函式 ```python= def swap(a, b): return b, a # 將a, b兩個變數內容對調 a = 2 b = 3 a, b = swap(a, b) print(f'a={a}, b={b}') ``` #### return: 讓函式可以回傳資料 ```python= def test(): a = 3 b = 5 return 'x' t = test() print(t) ``` > 補充: > 如果函式內沒有return,當使用指派(=)運算子去接收函式時會得到`None` #### 一個極簡的函式 ```python= def a(): print('Hello') a() a() a() ``` 說明: 1. 函式需有呼叫的動作才會執行函式內的程式碼 2. 函式呼叫只需要使用函式名稱+小括號(如果小括內有參數需傳入參數) #### 本日最終時戰練習: AB猜數字遊戲 玩法: 1. 產生0~9之間隨機四個不重複數字作為答案 2. 讓玩家猜四個數字,需檢查數字不可以重複(例如: 1233是無效的) 3. 如果玩家猜的四個數字內有和答案一樣且位置也一樣則以多少A來提示有幾個數字正確 4. 如果數字猜對,但位置不對,則以多少B來提示玩家(不包含位置正確的數字) ```python= import random a = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] random.shuffle(a) print("After shuffle", a) answer = a[0] + a[1] + a[2] + a[3] print('答案:', answer) guess_count = 0 # 猜了幾次 while True: user = input('猜四個數字(0~9)之間不重複數字:') # 2. 使用者猜數字 guess_count += 1 # 猜的次數加一 if len(set(user)) < 4: print('不可以有重複數字,已猜了', guess_count, '次') continue # 猜對了,結束遊戲 if user == answer: print('恭喜,猜對了,總共猜了', guess_count, '次') break # 比較 how_many_A = 0 # 幾A how_many_B = 0 # 幾B if answer[0] == user[0]: how_many_A += 1 if answer[1] == user[1]: how_many_A += 1 if answer[2] == user[2]: how_many_A += 1 if answer[3] == user[3]: how_many_A += 1 if user[0] in answer and user[0] != answer[0]: how_many_B += 1 if user[1] in answer and user[1] != answer[1]: how_many_B += 1 if user[2] in answer and user[2] != answer[2]: how_many_B += 1 if user[3] in answer and user[3] != answer[3]: how_many_B += 1 print(f'{how_many_A}A{how_many_B}B, 你已經猜了{guess_count}次') ```