### 以下內容基於Python 3.6
最近,閱讀Python官方多進程代碼時,在最後一個例子裏,發現了iter()函數還有這種用法:
def worker(input, output):
for func, args in iter(input.get, 'STOP'):
result = calculate(func, args)
output.put(result)
如代碼所示第二行,是對一個iter()函數生成的迭代器進行for循環,但爲何iter()可以接收2個參數?第二個參數是哪來的??
在閱讀了相關博客後發現,實際上iter()函數有兩種“迭代方式”,我們比較熟悉的只是其中一種,即傳入一個list或者dict,然後製造一個generator的這種用法。實際上它的使用方法有2種:
- 當第二個參數不存在, 第一個參數必須是支持迭代協議的容器類型對象,例如字典等, 或者是支持序列協議的序列類型對象,例如列表等,如果都不支持則報錯。
- 當第二個參數存在, 即哨兵參數存在,則第一個參數必須是可調用對象,即函數等,以此種方式創建的迭代器對象將會調用object,可調用對象參數調用時不需要參數,如果可調用對象調用後返回值與哨兵對象值相同, 則結束調用。
對第二種用法進行一個小實驗:
import random as rd
def test():
choices = ['haha','man','good','NLP','STOP','doggie']
x = rd.choice(choices)
print("see what wee choose:【%s】"%x)
return x
for n in iter(test, 'STOP'):
print(n)
按照以上的解釋,當我們random.choice到單詞“STOP”的時候,由於哨兵參數(iter()的第二個參數)就是 STOP,從而iter生成的generator會結束迭代,for循環會終止。
以下是運行結果。看來的確是這樣的。