2017-01-11 40 views

回答

2

这取决于什么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 
+0

在你的榜样'范围(0,3,2)'就足够了 –

+0

@Chris_Rands呀,我不想依靠'range()'功能虽然。我的观点是,这些方式可以与任何类型的迭代一起工作。 – poke

1

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

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

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

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

相关问题