Уведомления

Группа в Telegram: присоединиться

#1 Фев. 11, 2019 13:06:11

pavelveng
Зарегистрирован: 2019-02-11
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Лутц: код из книги не работает, не могу понять почему - хелп плиз! Тема - итераторы

Со страницы 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)

Офлайн

#2 Фев. 11, 2019 13:52:57

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 1973
Репутация: +  133  -
Профиль   Отправить e-mail  

Лутц: код из книги не работает, не могу понять почему - хелп плиз! Тема - итераторы

Это исключение возникает если в итераторе закончились данные. Просто лови его и завершай цикл.

 def myzip(*args):
    iters = list(map(iter, args))
    while True:
        try:
            yield tuple( next(i) for i in iters )
        except(StopIteration):
            break



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#3 Фев. 11, 2019 14:39:13

pavelveng
Зарегистрирован: 2019-02-11
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Лутц: код из книги не работает, не могу понять почему - хелп плиз! Тема - итераторы

Спасибо за ответ! К сожалению, попробовал этот код - он тоже вылетает!!!

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…

Офлайн

#4 Фев. 11, 2019 14:49:27

pavelveng
Зарегистрирован: 2019-02-11
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Лутц: код из книги не работает, не могу понять почему - хелп плиз! Тема - итераторы

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

Может ли это быть баг версии Python? Текущая версия 3.7.2 - среда - Atom Runner

Офлайн

#5 Фев. 11, 2019 16:11:16

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 1973
Репутация: +  133  -
Профиль   Отправить e-mail  

Лутц: код из книги не работает, не могу понять почему - хелп плиз! Тема - итераторы

Похоже что генераторы хреново со списочными выражениями работают:

 >>> 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)]



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#6 Фев. 11, 2019 16:55:43

pavelveng
Зарегистрирован: 2019-02-11
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Лутц: код из книги не работает, не могу понять почему - хелп плиз! Тема - итераторы

Rodegast
Похоже что генераторы хреново со списочными выражениями работают:
Данная версия работает! Ура! Спасибо за помощь!!!

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

Отредактировано pavelveng (Фев. 11, 2019 17:07:39)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version