Python內建函數iter()爲何會接收2個參數?

### 以下內容基於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種:

  1. 當第二個參數不存在, 第一個參數必須是支持迭代協議的容器類型對象,例如字典等, 或者是支持序列協議的序列類型對象,例如列表等,如果都不支持則報錯。
  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循環會終止。

以下是運行結果。看來的確是這樣的。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章