gpt4 book ai didi

python - 列表理解引发 RuntimeError

转载 作者:行者123 更新时间:2023-12-03 21:47:12 26 4
gpt4 key购买 nike

为什么这段代码运行良好并且不抛出异常?

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 中引入的功能,而不是错误。每 PEP-479 , RuntimeError当出现 StopIteration 时故意加注从生成器内部引发,因此基于生成器的迭代现在只能在生成器返回时停止,此时 StopIteration引发异常以停止迭代。
否则,在 Python 3.5 之前,StopIteration在生成器中任何地方引发的异常将停止生成器而不是传播,以便在以下情况下:

a = list(F(x) for x in xs)
a = [F(x) for x in xs]
如果 F(x),前者会得到截断的结果引发 StopIteration在迭代过程中的某个时刻出现异常,这使得调试变得困难,而后者会传播从 F(x) 引发的异常。 .该功能的目标是使两个语句的行为相同,这就是更改影响生成器但不影响列表推导式的原因。

关于python - 列表理解引发 RuntimeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63927694/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com