Ответ 1
То, что вы указываете, - это Generator
в Python. Взгляните на: -
- http://wiki.python.org/moin/Generators
- http://www.python.org/dev/peps/pep-0255/
- http://docs.python.org/whatsnew/2.5.html#pep-342-new-generator-features
См. документацию: - Generator Expression
, которая содержит точно такой же пример, который вы опубликовали
Из документации: -
Генераторы - это простой и мощный инструмент для создания итераторов. Oни записываются как обычные функции, но используют оператор yield когда они хотят вернуть данные. Каждый раз, когда вызывается next(), генератор возобновляется там, где он оставлен (он запоминает все значения данных и какая заявка была выполнена в последний раз)
Генераторы похожи на List Comprehension
, которые вы используете с square brackets
вместо brackets
, но они более эффективны с точки зрения памяти. Они не возвращают полный результат list
в то же время, но возвращают объект-генератор. Всякий раз, когда вы вызываете next()
объекта Generator
, генератор использует yield
для возврата следующего значения.
List Comprehension
для вышеуказанного кода будет выглядеть так: -
[x * x for x in range(10)]
Вы также можете добавить условия для фильтрации результатов в конце for.
[x * x for x in range(10) if x % 2 != 0]
Это вернет список numbers
, умноженный на 2 в диапазоне от 1 до 5, если число не делится на 2.
Примером Generators
, изображающим использование yield
, может быть: -
def city_generator():
yield("Konstanz")
yield("Zurich")
yield("Schaffhausen")
yield("Stuttgart")
>>> x = city_generator()
>>> x.next()
Konstanz
>>> x.next()
Zurich
>>> x.next()
Schaffhausen
>>> x.next()
Stuttgart
>>> x.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
Итак, вы видите, что каждый вызов next()
выполняет следующий yield()
в Generator
. и в конце он бросает StopIteration
.