Этот триплет - одна из самых запутанных вещей в программировании на Python и один из наиболее часто задаваемых вопросов на собеседованиях. Давайте по порядку проясним эту путаницу: -

Итераторы

Итератор - это объект, содержащий счетное количество значений.
Технически в Python итератор - это объект, который реализует протокол итератора, который состоит из методов __iter __ () и __next __ ().

iter_obj=iter([3,4,5])
This creates an iterator.

next(iter_obj)

This return the first element i.e 3

next(iter_obj)

This returns the next element i.e 4 and so on.

Пример того, как создать свой собственный итератор: -

Давайте создадим итератор, который считает до 10.

class MyNumbers:
 def __iter__(self):
 self.a = 1
 return self
def __next__(self):
 if self.a <= 10:
 x = self.a
 self.a += 1
 return x
 else:
 raise StopIteration
myclass = MyNumbers()
myiter = iter(myclass)
for x in myiter:
 print(x)

Итерационные объекты

Списки, кортежи, словари и наборы - все это повторяемые объекты. Это повторяющиеся контейнеры, из которых вы можете получить итератор. Все эти объекты имеют метод iter (), который используется для получения итератора.
Пример: -

mytuple = (“red”, “blue”, “green”)
myit = iter(mytuple)
print(next(myit))

This will return red.

print(next(myit))

This will return blue.

print(next(myit))

This will return green.

Здесь mytuple - итератор, а myit - итератор.

А теперь давайте познакомимся с нашим последним гостем: -

Генераторы
Функция генератора Python предоставляет нам последовательность значений для выполнения итерации Python.
Давайте реализуем генератор: -

def even(x):
 while(x!=0):
 if x%2==0:
 yield x
 x-=1
 for i in even(8):
 print(i)

The output is:-
8
6
4
2

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

  1. Мы использовали функцию для создания генератора. Но при создании итератора в Python мы использовали функции iter () и next ().
  2. Генератор на Python использует ключевое слово yield. Итератор Python этого не делает.
  3. Генератор Python сохраняет состояния локальных переменных каждый раз, когда yield приостанавливает цикл в Python. Итератор не использует локальные переменные, все, что ему нужно, - это итерация для итерации.
  4. Генератор может иметь любое количество операторов yield.
  5. Вы можете реализовать свой собственный итератор, используя класс python; генератору не нужен класс на Python.
  6. Чтобы написать генератор Python, вы можете использовать функцию Python или понимание. Но для итератора вы должны использовать функции iter () и next ().

Теперь обсудим преимущества и недостатки генераторов и итераторов: -

  1. Генератор эффективен для написания быстрого и компактного кода. Это преимущество перед итераторами Python. Их также проще кодировать, чем собственный итератор.
  2. Итератор Python более эффективен с точки зрения памяти.
def func():
i=1
while i>0:
yield i
i-=1
for i in func():
    print(i)
func().__sizeof__()

Это возвращает 32 для генераторов.

Но для итераторов вроде:

iter([1,2]).__sizeof__()

Получаем 16.

Спасибо за чтение. Если вы узнали что-нибудь из блога, пожалуйста 👏.