Генераторы Python: как создавать итераторы с помощью Yield

При создании итераторов в Python много чего; мы должны реализовать класс с помощью метода __ iter __ () и __ next __ () , отслеживать состояния внутренних переменных, повышать StopIteration , когда не было возвращаемых значений и т. д.

Генераторы Python

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

Если функция содержит хотя бы один оператор yield ( он может включать другие операторы yield или return , тогда он становится функцией генератора.

Основное различие между нормальной функцией и генераторами Python заключается в том, что оператор return полностью завершает функцию; оператор yield приостанавливает функцию, сохраняя все ее состояния и значения переменных, а затем продолжается оттуда при последовательных вызовах.

См. следующий пример генераторов в Python.

 # app.pydef createGenerator (): i = 1 print ('Ronin') print (i) yield ii + = 1 print ('RedSkull') print (i) yield ii + = 1 print ('  Rocket ') print (i) yield igen = createGenerator () next (gen) next (gen) next (gen) 

См. Вывод.

В приведенном выше примере следует отметить, что значение переменной i запоминается между каждым вызовом.

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

Когда yield выполняется, выполнение функции приостанавливается, и значение переменной не уничтожается, когда мы вызываем следующий оператор, он начинает выполнение. Когда снова выполняется оператор yield, выполнение функции останавливается и снова возобновляет выполнение. Вот почему мы можем видеть все значения.

Для циклов с генераторами

Мы можем использовать цикл for напрямую с генераторами . Мы можем отобразить значения, выполнив функцию next (). См. Следующий пример.

 # app.pydef createGenerator (): i = 1 print ('Ronin') yield ii + = 1 print ('RedSkull') yield ii + = 1 print ('  Rocket ') yield ifor g в createGenerator (): print (g) 

См. Вывод.

Цикл for принимает итератор и выполняет итерацию по нему с помощью next () функция. Он автоматически завершается, когда вызывается StopIteration .

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

Простые генераторы можно легко создавать «на лету» с помощью выражений генератора. Это упрощает создание генераторов.

Так же, как лямбда-функция создает анонимную функцию, выражение генератора создает анонимную функцию генератора.

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

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

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

См. пример ниже.

 # app.pylistK = [18, 19, 21, 29, 46] result = (i ** 2 для i в listK  ) print (next (результат)) print (next (результат)) print (next (результат)) print (next (результат)) 

См. вывод.

Выражение генератора можно использовать внутри функций. При таком использовании можно использовать круглые скобки.

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

Python Yield

Оператор yield приостанавливает выполнение функции и отправляет значение обратно вызывающей стороне, но сохраняет состояние, достаточное для возобновления функции с того места, где она была остановлена.

При возобновлении функция продолжает выполнение сразу после последнего выполнения yield.

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

Yield используется в генераторах Python .

Функция генератора определена как обычная функция, но всякий раз, когда ей нужно сгенерировать значение, она делает это с ключевым словом yield, а не return.

Если тело def содержит yield, функция автоматически становится функцией-генератором.

Различия между генератором и нормальной функцией

  1. Функция генератора содержит один или несколько операторов yield .
  2. При вызове функции генератора она возвращает объект (итератор), но не немедленно начать выполнение.
  3. Такие функции, как __ iter __ () и __ next __ () , реализуются автоматически. Таким образом, мы можем перебирать элементы, используя функцию next () .
  4. После выполнения оператора yield функция приостанавливается и передает управление объекту вызывающий.
  5. Локальные переменные и их состояния запоминаются между последовательными вызовами.
  6. Наконец, когда функция завершается, StopIteration автоматически вызывается при последующих вызовах.

Наконец, генераторы Python пример окончен.

Оцените статью
nanomode.ru
Добавить комментарий