Шаг 156.
Python: тонкости программирования. Циклы и итерации. Выражения-генераторы. Выражения-генераторы против включений в список

    На этом шаге мы сравним эти две конструкции.

    Как вы уже поняли, выражения-генераторы несколько напоминают включения в список:

>>> listcomp = ['Привет' for i in range(3)]
>>> genexpr = ('Привет' for i in range(3))

    Однако в отличие от включений в список выражения-генераторы не конструируют объекты-списки. Вместо этого они генерируют значения "точно в срок" подобно тому, как это сделал бы итератор на основе класса или функция-генератор.

    Присваивая выражение-генератор переменной, вы просто получите итерируемый "объект-генератор":

>>> listcomp
['Привет', 'Привет', 'Привет']
>>> genexpr
<generator object <genexpr> at 0x0000024B6EC5C350>

    Для того чтобы получить доступ к значениям, порожденным выражением-генератором, вам нужно вызвать с ним метод next() точно так же, как вы бы сделали с любым другим итератором:

>>> next(genexpr)
'Привет'
>>> next(genexpr)
'Привет'
>>> next(genexpr)
'Привет'
>>> next(genexpr)
Traceback (most recent call last):
.   .   .   .
StopIteration

    Как вариант, вы также можете вызвать функцию list() c выражением-генератором, в результате чего вы сконструируете объект-список, содержащий все произведенные значения:

>>> genexpr = ('Привет' for i in range(3))
>>> list(genexpr)
['Привет', 'Привет', 'Привет']

    Разумеется, это был всего лишь игрушечный пример, который показывает, как можно "преобразовывать" выражение-генератор (или любой другой итератор, если уж на то пошло) в список. Если же вам нужен объект-список прямо на месте, то в большинстве случаев вы с самого начала просто пишете включение в список.

    Давайте рассмотрим синтаксическую структуру этого простого выражения-генератора поближе. Шаблон, который вы должны увидеть, выглядит следующим образом:

genexpr = (expression for item in collection)

    Приведенный выше "образец" выражения-генератора соответствует следующей ниже функции-генератору:

def generator():
    for item in collection: 
        yield expression

    Точно так же, как и с включением в список, он дает вам типовой шаблон в стиле "формы для печенья", который можно применять ко многим функциям-генераторам с целью их преобразования в сжатые выражения-генераторы.

    На следующем шаге мы рассмотрим фильтрацию значений.




Предыдущий шаг Содержание Следующий шаг