На этом шаге мы сравним эти две конструкции.
Как вы уже поняли, выражения-генераторы несколько напоминают включения в список:
>>> 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
Точно так же, как и с включением в список, он дает вам типовой шаблон в стиле "формы для печенья", который можно применять ко многим функциям-генераторам с целью их преобразования в сжатые выражения-генераторы.
На следующем шаге мы рассмотрим фильтрацию значений.