2017-01-11 50 views

回答

2

這取決於什麼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 
+0

在你的榜樣'範圍(0,3,2)'就足夠了 –

+0

@Chris_Rands呀,我不想依靠'range()'功能雖然。我的觀點是,這些方式可以與任何類型的迭代一起工作。 – poke

1

在for循環中,它總是調用迭代項的next

如果您在接下來的循環調用之前調用next(),那麼它會跳過(下一個)項目。

所以,據說,只要for調用相同的方法(下一步),你可以在你的程序中實現這一點。

到目前爲止,即使在3.6也一樣實施。所以,沒有必要擔心。

相關問題