问:Python list iterator behavior and next(iterator)记载的事实,呼吁正在调用下一个(iter)里面我在iter支持python?
for i in iter:
...
next(iter)
在拥有直接跳到for循环的效果。这是我可以依赖的定义行为(例如,在某些PEP中),还是仅仅是一个可能在没有任何警告的情况下更改的实施事故?
问:Python list iterator behavior and next(iterator)记载的事实,呼吁正在调用下一个(iter)里面我在iter支持python?
for i in iter:
...
next(iter)
在拥有直接跳到for循环的效果。这是我可以依赖的定义行为(例如,在某些PEP中),还是仅仅是一个可能在没有任何警告的情况下更改的实施事故?
这取决于什么iter
是。如果是在一个可迭代,然后是,调用next(iter)
也将推进迭代器迭代与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
例外手动内循环;而且很容易变得凌乱。当然,你也可以使用默认值,例如相反,它会变得很混乱,特别是当你没有实际使用这个值时。
这整个概念也尽快打破有人后来决定不使用迭代器,但在其他一些迭代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()
,那么它会跳过(下一个)项目。
所以,据说,只要for
调用相同的方法(下一步),你可以在你的程序中实现这一点。
到目前为止,即使在3.6
也一样实施。所以,没有必要担心。
在你的榜样'范围(0,3,2)'就足够了 –
@Chris_Rands呀,我不想依靠'range()'功能虽然。我的观点是,这些方式可以与任何类型的迭代一起工作。 – poke