在for循环体中使用迭代器是安全的和pythonic吗?

时间:2016-10-08 19:00:52

标签: python

在Python中做这样的事情(例如,在解析器中)是否安全?

iterator = iter(some_iterable)
for x in iterator:
    # do stuff with x
    if some_condition(x):
        y = next(iterator)
        # do stuff with y

我已经在Python 2和3中进行了测试,它完成了我的预期,但我想知道它是否真的安全,是否是惯用的。上面的代码应该等同于以下更冗长的替代方案:

iterator = iter(some_iterable)
while True:
    try:
        x = next(iterator)
    except StopIteration:
        break
    # do stuff with x
    if some_condition(x):
        y = next(iterator)
        # do stuff with y

1 个答案:

答案 0 :(得分:1)

基本上,跟踪您的异常并正确处理它们总是更好。但是在这种情况下,当你在while循环中调用for函数时,next()while循环之间的差异总是可能引发StopIteration异常,但是当您使用基于for调用次数的next()循环和您的迭代时,它可能会有所不同。

例如,在这种情况下,对于偶数次迭代,它不会引发异常,但它会产生异常。原因在于,即使是迭代数字,你的下一个也总是在for循环前面的一个项目,而对于赔率,它不是这样的。

In [1]: it = iter(range(4))

In [2]: for x in it:
   ...:     print(x)
   ...:     next(it)
   ...:     
0
2

In [3]: it = iter(range(3))

In [4]: for x in it:
            print(x)
            next(it)
   ...:     
0
2
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-4-1b3db7079e29> in <module>()
      1 for x in it:
      2             print(x)
----> 3             next(it)
      4 

StopIteration: