問:Python list iterator behavior and next(iterator)記載的事實,呼籲正在調用下一個(iter)裏面我在iter支持python?
for i in iter:
...
next(iter)
在擁有直接跳到for循環的效果。這是我可以依賴的定義行爲(例如,在某些PEP中),還是僅僅是一個可能在沒有任何警告的情況下更改的實施事故?
問:Python list iterator behavior and next(iterator)記載的事實,呼籲正在調用下一個(iter)裏面我在iter支持python?
for i in iter:
...
next(iter)
在擁有直接跳到for循環的效果。這是我可以依賴的定義行爲(例如,在某些PEP中),還是僅僅是一個可能在沒有任何警告的情況下更改的實施事故?
這取決於什麼iter
是。如果是在一個可迭代,然後是,調用next(iter)
也將推進迭代器迭代與iter()
調用創建:
>>> it = iter(range(4))
>>> for x in it:
print(x)
_ = next(it)
0
2
重要的是,it
是迭代(而不是僅僅任何可迭代)因爲for循環內部也會在該對象上調用iter()
。由於迭代器(通常)在調用iter(some_iterator)
時會自行返回,因此這可以正常工作。
這是個好主意嗎?一般不會,因爲它可以輕鬆突破:
>>> it = iter(range(3))
>>> for x in it:
print(x)
_ = next(it)
0
2
Traceback (most recent call last):
File "<pyshell#21>", line 3, in <module>
_ = next(it)
StopIteration
您必須添加異常處理的StopIteration
例外手動內循環;而且很容易變得凌亂。當然,你也可以使用默認值,例如相反,它會變得很混亂,特別是當你沒有實際使用這個值時。
這整個概念也儘快打破有人後來決定不使用迭代器,但在其他一些迭代for循環(例如因爲它們重構代碼使用列表那裏,然後一切休息)。
您應該嘗試讓for循環成爲唯一使用迭代器的循環。更改您的邏輯,以便您可以輕鬆確定是否應該跳過迭代:如果可以,請在開始循環之前過濾可迭代的第一個。否則,使用條件的循環中跳過迭代(使用continue
):
>>> it = filter(lambda x: x % 2 == 0, range(3))
>>> for x in it:
print(x)
0
2
>>> it = range(3) # no need for an iterator here
>>> for x in it:
if x % 2 == 1:
continue
print(x)
0
2
在for循環中,它總是調用迭代項的next
。
如果您在接下來的循環調用之前調用next()
,那麼它會跳過(下一個)項目。
所以,據說,只要for
調用相同的方法(下一步),你可以在你的程序中實現這一點。
到目前爲止,即使在3.6
也一樣實施。所以,沒有必要擔心。
在你的榜樣'範圍(0,3,2)'就足夠了 –
@Chris_Rands呀,我不想依靠'range()'功能雖然。我的觀點是,這些方式可以與任何類型的迭代一起工作。 – poke