Генератор против итератора в Python

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

основные отличия

Помимо очевидных синтаксических различий, следует отметить следующие отличия:

Генератор Итератор
Реализовано с помощью функции. Реализовано с использованием класса.
Использует yield keyword. Не использует ключевое слово yield .
Использование дает краткий код. Использование приводит к относительно менее сжатому коду.
Все локальные переменные перед yield сохраняются. Локальные переменные не используются.

Примеры

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

1. Генератор

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

Реализация

 # Функция для генерации всех неотрицательных чисел # до заданного неотрицательного numberdef upto (n): for i in range (n + 1  ): # Оператор yield делает функцию # генератором yield ifor number в upto (5): print (number) 

2. Итератор

Метод __ iter __ () возвращает объект итератора. Это необходимо для использования итератора с операторами for и in .

__next __ () возвращает следующий элемент в последовательности. В случае конечного итератора, когда он достигает конца (определяемого условием завершения), все последующие вызовы этого метода должны вызывать исключение..

Реализация

 # Функция для генерации всех неотрицательных чисел # до заданного неотрицательного числа. class UpTo: # присвоение параметру значения по умолчанию 0 def __init __ (self  , max = 0): self.max = max def __iter __ (self): self.n = 0 return self def __next __ (self): # Следующий метод вызовет исключение # при достижении условия завершения.  if self.n> self.max: поднять StopIteration else: result = self.n self.n + = 1 вернуть результат для числа в UpTo (5): print (number) 

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