Итераторы в Python
В этой статье объясняются итераторы в Python.
YouTube Video
Итераторы в Python
Обзор
В Python итератор является основным механизмом для последовательной обработки элементов коллекций, таких как списки, кортежи и словари.
Что такое итератор?
Итератор — это объект, который может возвращать элементы по одному. В Python объект считается итератором, если он соответствует следующим двум условиям:.
- Он имеет метод
__iter__()
, который возвращает сам себя. - Он имеет метод
__next__()
, который возвращает следующий элемент. Он вызывает исключениеStopIteration
, когда элементы заканчиваются.
1iterator = iter([1, 2, 3])
2print(next(iterator)) # 1
3print(next(iterator)) # 2
4print(next(iterator)) # 3
5# print(next(iterator)) # StopIteration occurs
- В этом коде функция
iter()
используется для преобразования списка в итератор, а функцияnext()
применяется для последовательного получения и отображения каждого элемента.
Отличие от итерируемого объекта
Итерируемый объект — это объект, реализующий метод __iter__()
и который может использоваться в цикле for
. Списки и кортежи — примеры итерируемых объектов.
1nums = [10, 20, 30]
2it = iter(nums) # Get an iterator from the iterable
3print(next(it)) # 10
- Этот код является примером получения итератора из итерируемого объекта, такого как список, и поочередного получения элементов с помощью
next()
.
Как проверить:
1from collections.abc import Iterable, Iterator
2
3nums = [10, 20, 30]
4it = iter(nums)
5
6print(isinstance(nums, Iterable)) # True
7print(isinstance(nums, Iterator)) # False
8print(isinstance(it, Iterator)) # True
- Этот код подтверждает, что
nums
является итерируемым объектом, но не итератором, аit
, полученный с помощьюiter(nums)
, — это итератор.
Связь между циклами for и итераторами
Цикл for
в Python внутренне работает следующим образом:.
1nums = [1, 2, 3]
2iterator = iter(nums)
3while True:
4 try:
5 value = next(iterator)
6 print(value)
7 except StopIteration:
8 break
- Как показано, цикл
for
неявно использует итератор для выполнения прохода по элементам.
Создание собственного итератора
Можно создать собственный итератор с помощью класса.
1class Countdown:
2 def __init__(self, start):
3 self.current = start
4
5 def __iter__(self):
6 return self
7
8 def __next__(self):
9 if self.current <= 0:
10 raise StopIteration
11 value = self.current
12 self.current -= 1
13 return value
14
15for num in Countdown(3):
16 print(num) # 3, 2, 1
- Этот код определяет пользовательский итератор для обратного отсчета с использованием класса
Countdown
и выводит числа от 3 до 1 с помощью циклаfor
.
Различия между итераторами и генераторами и когда использовать каждый из них
Генераторы предоставляют функциональность, аналогичную итераторам. Они позволяют определять итераторы более лаконично.
1def countdown(n):
2 while n > 0:
3 yield n
4 n -= 1
5
6for i in countdown(3):
7 print(i) # 3, 2, 1
- Этот код определяет генераторную функцию, осуществляющую обратный отсчет с помощью
yield
, и выводит числа от 3 до 1 в циклеfor
.
Различия между итераторами (класс) и генераторами (функция)
Существует несколько отличий между итераторами (классами) и генераторами (функциями):.
Особенность | Итератор (класс) | Генератор (функция) |
---|---|---|
Определение | __iter__() + __next__() |
Функция с использованием yield |
Управление состоянием | Требуется ручное управление атрибутами | Состояние поддерживается автоматически |
Читаемость | Может стать сложной | Простой и понятный |
-
Различие в способе определения Итератор определяется вручную с помощью двух методов:
__iter__()
и__next__()
. В отличие от этого, генератор — это просто функция с использованием ключевого словаyield
, что делает код гораздо проще. -
Различие в управлении состоянием В итераторе вы должны вручную управлять текущим состоянием и прогрессом с помощью переменных. Генераторы же автоматически сохраняют свое состояние внутри в Python, снижая необходимость ручного управления.
-
Читаемость кода Итераторы часто становятся сложными, поскольку требуют нескольких методов и ручного управления состоянием. В отличие от этого, генераторы используют простой синтаксис и легче для понимания даже для новичков.
Стандартная библиотека для работы с итераторами: itertools
itertools
— стандартная библиотека Python, предоставляющая мощные инструменты для работы с итераторами.
1import itertools
2
3for x in itertools.count(10, 2): # 10, 12, 14, ...
4 if x > 20:
5 break
6 print(x)
- Она также включает много других функций, таких как
cycle
,repeat
,chain
,islice
иtee
.
Примеры использования итераторов
Случаи использования итераторов включают следующее:.
- Обработка строк файла: Чтение строк файла поочередно с помощью итератора.
- Эффективная по памяти обработка: Последовательная обработка больших объемов данных.
- Представление бесконечных последовательностей: Использование функций, таких как
itertools.count()
.
Резюме
- Итератор — это объект, который может последовательно получать следующие значения.
- Вы можете создать собственный итератор, определив методы
__iter__()
и__next__()
. - Их обработка осуществляется автоматически при помощи циклов
for
или функцииnext()
. - Использование генераторов или
itertools
позволяет более эффективно обрабатывать данные.
Используя итераторы, вы можете последовательно обрабатывать большие объемы данных с экономией памяти, эффективно управлять состоянием и повышать производительность программы.
Вы можете следовать этой статье, используя Visual Studio Code на нашем YouTube-канале. Пожалуйста, также посмотрите наш YouTube-канал.