Предисловие:
Перед итератором итератора этого раздела существует некоторая путаница, с некоторой информацией, чтобы выразить мое понимание этих понятий не может быть, но для начала моих друзей, чтобы начать с нуля, чтобы понять,
Прямо в точку первым представил итерируемые популярное понимание и итераторы
Итератор просто быть рядом () для получения следующей итерации значения объекта, итератор не напрямую сохранить значение последовательности итераций, и итерации алгоритма хранимого значения, полученное при
Итерируемый должна быть метод ITER () вызовом, чтобы получить Iterable объектов, только итерируемый доступны для для цикла
Принцип, лежащий для цикла:
Ниже приводится для формата петли
для ввода в итерируемых: петлях
Суть метода состоит в вызове встроенный ITER (), полученный объект итератора, то значение итерации я получают путем каждого следующего (итератора) вызова
Например, следующий код:
для я в х: печать (я)
Его можно переписать в виде:
Итератор = ИТЭР (х) , а True: я = следующий (итератор) печать (я)
Строго говоря, или принцип, лежащий в основе
Итератор или объект итератора: реализует __next __ () метод Magic (класс) экземпляр объекта, метод возвращает следующее значение итератора
Итерируемый: __ реализует __iter магических методы (класс экземпляр) объект (), который возвращает объект итератора
На самом деле, рядом и ИТЭР является еще пакет __next__ и __iter__ или сказать дальше и ИТЭР, когда они призваны выполнять функции в пределах __next__ и __iter__ для достижения итератора и итерацию и функция
Таким образом, мы можем понять цикл, итерируемые, итераторы три контакта:
Для итераций цикла может быть только объекты, итерируемыми они должны реализовать итератор
Таким образом, мы можем реализовать пользовательские итераторы и итератор объект для того, чтобы добиться эффекта цикла для таможни
Пример:
Ряд Фибоначчи для достижения прорезать итератора и итерацию
Они определяются класс итератора и объект принадлежит итерации:
Класс С февраля:
«» «может быть определена в классе итерации объекта» «» DEF на __init__ (Self, NUM): указывает длину номера столбца #num self.a . = 1 self.b, = 2
self.current = self.a
self.num NUM = DEF __iter__ (Self): вернуть FebIterator (Self) класс FebIterator (Self):
'' 'определенный класс итератора' '' DEF в __init__ (Self, Source): self.source = Источник DEF __next__ (Self):
IF ( . 1-self.num> = 0):
. self.num = self.num 1- self.current = self.a self.a= Self.b, self.b, = + self.current self.b, # выше двух промежуточной переменной присваивания могут быть опущены непосредственно написать self.a, self.b, self.b, = + self.a Само, В
Самовозврат. curent
в другом: поднимание StopIteration
Называя эти два класса для создания экземпляров объектов может быть достигнуто циркуляционный печати число Фибоначчи
февраль = февраль ()
для ввода в феврале: печать (я)
На самом деле, для простоты и удобства, можно одновременно достичь __iter __ () и метод __next __ () в классе, класс, экземпляр объектов является лишь одним из объектов итерации итератора, следующим образом:
Класс февраля: Защиту __init__ (): self.a = 1 self.b = 2
sele.current = self.a Защиту __iter__ (Я): возвращение собственной четкости __next__ ():
если (self.num-1> = 0):
= Self.num. 1-self.num
self.current = self.a
self.a = self.b, self.b, self.current # + = self.b, выше , два промежуточных присваивание переменной могут быть опущены непосредственно написать self.a , self.b, self.b, =, + self.a Я, B
возвращение self.curent
другое: Поднимите StopIteration
До его использования, и нет никакой разницы, но более простой, если есть четкое понимание и осознание итератора и итерацию, или путали эти два понятия