# 2022-11-20 第二天 Python網路爬蟲應用實務班上課記錄 ###### tags: `python` `爬蟲` ## 判斷式 ```python= # 運算結果為True或False = 條件式 # 比較運算子,邏輯運算子,其他.... in a = 3 b = 4 print(a) print(b) if b == a: # b > a 有成立,所以運算結果為True(不成立的話運算結果會是False) # 判斷式內的程式碼一定要縮排(PEP 8規格, 縮排建議為四個空白字元) print('Hi1') # 判斷式成立時要執行的程式碼 print('Hi2') # 判斷式成立時要執行的程式碼 print('Hi5') # 無縮排的程式碼下面,不可以出先沒有意義的縮排程式碼 # print('Hi3') # 判斷式成立時要執行的程式碼 # 這行跟判斷式無關,因為他沒有縮排 print('Hi4') # 判斷式成立時要執行的程式碼 ``` #### 今天星期幾 ```python= import datetime # 引入外部模組(非程式語言的內建功能) # 0=星期一, 1=星期二 ... 6=星期日 w = datetime.date.today().weekday() # 有小括號的叫做 函式或方法 print(w) if w == 0: print('今天是星期一') if w == 1: print('今天是星期二') if w == 2: print('今天是星期三') if w == 3: print('今天是星期四') if w == 4: print('今天是星期五') if w == 5: print('今天是星期六') if w == 6: print('今天是星期日') ``` #### 判斷式分支 ```python= score = int(input('請輸入成績:')) if score >= 90: # 如果這裡成立, elif的條件式都不會再被判斷, elif是判斷式的分支 print('優秀') elif score < 90 and score >= 80: # else if print('不錯,再加油') elif score < 80 and score >= 60: print('還可以') elif score < 60: print('不及格') ``` #### else ```python= num = int(input('請輸入一個整數:')) if num % 2 == 0: print('偶數') else: # 如果分支全部不成立,else的程式碼就會被執行 print('奇數') ``` #### 單行if ```python= num = int(input('請輸入一個整數:')) # if num % 2 == 0: # print('偶數') # else: # 如果分支全部不成立,else的程式碼就會被執行 # print('奇數') print('偶數' if num % 2 == 0 else '奇數') ``` #### 單行if不可以出現指派運算子 ```python= num = int(input('請輸入分數:')) # if num < 60: # num += 10 # else: # num += 0 num += 10 if num < 60 else 0 print('加分後的結果:', num) ``` #### 猜數字小遊戲 ```python= # a = 0 # # 如果迴圈條件式都不會產生False, 則迴圈不會停下,稱為無窮迴圈 # while a < 5: # <--- 每次while迴圈裡面的程式碼全部執行完後會回到這個地方重新執行條件式,如果成立會再次執行while內程式碼 # print(a) # a += 1 # 迴圈美執行一次, a就會被加1 # print('迴圈結束') import random # 引入亂數模組 a = random.randint(1, 5) # 產生1~5之間的隨機整數 print('隨機數:', a) # 寫一個小遊戲,讓使用者猜1~5之間的數字,然後告知使否有猜對 player = int(input('請猜一個1~5之間的數字:')) # 遊戲邏輯 if player == a: print('猜對了') else: print('猜錯了') # 單行if寫法 print('猜對了' if player == a else '猜錯了, 答案是:', a) # f-string寫法 answer = '猜對了' if player == a else '猜錯了' print(f'{answer}, 答案是:{a}') ``` ## 迴圈 ``` a = 1 # 如果迴圈條件式都不會產生False, 則迴圈不會停下,稱為無窮迴圈 while a <= 10: # <--- 每次while迴圈裡面的程式碼全部執行完後會回到這個地方重新執行條件式,如果成立會再次執行while內程式碼 print(a) a += 1 # 迴圈美執行一次, a就會被加1 print('迴圈結束') ``` #### 迴圈取出list資料並加總 ```python= a = [45, 63, 12, 8, 7] index = 0 total = 0 # 存總和用 while index < len(a): print(a[index]) total += a[index] # total = total + a[index] index += 1 print(f'總和是: {total}') ``` #### 九九乘法表 ```python= # 2 x 1 = 2 # 2 x 2 = 4 # 2 x 3 = 6 # 2 x 4 = 8 # 2 x 5 = 10 # 2 x 6 = 12 # 2 x 7 = 14 # 2 x 8 = 16 # 2 x 9 = 18 index = 1 while index <= 9: print(f'2 x {index} = {2 * index}') index += 1 ``` #### 兩層迴圈 ```python= # 2 x 1 = 2 3 x 1 = 3 ... 9 x 1 = 9 # 2 x 2 = 4 3 x 2 = 6 ... 9 x 2 = 18 # 2 x 3 = 6 3 x 3 = 9 ... 9 x 3 = 27 # 2 x 4 = 8 3 x 4 = 12 ... 9 x 4 = 36 # 2 x 5 = 10 3 x 5 = 15 ... 9 x 5 = 45 # 2 x 6 = 12 3 x 6 = 18 ... 9 x 6 = 54 # 2 x 7 = 14 3 x 7 = 21 ... 9 x 7 = 63 # 2 x 8 = 16 3 x 8 = 24 ... 9 x 8 = 72 # 2 x 9 = 18 3 x 9 = 27 ... 9 x 9 = 81 index1 = 2 while index1 <= 9: index2 = 1 # 把index2重設為1, 否則內層迴圈只會跑一次 while index2 <= 9: # 外層迴圈次數 x 內層迴圈次數 print(f'{index1} x {index2} = {index1 * index2}') index2 += 1 index1 += 1 ``` #### break關鍵字,接受使用者輸入 ```python= # 寫一個程式,接收使用者輸入任意數量的整數,並將這些輸入存放到list # 當使用者想要結束輸入的時候,可以輸入quit來結束 user_input = [] # 建立一個空的list while True: user = input('請輸入一個整數:') if user == 'quit': break # 直接結束迴圈,即使下面還有程式碼 else: user_input.append( int(user) ) # 將轉型成數字的資料存到list內 print('輸入結束:', user_input) ``` #### 小小練習 寫一小遊戲,讓使用者猜1~5之間的數字,如果猜錯了,就讓使用者重新猜,一直到猜對了為止,結束後顯示使用者總共猜了幾次才猜對 ```python= # 寫一小遊戲,讓使用者猜1~5之間的數字,如果猜錯了,就讓使用者重新猜, # 一直到猜對了為止,結束後顯示使用者總共猜了幾次才猜對 import random # 引入亂數模組 a = random.randint(1, 5) # 產生1~5之間的隨機整數 num=0 while True: player = int(input('請猜一個1~5之間的數字:')) num+=1 # 次數加一 if player == a: print('猜對了') print(f'總共猜了{num}次') break else: print('猜錯了,請再輸入一次') ``` #### continue ```python= # continue: 當while迴圈內遇到continue指令時,會忽略剩下的程式碼,回到迴圈開頭重新判斷條件式後執行 a = [1, 2, 3, 4, 5] index = 0 while index < len(a): if a[index] == 3: index += 1 continue # 跳到迴圈開頭,進行下一次的條件式判斷 print(a[index]) index += 1 ``` #### 另一個continue的範例 ```python= # 使用者輸入任意數量的整數,然後在畫面上顯示使用者所有輸入小於60的數字 scores = [] # 輸入分數的迴圈 while True: s = input('請輸入學生分數:') if s == 'quit': break else: scores.append( int(s) ) print('所有的學生分數: ', scores) index = 0 while index < len(scores): if scores[index] >= 60: index += 1 continue print(scores[index]) index += 1 ``` ## for-in迴圈 ```python= # for-in 迭代迴圈 (從群集資料中一筆一筆取出資料) a = [3, 4, 7, 9] # len() total = 0 for n in a: # for-in迴圈會從a變數裡面取出每一筆資料,每次取出的資料會放在變數n裡面 total += n print('總和:', total) # 1. 如果迴圈的執行次數可以預測,通常會用for-in迴圈 # 2. 如果迴圈次數無法預測,通常會選用while迴圈 ``` #### for-in練習 ```python= # 使用for-in迴圈,將[34, 87, 66, 99, 103, 21, 6, 3]的偶數跟奇數分別加總後顯示出來 a = [34, 87, 66, 99, 103, 21, 6, 3] even = 0 odd = 0 for n in a: if n % 2 == 0: even += n else: odd += n print(f'偶數總和: {even}') print(f'奇數總和: {odd}') ``` #### range()方法可以產生連續數字 ```python= # range(start預設為0,end但不包含,step預設為1) 產生連續數字 a = list( range(5) ) # end = 5 print(a) print( list( range(1, 6) ) ) print( list( range(1, 6, 2) ) ) for n in range(0, 10): print(n) ``` #### 練習 ```python= # 寫一程式,在畫面上顯示2~10每個數字的平方 for i in range(2, 11): print(i * i) ``` #### for comperhension ```python= # 將 [9, 3, 5, 6, 11, 12] 內資料乘上10倍之後存到一個新的list後,將該list顯示到畫面上 # 例如輸出為: [90, 30, 50, 60, 110, 120] # new_list = [] # for n in [9, 3, 5, 6, 11, 12]: # new_list.append(n * 10) new_list = [ n * 10 for n in [9, 3, 5, 6, 11, 12] ] print(new_list) ``` #### for comperhension + 單行if ```python= # 將 [9, 3, 5, 6, 11, 12] 內小於10的數字平方後存成新的list # new_list = [] # for n in [9, 3, 5, 6, 11, 12]: # if n < 10: # new_list.append(n ** 2) new_list = [n ** 2 for n in [9, 3, 5, 6, 11, 12] if n < 10] print(new_list) ``` ## 剪刀石頭布 ```python= import random SCISSORS = 0 # 代表剪刀 STONE = 1 # 石頭 PAPER = 2 # 布 data = {0: '剪刀', 1: '石頭', 2: '布'} pc = random.randint(0, 2) # 電腦出拳 print(f'電腦出了: {data[pc]}') player = int(input('請猜拳(0=剪刀, 1=石頭, 2=布): ')) # 玩家出拳 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= # 開發一個猜數字遊戲,玩法為: # - 從0~9之間隨機四個數字組合成一個四位數的數字(每個數字不會重複) # - 讓使用者猜這四個數字,直到猜中為止,並記錄總共猜了幾次 # - 當使用者猜測時,如果該數字存在答案中,但位置不同,每猜到一個就以1B來告知,例如: 1234(答案), 猜0912的話為: 2B # - 當使用者猜測時,如果數字有在答案中,且位置一樣,就提供1A的提示,例如: 1234(答案), 猜1209的話為: 2A import random a = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] # 產生答案 random.shuffle(a) answer = a[0] + a[1] + a[2] + a[3] print(f'答案:{answer}') guess_count = 0 # 紀錄猜了幾次 while True: player = input('請猜一個四位數的數字,數字不可重複:') guess_count += 1 # 次數加一 # 檢查是否為四個數字 if len(player) != 4: print('數字只能四個,請重新輸入') continue # 檢查是否為四個不重複的數字 if len(set(player)) < 4: print('數字不可重覆, 請重新輸入') continue if answer == player: # 猜對了,結束遊戲 break how_many_A = 0 how_many_B = 0 if answer[0] == player[0]: how_many_A += 1 if answer[1] == player[1]: how_many_A += 1 if answer[2] == player[2]: how_many_A += 1 if answer[3] == player[3]: how_many_A += 1 if player[0] in answer and player[0] != answer[0]: how_many_B += 1 if player[1] in answer and player[1] != answer[1]: how_many_B += 1 if player[2] in answer and player[2] != answer[2]: how_many_B += 1 if player[3] in answer and player[3] != answer[3]: how_many_B += 1 print(f'{how_many_A}A{how_many_B}B, 請繼續猜, 已經猜了{guess_count}次') print(f'猜對了,總共猜了{guess_count}') ```