python 是否支持在 i 中调用 next(iter) inside?
Is calling next(iter) inside for i in iter supported in python?
问题:Python list iterator behavior and next(iterator)记录调用
的事实
for i in iter:
...
next(iter)
具有在for循环中向前跳转的效果。这种定义的行为是我可以依赖的(例如,在某些 PEP 中)还是仅仅是一个可以在没有警告的情况下改变的实施事故?
在for循环中,总是调用迭代项的next
。
如果您在 for 循环调用 next 之前调用 next()
,则它具有跳过(下一个)项目的效果。
因此,话虽这么说,只要 for
调用相同的方法(下一个),您就可以在程序中实现它。
到目前为止,即使在 3.6
中也是如此。所以,不用担心。
这取决于iter
是什么。如果它是一个 迭代器 通过对可迭代对象调用 iter()
创建的,那么是的,调用 next(iter)
也会推进迭代器:
>>> it = iter(range(4))
>>> for x in it:
print(x)
_ = next(it)
0
2
重要的是 it
是一个 迭代器 (而不是任何可迭代对象),因为 for 循环在内部也会调用该对象的 iter()
。由于在调用 iter(some_iterator)
时迭代器(通常)return 本身,因此工作正常。
这是个好主意吗?一般不会,因为它很容易坏:
>>> 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
问题:Python list iterator behavior and next(iterator)记录调用
的事实for i in iter:
...
next(iter)
具有在for循环中向前跳转的效果。这种定义的行为是我可以依赖的(例如,在某些 PEP 中)还是仅仅是一个可以在没有警告的情况下改变的实施事故?
在for循环中,总是调用迭代项的next
。
如果您在 for 循环调用 next 之前调用 next()
,则它具有跳过(下一个)项目的效果。
因此,话虽这么说,只要 for
调用相同的方法(下一个),您就可以在程序中实现它。
到目前为止,即使在 3.6
中也是如此。所以,不用担心。
这取决于iter
是什么。如果它是一个 迭代器 通过对可迭代对象调用 iter()
创建的,那么是的,调用 next(iter)
也会推进迭代器:
>>> it = iter(range(4))
>>> for x in it:
print(x)
_ = next(it)
0
2
重要的是 it
是一个 迭代器 (而不是任何可迭代对象),因为 for 循环在内部也会调用该对象的 iter()
。由于在调用 iter(some_iterator)
时迭代器(通常)return 本身,因此工作正常。
这是个好主意吗?一般不会,因为它很容易坏:
>>> 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