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