Рубрики
Без рубрики

Генераторы в Python [с простыми примерами]

Генераторы в Python являются мощными инструментами для создания пользовательских итераторов, которые можно использовать, где бы существует необходимость создавать последовательность объектов.

Автор оригинала: Pankaj Kumar.

Генераторы в Python [с простыми примерами]

Генераторы в Python являются мощными инструментами для создания пользовательских итераторов, которые можно использовать, где бы существует необходимость создавать последовательность объектов.

Предпосылки

Нам нужно знать два важных концепция, прежде чем продолжать с генераторами в Python.

1. Поttivable

ITERABLE – это объект, который возвращает итератор, если ИТЕР () называется на нем. Другими словами, объекты, которые являются последовательностью других объектов, обычно являются неверными. Рассмотрим пример:

numbers = list([1, 2, 3, 4])
for element in numbers:
    print(element)

Здесь Номер это последовательность целых чисел. Если ИТЕР () Вызывается на нем, он вернет « list_iterator », что является причиной того, что она может быть использована непосредственно в контуре. На самом деле, Список , Словарь , Установить , кортеж Все возможные классы.

Пример итератора

Теперь, когда у нас есть итератор на наших руках, что мы с этим делаем?

2. Итераторы

Итераторы являются объектами, которые либо возвращаются ИТЕР () (Как мы видели выше), или они могут быть сделаны программистом, используя генератор, который мы будем изучать в этом руководстве. У них есть три ключевых свойства:

  1. Они возвращают объект, когда Далее () называется на нем.
  2. Если нет объекта для возврата, он поднимет Заставка ошибка.
  3. Итерация происходит только один раз. Если у вас есть итератор для списка, который содержит пять чисел, а вы звонили Далее () Четыре раза, тогда вы можете позвонить только следующим еще раз, и после этого итератор бесполезно. То есть для перераспределения в течение одного и того же списка потребуется новый и свежий итератор.

Рассмотрим этот пример:

Следующий пример итератора

Что такое генераторы в Python?

Генераторы в Python являются функциями, которые создают итератор.

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

Создание функции генератора

Допустим, нам нужно создать первые 10 идеальных квадратов, начиная с 1. Это синтаксис:

def perfect_square():
    num = 1
    while(num <= 10):
        yield (num * num)
        num += 1

Давайте пройдемся по линии кода по строке:

  • Def Perfect_square () : Нормальное начало функционального блока.
  • Num : Единственная память, которую нам нужно для создания любого количества идеальных квадратов.
  • Пока (Num) : Нам нужно только генерировать 10 идеальных квадратов.
  • Выход (Num * Num) : Самое важное и заметное различие от нормальной функции в Python. Это похоже на оператор возврата в том, что он возвращает сгенерировано идеальный квадрат. Обратите внимание, что я говорю, что сгенерирован, потому что все идеальные квадраты Эта функция возвращается и не извлекается из памяти.
  • Num : Увеличение так, чтобы он давал следующий идеальный квадрат.

Глядя на поведение этого генератора. Просто звонить так, как функция вернет Объект генератора Отказ

Объект генератора

Этот объект – это то, что мы должны использовать. Призыв Далее () На этом будет доходность Первое значение, призывая Далее () снова принесет второе значение и так до десятой стоимости.

После этого звонит Далее () попытается дать другое значение, но потому что функция закончится, она поднимет Заставка ошибка.

Призывая к генератору

Хотя мы могли бы проверить, за исключением исключения в конце цикла, навигация уже делает это для нас. Напомним, что For-Loop принимает своими диапазонами, как диапазоны, списки, кортежи и т. Д. Аналогичным образом, for-loop также принимает генератор.

for square in perfect_squares():
    print(square)

Приведенный выше код будет распечатать то же самое, что мы сделали раньше, попробуйте это!

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

Кроме того, обратите внимание, что функция генератора и объект генератора различны, функция генератора (или просто генератор) используется для возврата объекта генератора, который дает все необходимые значения.

Выражения генератора

Проще говоря, чтобы сделать простой генератор использует выражение генератора.

Запомните список списков – создать список с первыми 10 идеальными квадратами, которые мы можем выполнить следующее:

squares_list = [num * num for num in range(1,11)]

Замена “[” и “]” с “(” и “)” с “(” и “)” вместо этого создаст генератор, который генерирует эти значения.

squares_list = (num * num for num in range(1,11))

Обратите внимание, что, хотя список хранятся в памяти и может быть доступен в любое время, генератор можно использовать только один раз.

Почему нам нужен генератор?

Давайте посмотрим разницу размеров между двумя. Импорт . Модуль SYS и делать sys.getsizeof () даст нам размер двух объектов.

Мы получили:

  • Squares_List: 184 B
  • Squares_Generator: 112 B

Это не большая разница. Но что, если нам нужно 100 чисел, то размер становится:

  • Squares_List: 904 B
  • Squares_Generator: 112 B

Для 10000 номеров:

  • Squares_List: 87616 B или 85,5 КБ
  • Squares_Generator: 112 B

Понятно, что если вам нужна огромная последовательность, например, первые миллион фибоначчи или значения функции для печати его графика, и вам нужна только один или два раза, генераторы могут сэкономить много времени (в кодировании) и пространстве ( в памяти).

использованная литература

Python Wiki – генераторы