60 lines
2.7 KiB
Markdown
60 lines
2.7 KiB
Markdown
|
---
|
|||
|
title: Generators
|
|||
|
localeTitle: Генераторы
|
|||
|
---
|
|||
|
## Генераторы
|
|||
|
|
|||
|
Генераторы - это особый тип функции, который позволяет возвращать значения без завершения функции. Он делает это, используя ключевое слово `yield` . Подобно `return` , выражение `yield` возвращает значение вызывающему. Ключевое различие между ними состоит в том, что `yield` приостанавливает функцию, позволяя в будущем возвращать больше значений.
|
|||
|
|
|||
|
Генераторы являются итерабельными, поэтому их можно использовать чисто для циклов или чего-либо еще, что итерации.
|
|||
|
|
|||
|
```python
|
|||
|
def my_generator():
|
|||
|
yield 'hello'
|
|||
|
yield 'world'
|
|||
|
yield '!'
|
|||
|
|
|||
|
for item in my_generator():
|
|||
|
print(item)
|
|||
|
|
|||
|
# output:
|
|||
|
# hello
|
|||
|
# world
|
|||
|
# !
|
|||
|
```
|
|||
|
|
|||
|
Как и другие итераторы, генераторы могут быть переданы `next` функции для извлечения следующего элемента. Когда генератор не имеет больше значений, `StopIteration` ошибка `StopIteration` .
|
|||
|
|
|||
|
```python
|
|||
|
g = my_generator()
|
|||
|
print(next(g))
|
|||
|
# 'hello'
|
|||
|
print(next(g))
|
|||
|
# 'world'
|
|||
|
print(next(g))
|
|||
|
# '!'
|
|||
|
print(next(g))
|
|||
|
# Traceback (most recent call last):
|
|||
|
# File "<stdin>", line 1, in <module>
|
|||
|
# StopIteration
|
|||
|
```
|
|||
|
|
|||
|
Генераторы особенно полезны, когда вам нужно создать большой набор значений, но им не нужно сохранять их все в памяти одновременно. Например, если вам нужно напечатать первые миллионы чисел фибоначчи, вы обычно возвращаете список из миллиона значений и перебираете список для печати каждого значения. Однако с генератором вы можете возвращать каждое значение по одному за раз:
|
|||
|
|
|||
|
```python
|
|||
|
def fib(n):
|
|||
|
a = 1
|
|||
|
b = 1
|
|||
|
for i in range(n):
|
|||
|
yield a
|
|||
|
a, b = b, a + b
|
|||
|
|
|||
|
for x in fib(1000000):
|
|||
|
print(x)
|
|||
|
```
|
|||
|
|
|||
|
### Больше информации
|
|||
|
|
|||
|
* [PEP 255](https://www.python.org/dev/peps/pep-0255/)
|
|||
|
* [Python Wiki](https://wiki.python.org/moin/Generators)
|
|||
|
* [Документация о выходе](https://docs.python.org/2/reference/simple_stmts.html#yield)
|