在 python 中为 i 调用 next(iter) 是否支持?



问题:Python 列表迭代器行为和 next(迭代器)记录了调用的事实

for i in iter:
...
next(iter)

具有在 for 循环中向前跳过的效果。 这是我可以依赖的定义行为(例如在某些 PEP 中),还是仅仅是可以在没有警告的情况下更改的实施事故?

这取决于iter是什么。如果它是在可迭代对象上调用iter()创建的迭代器,那么是的,调用next(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异常添加异常处理;这很容易变得混乱。当然,您也可以使用默认值,例如 相反next(it, None),但这很快就会变得令人困惑,尤其是当您实际上没有将该值用于任何内容时。

一旦有人后来决定不使用迭代器,而是在 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 循环调用之前调用next(),则它具有跳过(下一个)项的效果。

因此,话虽如此,只要for调用相同的方法(next),您就可以在程序中实现这一点。

到目前为止,即使在3.6实施相同的内容。 所以,没有必要担心。

最新更新