У меня есть следующий экспериментальный код, функция которого аналогична встроенному 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']))
Эта строка никогда не возвращается и, кажется, повесит машину. Что происходит сейчас?