Найти - Пользователи
Полная версия: объясните как работает генератор
Начало » Python для новичков » объясните как работает генератор
1
Юрчек
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 выводится до – в первом цикле, а не во втором первой строкой.
Андрей Светлов
Первый цикл бежит, пока генератор iterit не закончится.
А чем этот генератор кончается?
Юрчек
Андрей Светлов
Первый цикл бежит, пока генератор iterit не закончится.
А чем этот генератор кончается?
Вроде начало доходить. правильно ли, что когда внутри iterit() кончился цикл, и значений для генератора больше нет. То на следующий запрос, значения питон обрабатывает строку print 10 и дальше возникает исключение StopIteration. То есть в конце функции-генератора можно отпустить ресурсы, мне например надо закрыть соединение с базой
regall
Юрчек
Вроде начало доходить.  правильно ли, что когда внутри iterit() кончился цикл, и значений для генератора больше нет. То на следующий запрос, значения питон обрабатывает строку print 10 и дальше возникает исключение StopIteration.
Оно само по себе не возникает, на это тонко намекал Андрей Светлов
py.user.next
возникает оно в конце функции

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
>>>
regall
py.user.next
возникает оно в конце функции
Ну дык правильно, о том и разговор, до конца тела генератора еще есть print, который и выполняется. Интерпретатор же не может магическим образом узнать, что программист добавил print, но хочет, чтобы StopIteration возник перед ним =)
py.user.next
похоже, что генератором он посчитал только цикл с yield
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