iT邦幫忙

2021 iThome 鐵人賽

DAY 4
1
AI & Data

網路爬蟲,萬物皆爬 - 30 天搞懂並實戰網路爬蟲及應對反爬蟲技術系列 第 4

【Day 04】- Python 條件判斷與迴圈

前情提要

在前一篇文章內容中帶大家跑過一次 Python 中的基礎操作與常見的資料型態的使用。也提供了大家一些額外的使用方法,若有自信的讀者能再去 Day3 看看歐。

開始之前

Day 3 帶大家使用了基本的資料結構跟對應的操作,但如果要重複的操作它們,總不可能就將那個操作重複寫很多行。如果說現在你的程式會走直線了,今天來帶各位條件判斷及迴圈,讓你的爬蟲程式多了岔路跟迴路。

若讀者學過其它類 C 的語言,都會知道它們都是以大括號來做程式區塊(block)分隔。在 python 中,是以縮排(indentation)來區分程式區塊(block),而縮排大約會使用 2~6 個空白,通常是 4 個空白,讀者也能按下鍵盤上的 Tab 來快速做出類似 4 個空白的效果(在 Vscode 預設下)。

條件判斷

python 中的條件判斷十分易懂,若讀者有撰寫過其他語言的條件判斷,可能會發現 else if 的語法在 python 下是 elif 。 在多種語言的條件判斷大部分都是 if-else 同時出現的,

  • if
'''
if 條件:
	符合條件後該做的事
'''

temperature = 39
if temperature >= 37.5:
	print('發燒')
  • if-else
'''
if 條件:
	符合條件後該做的事
else:
	不符合條件該做的事
'''

temperature = 36
if temperature >= 37.5:
	print('發燒')
else:
	print('正常')
  • if-elif-else
'''
if 條件1:
	符合 條件1 後該做的事
elif 條件2:
	符合 條件2 後該做的事
else:
	不符合 條件1 、 條件2 該做的事
'''

temperature = 53
if temperature >= 38:
	print('發燒')
elif 38 > temperature >= 37.5:
	print('輕微發燒')
else:
	print('正常')

迴圈

  • for loop

Python 中的 for loop 常會以 in 這個關鍵字同時出現。

range(start, stop[, step]) 這個函式會回傳一個可迭代對象,常與 for-loop 一同使用。

  • start 計數將從 start 開始,若不傳入則預設為 0。 ex. range(5) 會是從 0 到 4
  • stop 計數直到大於等於 stop,不包括大於等於 stop 的那個數。 ex. range(0, 4) 會是從 0 到 3
  • step 每次加上多少。 ex. range(0, 5, 2) 會是 0 2 4
'''
for 自訂變數 in 序列:
	該做的事
'''
seq = ['OwO', 'OAO', 'TwT', 'Orz']
for x in seq: #這邊代表每次照順序拿出 seq 這個串列的元素並賦予給 x
	print(x)
'''
OwO
OAO
TwT
Orz
'''

for i in range(len(seq)): #這邊 len(seq) 會回傳 seq 這個 list 的長度
	print(i, seq[i])
'''
0 OwO
1 OAO
2 TwT
3 Orz
'''
  • while loop
'''
while 若滿足條件則繼續:
	該做的事
'''

counter = 0
while counter < 5: # 將會重複執行直到 counter < 5 不成立,也就是當 counter = 5 那一刻
	counter += 1
	print(counter)
'''
1
2
3
4
5
'''

#請注意沒有設定好結束條件的 while-loop 是危險的,以下為錯誤示範
while True:  # 每次輸出完 SoS 後 while 的條件都會符合,也就會形成無限迴圈,直到 Python crash
	print('SoS')
'''
SoS
SoS
SoS
...
'''

迴圈控制

若想在迴圈執行到一半時,不做剩下要做的事並進到下一輪或是強制跳出迴圈,會需要使用到 continuebreak 指令。

  • continue

跳出本次迴圈,繼續進行下一輪迴圈

for i in range(10):
	if i % 2 == 0:  # i 對 2 取餘數若為 0 (偶數) 則 continue
		continue      # 不執行後續代碼,跳到下一輪迴圈
	print(i, end = ' ')

#Output: 1 3 5 7 9
  • break

強制中止並跳出離這個 break 最近的迴圈

cnt = 0
while True:
	if cnt > 7:   #若 i > 7
		break     #不執行後續代碼,並強制跳出迴圈
	cnt += 1
	print(i, end = ' ')

#Output: 1 2 3 4 5 6 7 8
  • pass

維持現狀。

讀者可能會疑惑若維持現狀,那就不寫就好,不理解 pass 存在的必要性。先前提到 Python 中的程式區塊(block) 是以縮排來定的,因此我們能想像若有一個 if 下方若未寫任何代碼將無法判斷這是一個程式區塊。實際上程式會報 IndentationError: expected an indented block 錯誤。

pass 常用來填充還沒想要實作功能的函式、條件判斷或迴圈等等,可以把它想成 #TODO 的概念。

for i in range(5):
	if i % 2 == 0:
		pass # 尚未撰寫功能
	print(i)

'''
0 
1 
2 
3 
4 
'''
#因尚未撰寫實際功能,因此未有任何條件判斷效果

else in a loop

與其他語言不同的, python 能在迴圈後放入 else ,代表著若迴圈正常執行完(沒有遭到 break 強制中止跳出)就會執行到 else 下方的語句,換句話說就是當不滿足迴圈的運行條件時會執行到 else。

for i in range(5):
	if i % 2 == 0:
		continue
	print(i)
else:
	print('結束印出偶數迴圈')

'''
1
3
結束印出偶數迴圈
'''

結語

今天跟讀者們介紹了 Python 中條件判斷與迴圈。事實上,Python 的迴圈有許多更簡潔的寫法,也能在單獨一行中與條件判斷做結合,這邊不與讀者說明怕新手在不熟悉的狀況下混淆,下面補充資料有附上述語法的文章。

明日內容

明天將會帶給大家字串的進階用法。這些用法在幾天之後的爬蟲實戰會起到很大的作用,在 Python 中也預設給了字串許多方便的操作。

補充資料

[Python教學]搞懂5個Python迴圈常見用法 : https://www.learncodewithmike.com/2019/12/python.html

【Python for 教學】for迴圈與單行的基本用法,新手值得推薦 : https://learn.markteaching.com/【python-for-教學】for迴圈與單行的基本用法/


上一篇
【Day 03】- Python 基礎操作與常見資料型態(整數、浮點數、布林值、字串、串列、元組、字典)
下一篇
【Day 05】- Python 字串操作(正規表達式 regexes 、原生基本操作)
系列文
網路爬蟲,萬物皆爬 - 30 天搞懂並實戰網路爬蟲及應對反爬蟲技術30

尚未有邦友留言

立即登入留言