English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Итератор - это объект, который можно итерировать. В этом руководстве вы узнаете принцип работы итераторов и как создать свои собственные итераторы с помощью методов __iter__ и __next__.
Итераторы везде в Python. Они реализованы элегантно в цикле for, comprehension, генераторах и скрыты на виду.
Итератор в Python - это просто объект, который можно итерироватьОбъект. Один будет возвращать данные объект, по одному элементу за раз.
Технически, Python Объект итератораДолжны быть реализованы два специальных метода, __iter__() и __next__(), которые вместе называютсяПротокол итератора.
Если мы можем получить итератор из объекта, то этот объект называетсяИтерируемыйИтерация. Большинство встроенных контейнеров Python (например:)list,tuple,stringи т.д.) итерируемы.
Функция iter() (или метод __iter__()) возвращает итератор.
Мы используем функцию next() для ręчного итерирования всех элементов итератора. Когда мы достигаем конца и больше данных не осталось для возврата, он вызывает StopIteration. Вот пример...
# Определение списка my_list = [4, 7, 0, 3] # Получение итератора с помощью func() my_iter = iter(my_list) ## Получение итератора с помощью func() # Вывод 4 print(next(my_iter)) # Вывод 7 print(next(my_iter)) ## next(obj) и obj.__next__() одинаковы # Вывод 0 print(my_iter.__next__()) # Вывод 3 print(my_iter.__next__()) ## Это вызовет ошибку, если больше нет элементов next(my_iter)
Одним из более изящных способов автоматической итерации является использованиеЦикл for. Используя этот метод, мы можем итерировать любой объект, который может возвращать итератор, например список, строку, файл и т.д.
>>> for element in my_list: ... print(element) ... 4 7 0 3
Как мы видели в примере выше, цикл for может автоматически итерировать список.
На самом деле, цикл for может итерировать любой итерируемый объект. Давайте рассмотрим, как цикл for на самом деле реализует цикл в Python.
for element in iterable: # Что-то сделать с элементом
На самом деле это реализовано как.
# Создание объекта итератора iterable iter_obj = iter(iterable) # Бесконечный цикл while True: try: # Получить следующее значение element = next(iter_obj) # Что-то сделать с элементом except StopIteration: # Если вызывается StopIteration,跳出 цикл break
Таким образом, внутри цикла for создается объект итератора iter_obj, вызывая iter() на iterable.
Иронично, что этот цикл for на самом деле бесконеченЦикл while.
Внутри цикла он вызывает next() для получения следующего элемента и использует это значение для выполнения主体的 цикла for. Когда все элементы использованы, StopIteration выбрасывается, он внутренне перехватывается, и цикл заканчивается. Обратите внимание, что через другие типы исключений пропускаются.
В Python легко создавать итераторы с нуля. Нам нужно только реализовать эти методы __iter__() и __next__().
__iter__() метод возвращает объект итератора himself. Если необходимо, можно выполнить некоторые инициализации.
__next__() метод должен возвращать следующее значение в последовательности. В конце последовательности и в последующих вызовах он должен вызывать StopIteration.
Здесь мы показываем пример, который предоставляет нам степень двойки в каждом итерации. Интенсивность от 0 до указанного пользователем числа.
class PowTwo: """Реализация класса итератора" владение двоичной def __init__(self, max = 0): self.max = max def __iter__(self): self.n = 0 return self def __next__(self): if self.n <= self.max: result = 2 ** self.n self.n += 1 return result else: raise StopIteration
Теперь мы можем создать итератор и iterate по нему следующим образом.
>>> a = PowTwo(4) >>> i = iter(a) >>> next(i) 1 >>> next(i) 2 >>> next(i) 4 >>> next(i) 8 >>> next(i) 16 >>> next(i) Traceback (most recent call last): ... StopIteration
Мы можем также использовать цикл for для итерации по классу итератора.
>>> for i in PowTwo(5): ... print(i) ... 1 2 4 8 16 32
Элементы в объекте итератора не обязательно должны быть израсходованы. Могут быть бесконечные итераторы (никогда не заканчивающиеся). При обработке таких итераторов мы должны быть осторожны.
Это простой пример демонстрации бесконечного итератора.
Внутренние функции Функция iter() может быть вызвана с двумя параметрами, где первым параметром必须是 вызовible объект (функция), а вторым параметром является маркер. Итератор вызовет эту функцию до тех пор, пока возвращаемое значение не будет равно маркеру.
>>> int() 0 >>> inf = iter(int, 1) >>> next(inf) 0 >>> next(inf) 0
Мы можем видеть, что функция int() всегда возвращает 0. Поэтому передача ее в качестве iter(int, 1) вернет итератор, который будет вызывать функцию int() до тех пор, пока возвращаемое значение не будет равно 1. Это никогда не произойдет, и мы получим бесконечный итератор.
Мы также можем создать свой бесконечный итератор. Теоретически, следующий итератор будет возвращать все нечетные числа.
class InfIter: """Бесконечный итератор возвращает все Нечетные числа def __iter__(self): self.num = 1 return self def __next__(self): num = self.num self.num += 2 return num
Запуск таков.
>>> a = iter(InfIter()) >>> next(a) 1 >>> next(a) 3 >>> next(a) 5 >>> next(a) 7
...
Будьте осторожны при итерации по этим типам бесконечных итераторов, чтобы включить终止ное условие.
Преимуществом использования итераторов является экономия ресурсов. Как показано выше, мы можем получить все нечетные числа, не храня весь цифровой набор в памяти. Теоретически, мы можем включить в ограниченную память бесконечное количество элементов.
Итераторы также делают наш код привлекательным.
Есть простой способ создать итератор в Python. Для получения дополнительной информации посетите:Генератор yield Python.