# Генераторы, примеры, назначение.

Генераторы — это «ленивые» итераторы — функции, возвращающие следующий элемент тогда, когда он запрашивается. В генераторах запоминается точка выхода из функции и при следующем обращении работа функции продолжается с места выхода.

Для создания генераторов используют функции, содержащие в своем теле ключевое слово «yield» — такие функции возвращают объект-генератор.

```
def reverse(data):
    new_data = list(data)
    new_data.reverse()
    for item in new_data:
        yield item

>>> rev = reverse("string")
>>> rev
<generator object reverse at 0x7fa00b285aa0>
>>> [char for char in rev]
['g', 'n', 'i', 'r', 't', 's']
```

В генераторах списков можно использовать любые выражения Python.

С помощью генераторов списков можно легко отобразить один список в другой, применив некоторую функцию к каждому элементу.

```
>>> a_list = [1, 9, 8, 4]
>>> [elem * 2 for elem in a_list]
[2, 18, 16, 8]

>>> a_list
[1, 9, 8, 4]

>>> a_list = [elem * 2 for elem in a_list]
>>> a_list
[2, 18, 16, 8]
```

Генераторы множеств

```
>>> a_set = set(range(10))
>>> a_set
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

>>> {x ** 2 for x in a_set}
{0, 1, 4, 81, 64, 9, 16, 49, 25, 36}

>>> {x for x in a_set if x % 2 == 0}
{0, 8, 2, 4, 6}

>>> {2**x for x in range(10)}
{32, 1, 2, 4, 8, 64, 128, 256, 16, 512}
```
