Выражения-генераторы в Python с примерами
В этом уроке вы узнаете о выражениях-генераторах в Python для создания объекта-генератора.
- Что такое выражения-генераторы в Python?
- Сравнение выражения-генератора и понимания списка
- 1) Синтаксис
- 2) Использование памяти
- 3) Iterable или iterator
Что такое выражения-генераторы в Python?
Выражение-генератор в Python — это выражение, которое возвращает объект-генератор. По сути, функция-генератор — это функция, которая содержит оператор доходности и возвращает объект-генератор.
Например, следующее определяет функцию-генератор:
def squares(length): for n in range(length): yield n ** 2
Функция генератора квадратов возвращает объект-генератор, который создает квадраты целых чисел от 0 до длины — 1.
Поскольку объект-генератор является итератором, вы можете использовать цикл for для перебора его элементов:
for square in squares(5): print(square)
Выход:
0 1 4 9 16
Выражение-генератор предоставляет вам более простой способ вернуть объект-генератор.
В следующем примере определяется выражение-генератор, которое возвращает квадраты целых чисел от 0 до 4:
squares =(n** 2 for n in range(5))
Поскольку квадраты являются объектом-генератором, вы можете перебирать его элементы следующим образом:
for square in squares: print(square)
Как видите, вместо использования функции для определения функции-генератора вы можете использовать выражение-генератор.
Генераторное выражение похоже на понимание списка с точки зрения синтаксиса. Например, оно также поддерживает сложные синтаксисы, включая:
- оператор if
- несколько вложенных циклов
- вложенные comprehensions.
Выражение-генератор использует круглые скобки() вместо квадратных скобок [].
Сравнение выражения-генератора и понимания списка
Ниже показано, как использовать list comprehension для генерации квадратов чисел от 0 до 4:
square_list = [n** 2 for n in range(5)]
А здесь определяется генератор квадратов чисел:
square_generator =(n** 2 for n in range(5))
1) Синтаксис
С точки зрения синтаксиса, выражение-генератор использует круглые скобки(), тогда как list comprehension использует квадратные скобки [].
2) Использование памяти
- Понимание списка возвращает список, а выражение-генератор возвращает объект-генератор. Это означает, что понимание списка заранее возвращает полный список элементов. Однако выражение-генератор возвращает список элементов по одному на основе запроса.
- Понимание списка является активным, тогда как выражение генератора является ленивым. Другими словами, понимание списка сразу создает все элементы и загружает их все в память. И наоборот, выражение-генератор создает один элемент на основе запроса. Он загружает в память только один элемент.
3) Iterable или iterator
- Понимание списка возвращает итерируемый объект. Это означает, что вы можете перебирать результат понимания списка снова и снова.
- Выражение-генератор возвращает итератор, особенно ленивый итератор. Это становится утомительно, когда вы завершаете итерацию.