在python中支持的it中调用next(iter)吗?

时间:2017-01-11 07:51:44

标签: python for-loop iterator next pep

问题:Python list iterator behavior and next(iterator)记录了调用

的事实
for i in iter:
    ...
    next(iter)

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

2 个答案:

答案 0 :(得分:3)

这取决于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

答案 1 :(得分:1)

在for循环中,它总是调用迭代项的next

如果你在接下来的循环调用之前调用next(),那么它就会跳过(下一个)项目。

所以,据说,只要for调用相同的方法(下一个),就可以在程序中实现这一点。

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