2015-03-03 2 views
0

я писал в интерпретатор Python сегодня:Почему этот код дает генератор?

>>> def test(): 
...  for c in ['a', 'b', 'c', 'd']: yield c 
... 
>>> a = test() 
>>> a 
<generator object test at 0x2556a00> 
>>> a.next() 
'a' 
>>> a.next() 
'b' 

Это было удивительно для меня. Должно ли test возвращать (или давать) один из элементов моего списка, а не генератор, который их дает?

Вторая функция, которая использует «возвращение» ведет себя, как и ожидалось:

>>> def test2(): 
...  for i in ['a', 'b', 'c', 'd']: return i 
... 
>>> b = test2() 
>>> b 
'a' 
>>> b 
'a' 

Почему это так? Где в документации описывается это поведение?

+5

* Не следует проверять возврат (или выход) одного из элементов моего списка, а не генератора, который их дает? *. Нет, потому что тогда вы никогда не сможете получить еще один * независимый генератор, уступающий предметы отдельно. –

+1

Документация: https://docs.python.org/2/reference/expressions.html#yield-expressions –

+1

Возможно, вы захотите посмотреть на этот знаменитый вопрос, также спрашивающий о выходе: http://stackoverflow.com/questions/231767/what-do-the-yield-keyword-do-in-python – SmCaterpillar

ответ

-4

Поскольку ваш доход вложен в цикл for, все ваши значения будут добавлены к выражению генератора. Генераторы в основном эквивалентны итераторам, за исключением того, что итераторы сохраняют значения, если они не удалены, тогда как генераторы генерируют значения один раз на лету. Следующий метод генератора неявно называется способом, который используется в цикле for, а не в генераторе.

Кроме того, вы должны помнить, что ключевое слово return возвращает одно и только значение, которое дает. Функция возвращает один объект-генератор с выходом, который готов к генерации всех заданных значений. Стандартный возвращаемый оператор возвращает значение и выходит из функции, так что другие значения не возвращаются.

+3

-100 Это полная глупость. Итератор - это просто объект с методом '__next __()'. Итераторы делают ** не ** "сохраняют значения, если они не удалены", что бы это ни значило. И оператор 'yield' не возвращает объект-генератор, он превращает функцию в функцию генератора. – augurar

+0

Я не знаю, что вы имеете в виду, когда функция превращается во что-то другое. –

+0

Любое определение функции, содержащее оператор 'yield', интерпретируется как функция генератора. Это не оператор 'yield', который возвращает объект-генератор. – augurar