Этот триплет - одна из самых запутанных вещей в программировании на 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
Вы, должно быть, видели некоторые заметные различия между генератором и итератором из приведенного выше примера. Давайте обсудим их: -
- Мы использовали функцию для создания генератора. Но при создании итератора в Python мы использовали функции iter () и next ().
- Генератор на Python использует ключевое слово yield. Итератор Python этого не делает.
- Генератор Python сохраняет состояния локальных переменных каждый раз, когда yield приостанавливает цикл в Python. Итератор не использует локальные переменные, все, что ему нужно, - это итерация для итерации.
- Генератор может иметь любое количество операторов yield.
- Вы можете реализовать свой собственный итератор, используя класс python; генератору не нужен класс на Python.
- Чтобы написать генератор Python, вы можете использовать функцию Python или понимание. Но для итератора вы должны использовать функции iter () и next ().
Теперь обсудим преимущества и недостатки генераторов и итераторов: -
- Генератор эффективен для написания быстрого и компактного кода. Это преимущество перед итераторами Python. Их также проще кодировать, чем собственный итератор.
- Итератор 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.
Спасибо за чтение. Если вы узнали что-нибудь из блога, пожалуйста 👏.