为什么这段代码运行良好并且不抛出异常
def myzip(*args):
iters = [iter(arg) for arg in args]
try:
while True:
yield tuple([next(it) for it in iters])
except StopIteration:
return
for x, y, z in myzip([1, 2], [3, 4], [5, 6]):
print(x, y, z)
但是如果这条线
yield tuple([next(it) for it in iters])
取而代之
yield tuple(next(it) for it in iters)
然后一切都停止工作并抛出一个RuntimeError
这是Python 3.5中引入的一个特性,而不是一个bug。根据PEP-479,当从生成器内部引发
StopIteration
时RuntimeError
会被有意地重新引发,因此现在只有在生成器返回时才可以停止基于生成器的迭代,此时会引发StopIteration
异常以停止迭代否则,在Python 3.5之前,在生成器中任何位置引发的
StopIteration
异常将停止生成器,而不是传播,因此在以下情况下:如果
F(x)
在迭代过程中的某个时刻引发StopIteration
异常,那么前者将得到截断的结果,这使得调试变得困难,而后者将传播从F(x)
引发的异常。该特性的目标是使这两个语句的行为相同,这就是为什么更改会影响生成器而不会影响列表理解相关问题 更多 >
编程相关推荐