Найти - Пользователи
Полная версия: Лутц: код из книги не работает, не могу понять почему - хелп плиз! Тема - итераторы
Начало » Python для новичков » Лутц: код из книги не работает, не могу понять почему - хелп плиз! Тема - итераторы
1
pavelveng
Со страницы 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. не совсем разобрался, как работает редактор сообщений на форуме, не пинайте плиз ))
]
Rodegast
Это исключение возникает если в итераторе закончились данные. Просто лови его и завершай цикл.

 def myzip(*args):
    iters = list(map(iter, args))
    while True:
        try:
            yield tuple( next(i) for i in iters )
        except(StopIteration):
            break
pavelveng
Спасибо за ответ! К сожалению, попробовал этот код - он тоже вылетает!!!

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…

pavelveng
При этом я раз 10 проверил орфографию - глупых ошибок нет, опечаток нет.

Может ли это быть баг версии Python? Текущая версия 3.7.2 - среда - Atom Runner
Rodegast
Похоже что генераторы хреново со списочными выражениями работают:
 >>> 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)]
pavelveng
Rodegast
Похоже что генераторы хреново со списочными выражениями работают:
Данная версия работает! Ура! Спасибо за помощь!!!

P.S. А у Лутца похоже и правда опечатка… Странно, на оф сайте она не указана

This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB