这取决于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 循环成为唯一使用迭代器的循环。更改您的逻辑,以便您可以轻松确定是否应跳过迭代:如果可以,在开始循环之前过滤可迭代的first。否则,使用条件来跳过循环内的迭代(使用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