對於在for
聲明發電機使用break
的一個元素採摘的最後一個元素後拋出的異常,或list(itertools.islice(gen, 1))
根據你的榜樣(你可以這樣做:
while True:
...
if something:
for my_element in myfunct():
dostuff(my_element)
break
else:
do_generator_empty()
如果你想「得到理由從 [一旦產生] 發生器每當我喜歡「t的一個元件(I假設50%這就是初衷,和最常見的意圖),那麼:
gen = myfunct()
while True:
...
if something:
for my_element in gen:
dostuff(my_element)
break
else:
do_generator_empty()
這種方式顯式使用的generator.next()
可以是避免,並且輸入結束處理不需要(神祕的)異常處理或額外的默認值比較。
的for
語句部分僅在需要在發生器結束時做一些特殊的事情時才需要。在next()
/.next()
注:
在Python3的.next()
方法更名爲.__next__()
有很好的理由:它被認爲是低級別(PEP 3114)。在Python 2.6之前,內置函數next()
不存在。甚至還有人討論將next()
轉移到operator
模塊(這將是明智的),因爲它很少需要和可疑的內置名稱通脹。
沒有默認使用next()
仍然是非常低級的做法 - 在正常的應用程序代碼中,像普通應用程序代碼中的螺栓一樣拋出神祕的StopIteration
。並且使用next()
與默認定點 - 最好應該是直接在builtins
中的next()
的唯一選項 - 是有限的,並且經常給出奇怪的非pythonic邏輯/可讀性的原因。底線:使用next()應該是非常罕見的 - 就像使用operator
模塊的函數一樣。使用for x in iterator
,islice
,list(iterator)
和其他無縫接受迭代器的函數是在應用程序級別上使用迭代器的自然方式 - 而且總是可能的。 next()
是低級的,一個額外的概念,不明顯 - 正如這個線程的問題所示。雖然例如在for
中使用break
是常規的。
來源
2016-02-12 18:48:10
kxr
請注意,只有在g中的最後一項提供後嘗試使用g.next()時,它纔會引發StopIteration。 – Wilduck 2011-01-19 22:11:08
`next(gen,default)`也可以用來避免`StopIteration`異常。例如,對於一個字符串生成器,`next(g,None)`在迭代完成後將產生一個字符串或None。 – Attila 2013-03-06 14:18:08
在Python 3000中,next()是__next __() – 2014-04-10 02:52:09