Форум сайта python.su
Со страницы 582 Учим Python Лутца. Сделал все как в книге, по непонятной причине не работает
[ a = [1,2,3] b = [2,4,5] # списки написал я, т.к. в оригинальном примере только функция, без аргументов и вызова # def myzip(*args): iters = list(map(iter, args)) # python 3, поэтому list() - все как в книге while iters: res = [next(i) for i in iters] yield tuple(res) # print(list(myzip(a,b))) # #Возвращается с ошибкой: Traceback (most recent call last): File "D:\Development\Programs\Simplest\iter_map.py", line 20, in myzip res = [next(i) for i in iters] # ��� ������� i-�� �������� iters ��������� next - res - ������ �������� ������������ next() File "D:\Development\Programs\Simplest\iter_map.py", line 20, in <listcomp> res = [next(i) for i in iters] # ��� ������� i-�� �������� iters ��������� next - res - ������ �������� ������������ next() StopIteration # The above exception was the direct cause of the following exception: # Traceback (most recent call last): File "D:\Development\Programs\Simplest\iter_map.py", line 30, in <module> print(list(myzip(a,b))) RuntimeError: generator raised StopIteration # #Решил разобраться, откуда SopIterations и модифицировал код: # a = [1,2,3] b = [2,4,5] # def myzip(*args): iters = list(map(iter, args)) while iters: res = [next(i) for i in iters] yield tuple(res) c = myzip(a,b) print(c) print(next(c)) print(next(c)) print(next(c)) # #Возвращает без ошибки (логично, так как в массивах по 3 элемента, следующий next вызовет ошибку): # <generator object myzip at 0x03A281F0> (1, 2) (2, 4) (3, 5) # #Очевидно, что то не так с условием while - переписал # while iters: -> while all(iters) #но это не помогло # #Буду очень благодарен, если кто то поможет мне понять, что именно пошло не так, и почему такой #пример в книге. Это опечатка, или это что-то связанное с версиями, или где-то я накосячил? # #P.S. не совсем разобрался, как работает редактор сообщений на форуме, не пинайте плиз )) ]
Отредактировано pavelveng (Фев. 11, 2019 13:29:24)
Офлайн
Это исключение возникает если в итераторе закончились данные. Просто лови его и завершай цикл.
def myzip(*args): iters = list(map(iter, args)) while True: try: yield tuple( next(i) for i in iters ) except(StopIteration): break
Офлайн
Спасибо за ответ! К сожалению, попробовал этот код - он тоже вылетает!!!
Traceback (most recent call last):
File “D:\Development\Programs\Simplest\forum_help.py”, line 8, in <genexpr>
yield tuple(next(i) for i in iters)
StopIteration
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File “D:\Development\Programs\Simplest\forum_help.py”, line 12, in <module>
print(list(myzip(a,b)))
File “D:\Development\Programs\Simplest\forum_help.py”, line 8, in myzip
yield tuple(next(i) for i in iters)
RuntimeError: generator raised StopIteration
Я не понимаю, почему не работает ни перехват исключений, ни инструкция While, которая должна получить False…
Офлайн
При этом я раз 10 проверил орфографию - глупых ошибок нет, опечаток нет.
Может ли это быть баг версии Python? Текущая версия 3.7.2 - среда - Atom Runner
Офлайн
Похоже что генераторы хреново со списочными выражениями работают:
>>> def myzip(*args): ... iters = list(map(iter, args)) ... while True: ... try: ... yield tuple([ next(i) for i in iters ]) ... except(StopIteration): ... break ... >>> list(myzip([1,2,3], [4,5,6])) [(1, 4), (2, 5), (3, 6)]
Офлайн
RodegastДанная версия работает! Ура! Спасибо за помощь!!!
Похоже что генераторы хреново со списочными выражениями работают:
Отредактировано pavelveng (Фев. 11, 2019 17:07:39)
Офлайн