1
A
回答
2
不,它不安全。迭代器不是序列。下面是使用一臺發電機與foo()
功能的情況發生,這本身就是一個迭代器:
>>> foo(x for x in range(10))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in foo
ValueError: max() arg is an empty sequence
這是因爲迭代器已經在其結束時後sum()
完成自己的工作,所以max()
正從它沒有其他項目。通常,重置迭代器是不可能的,以便它可以再次循環。爲了使foo()
功能很好地支持迭代器,它必須通過保存的物品從iterator
重寫,這樣迭代通過循環只有一次,例如到一個臨時tuple
或list
:
def foo(iterator):
iterable = list(iterator)
return sum(iterable)/max(iterable)
,或者,如果iterator
產生了大量的項目,由仔細使用for
循環處理它:
def foo(iterator):
# allows iterables like lists or tuples to be passed as arguments
iterator = iter(iterator)
try:
max_ = next(iterator)
sum_ = max_
except StopIteration:
# iterator yields no items, return some default value
return 0.0
for element in iterator:
sum_ += element
max_ = max(max_, element)
return sum_/max_
這將產生正確的結果:
>>> foo(x for x in range(10))
5.0
+2
或者使用'itertools.tee'或將其轉換爲一個列表重用。 –
相關問題
- 1. rails每個迭代器迭代兩次
- 2. 爲什麼編譯器說我只能在MyList實現迭代時迭代迭代一個迭代的實例?
- 3. 在另一次迭代內迭代?
- 4. Jaydata .forEach只迭代50次
- 5. 下一次迭代
- 6. 迭代器的迭代器
- 7. Python - 運行代碼結束(迭代?)只能運行一次
- 8. 只能通過csv閱讀器迭代一次
- 9. 迭代HashMap的值只有一次
- 10. 嵌套while循環只迭代一次
- 11. ajax只執行第一次迭代
- 12. 嵌套for循環只迭代一次
- 13. 只執行DOM迭代一次
- 14. 只用一個迭代器迭代兩個列表Java
- 15. 第一次迭代時Hadoop迭代器跳過方法調用
- 16. 在CodedUI測試與多次迭代,只有最後一次迭代
- 17. 迭代器性能
- 18. 多次迭代的性能
- 19. 功能在每次迭代
- 20. 迭代層次
- 21. 每次迭代
- 22. 多次迭代
- 23. PHP - 迭代兩次泛型迭代
- 24. remove_if謂詞保證每個迭代器只能調用一次嗎?
- 25. 輸入迭代器+輸出迭代器+ X =前向迭代器
- 26. 每次兩個迭代器?
- 27. 迭代器適配器只迭代地圖中的值?
- 28. 迭代幾個可能的迭代器之一
- 29. TypeError:只能加入一個迭代python
- 30. 在Python中,如何迭代一個迭代器,然後迭代另一個迭代器?
真的很奇怪,沒有人回答過這個簡單的問題。那麼,下次我會嘗試更改我的搜索字詞。 – farsil
你的標題混淆了迭代器和迭代器,有些迭代器可以迭代多次(比如'lists') –
嗯,我明白了。我應該編輯標題,儘管問題被標記爲重複? – farsil