Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 9, 2011 11:35:09

Юрчек
От:
Зарегистрирован: 2009-04-14
Сообщения: 45
Репутация: +  0  -
Профиль   Отправить e-mail  

объясните как работает генератор

def iterit():
for i in range(5):
yield i
print 10

def test_iter():
for i in iterit():
print i
print '--'
for i in iterit():
print i
Вывод test_iter()
0
1
2
3
4
10
--
0
1
2
3
4
10
Я не понимаю почему 10 выводится до – в первом цикле, а не во втором первой строкой.



Офлайн

#2 Фев. 9, 2011 11:57:32

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

объясните как работает генератор

Первый цикл бежит, пока генератор iterit не закончится.
А чем этот генератор кончается?



Офлайн

#3 Фев. 9, 2011 13:42:08

Юрчек
От:
Зарегистрирован: 2009-04-14
Сообщения: 45
Репутация: +  0  -
Профиль   Отправить e-mail  

объясните как работает генератор

Андрей Светлов
Первый цикл бежит, пока генератор iterit не закончится.
А чем этот генератор кончается?
Вроде начало доходить. правильно ли, что когда внутри iterit() кончился цикл, и значений для генератора больше нет. То на следующий запрос, значения питон обрабатывает строку print 10 и дальше возникает исключение StopIteration. То есть в конце функции-генератора можно отпустить ресурсы, мне например надо закрыть соединение с базой



Офлайн

#4 Фев. 9, 2011 13:43:13

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

объясните как работает генератор

Юрчек
Вроде начало доходить.  правильно ли, что когда внутри iterit() кончился цикл, и значений для генератора больше нет. То на следующий запрос, значения питон обрабатывает строку print 10 и дальше возникает исключение StopIteration.
Оно само по себе не возникает, на это тонко намекал Андрей Светлов



Офлайн

#5 Фев. 10, 2011 05:40:45

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

объясните как работает генератор

возникает оно в конце функции

http://python.org/dev/peps/pep-0255/

. Each time the .next() method of a generator-iterator is invoked, the
code in the body of the generator-function is executed until a yield
or return statement (see below) is encountered, or until the end of
the body is reached.
>>> def f():
... if False:
... yield 1
... print('a')
...
>>> for i in f():
... print(i)
...
a
>>>



Отредактировано (Фев. 10, 2011 05:42:26)

Офлайн

#6 Фев. 10, 2011 11:27:26

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

объясните как работает генератор

py.user.next
возникает оно в конце функции
Ну дык правильно, о том и разговор, до конца тела генератора еще есть print, который и выполняется. Интерпретатор же не может магическим образом узнать, что программист добавил print, но хочет, чтобы StopIteration возник перед ним =)



Офлайн

#7 Фев. 11, 2011 04:54:02

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

объясните как работает генератор

похоже, что генератором он посчитал только цикл с yield



Отредактировано (Фев. 11, 2011 04:54:50)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version