iT邦幫忙

2022 iThome 鐵人賽

DAY 12
0
自我挑戰組

人生苦短我用python寫出乾淨程式碼系列 第 12

Day12: Python常見誤解和陷阱

  • 分享至 

  • xImage
  •  

可以對迴圈中迭代串列新增或刪除項目嗎? 答案是盡量不要這麼做,因為可能會造成非預期之錯誤。
請思考如下情況,也請參考 https://autbor.com/addingloop 網站,查看這段程式碼視覺化。

clothes = ['skirt', 'red sock']
for clothing in clothes: # Iterate over the list.
	if 'sock' in clothing: # Find strings with 'sock'.
	   clothes.append(clothing) # Add the sock's pair.
	   print('Added a sock:', clothing) # Inform the user

此段程式在做迭代串列中每個字串項目,該字串若有出現"sock"時候就append該項目到串列中。但是此段程式會造成無窮迴圈,原因在於當您把"red sock" append進來時for迴圈進入下一次迭代判定該項目有"sock"字串,就會再append一次"red sock",同理下一輪又是如此因此造成無窮迴圈錯誤。
https://ithelp.ithome.com.tw/upload/images/20220912/20110042Dzi5E0YhrN.jpg
修正方法為獨立一個串列來進行新增修改的處理,也請參考https://autbor.com/addingloopfixed ,如範例使用newClothes串列來處理。
https://ithelp.ithome.com.tw/upload/images/20220912/20110042TrqEVH4lFe.jpg
上面的範例為新增項目,同理在迭代串列時不能從串列中刪除項目。請參考https://autbor.com/deletingloop/ 網站。
https://ithelp.ithome.com.tw/upload/images/20220912/20110042y96mjWjnAA.jpg
最終結果"yello"應該被刪除的,但是最後還是留在串列中。由於當for迴圈檢查所引2時從串列中刪除"mello",而原本"yello"從索引3變成2了此項目就被跳過。因此對迴圈中迭代串列不要對串列中項目做刪除。正確方法同樣為建立一個新串列來處理,請參考https://autbor.com/deletingloopfixed/
https://ithelp.ithome.com.tw/upload/images/20220912/20110042wDoBBFjB6c.jpg

參考資料:
python功力提升的樂趣 第8章


上一篇
Day11: Python中常見術語
下一篇
Day 13: Python程式的秘密
系列文
人生苦短我用python寫出乾淨程式碼22
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言