我有以下实验代码,其功能类似于内置的zip
.它试图做的事情应该简单明了,试图一次返回一个压缩元组,直到我们停止生成器时出现IndexError
.
def my_zip(*args):
i = 0
while True:
try:
yield (arg[i] for arg in args)
except IndexError:
raise StopIteration
i += 1
然而,当我试图执行以下代码时,IndexError
没有被捕获,而是被生成器抛出:
gen = my_zip([1,2], ['a','b'])
print(list(next(gen)))
print(list(next(gen)))
print(list(next(gen)))
IndexError Traceback (most recent call last)
I:\Software\WinPython-32bit-3.4.2.4\python-3.4.2\my\temp2.py in <module>()
12 print(list(next(gen)))
13 print(list(next(gen)))
---> 14 print(list(next(gen)))
I:\Software\WinPython-32bit-3.4.2.4\python-3.4.2\my\temp2.py in <genexpr>(.0)
3 while True:
4 try:
----> 5 yield (arg[i] for arg in args)
6 except IndexError:
7 raise StopIteration
IndexError: list index out of range
为什么会这样?
编辑:
感谢@thefourtheye为上面发生的事情提供了一个很好的解释.现在,当我执行时,另一个问题出现了:
list(my_zip([1,2], ['a','b']))
这条线再也回不来了,好像把机器挂起来了.现在发生了什么?