迴圈是所有程式語言都會有的函數,如何有效的操控它,協助程式的可讀性及效能,就是身為 Programmer 所該重視的事情。在 Python 中,可以直接針對陣列或字典來做元素的提取,不需要其他的語言,需要預先知道該元素的記憶體位址,相較起來方便了許多。
大綱
- 基礎的迴圈控制
- 迴圈的外掛器
- 最簡易的 yield
基礎的迴圈控制
先從最簡單的 for-loop 迴圈開始,以下使用最簡單的 range()
來做範例。
Example:
for i in range(5):
print(i)0
1
2
3
4
Break
- 遇到
break
,直接跳離目前迴圈。 - 當你執行到一半,達成某個條件後,就想跳開目前的迴圈,不想再繼續做下去,這時就該用
break
了啊。可節省跑完整迴圈的時間,優化效能。 - 有時會配上 while 無限迴圈,當達成某個條件時,例如等待使用者輸入正確的字串,這時就可以用。
Example:
for i in range(5):
if i>3:
break
print(i)0
1
2
3
Continue
- 遇到
continue
,目前執行的迴圈將會忽略接下來的程式碼,直接開始下一個迴圈。 - 相較
break
的找到就停止,continue
可更著重在特別的項目。像是一串數列,但只針對偶數來做特殊的處理,奇數則保持不變。
Example:
for i in range(5):
if i==3:
continue
print(i)0
1
2
4
Else
- 如果迴圈全部都跑完,則進入
else
的區塊。其中若是有break
先跳掉,則不會進入 - 通常會搭配
break
一起使用。若是全部的迴圈皆跑完,仍找不到需求的,即進入特殊情況(else)的感覺
Example:
for i in range(4):
for x in range(1):
if (i+x)%2:
print('(i+x)mod2 = (%d+%d)mod2 != 0' %(i,x))
break
else:
print('(i+x)mod2 = (%d+%d)mod2 = 0' %(i,x))(i+x)mod2 = (0+0)mod2 = 0
(i+x)mod2 = (1+0)mod2 != 0
(i+x)mod2 = (2+0)mod2 = 0
(i+x)mod2 = (3+0)mod2 != 0
Pass
- 不算是迴圈的特殊使用,但很實用,因此拿來講解。
- 不含任何意義的程式碼,通常會用在函數或是迴圈中,當做墊檔的程式碼,避免因函數或迴圈中沒有任何的程式碼,而你又真的暫時沒有要做什麼事時。
Example:
>>> if True:
... print('pass')<b>SyntaxError: unexpected EOF while parsing</b>
--------------------------------------------------->>> if True:
... pass
... print('pass')pass
迴圈的外掛器
外掛器,輔助迴圈的工具,這邊簡單帶到一些本人常用的
enumerate
enumerate(iterator, start=0)
- 迴圈的計數器,在每次的迴圈中,回傳目前的次數。可設定次數的起始值,預設為 0
- 通常用在記錄目前進行的迴圈次數,配上總迴圈次數,可做為進度條使用。
Example:
預設從 0 開始 index
>>> lst = ['a', 'b', 'c', 'd']
>>> for idx, element in enumerate(lst):
... print(idx, element)
...
0 a
1 b
2 c
3 d
可自行設定 index 的起始值
>>> lst = ['a', 'b', 'c', 'd']
>>> for idx, element in enumerate(lst, 1):
... print(idx, element)
...
1 a
2 b
3 c
4 d
zip
- 困擾在一次只能迴圈一個物件嗎? 那
zip
就是最好的東西,協助你一次取多樣物件進入迴圈! - 會以最短的物件做為終止條件,不限兩個物件,可無限多個喔~
Example:
>>> a = list(range(3))
>>> b = ['a', 'b', '3', 'c']
>>> for i, j in zip(a, b):
... print(i, j)
...
0 a
1 b
2 3
最簡易的 yield
這一塊算是延伸迴圈的功能,或是該定義為 generator,一個不斷產出物件的產生器。通常自製的產生器,常使用 yield 做為回傳值,但這篇不會講究太多,因為這塊可以延伸非常多的內容。
有興趣可以參考書籍 流暢的 Python|清晰、簡潔、有效的程式設計 (Fluent Python)
- 透過 yield 來回傳數值,一次一個項目,當有需要時才開始準備下一項
- 因有需要時才準備,所以可以減緩一次要做完的情況
- 配合上參數及回傳值,可以客製化迴圈的次數
Example:
>>> def func():
... for i in range(5):
... yield i
...
>>> for i in func():
... print(i)
...
0
1
2
3
4
5
簡單的客製化 yield function
>>> def func(n):
... for i in range(n):
... yield i
...
>>> for i in func(3):
... print(i)
...
...
0
1
2
3
結論
python 的 for 迴圈很好用,不論是 dict 的 keys, values, items 皆可配合迴圈使用,許多的資料型態都可以應用上。
但若是能綜合此篇所述的功能,可撰寫更易讀且更有效率的 python code,依照自己的需求來好好應用吧!多寫多想多學,程式會越寫越上手的~