Python 迴圈的小技巧

Kiwi lee
5 min readJan 5, 2019

--

迴圈是所有程式語言都會有的函數,如何有效的操控它,協助程式的可讀性及效能,就是身為 Programmer 所該重視的事情。在 Python 中,可以直接針對陣列或字典來做元素的提取,不需要其他的語言,需要預先知道該元素的記憶體位址,相較起來方便了許多。

大綱

  1. 基礎的迴圈控制
  2. 迴圈的外掛器
  3. 最簡易的 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,依照自己的需求來好好應用吧!多寫多想多學,程式會越寫越上手的~

--

--