在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
答案 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: