В Python итератор - это любой объект, который поддерживает протокол итератора. Частью этого протокола является то, что объект должен иметь метод __iter__()
, который возвращает объект итератора. Я предполагаю, что это дает вам некоторую гибкость, чтобы объект мог передать обязанности итератора внутреннему классу или создать какой-то специальный объект. В любом случае, метод __iter__()
обычно имеет только одну строку, и эта строка часто просто return self
Другая часть протокола - это метод next()
, и именно здесь выполняется настоящая работа. Этот метод должен выяснить, создать или получить следующую вещь и вернуть ее. Может потребоваться отследить, где он находится, чтобы при следующем вызове он действительно возвращал следующую вещь.
Если у вас есть объект, который возвращает следующую вещь в последовательности, вы можете свернуть цикл for, который выглядит следующим образом:
myname = "Fredericus"
x = []
for i in [1,2,3,4,5,6,7,8,9,10]:
x.append(myname[i-1])
i = i + 1 # get the next i
print x
в это:
myname = "Fredericus"
x = [myname[i] for i in range(10)]
print x
Обратите внимание, что нигде нет кода, который получает следующее значение i, потому что range (10) - это объект, следующий за протоколом итератора, а понимание списка - это конструкция, которая использует протокол итератора.
Вы также можете напрямую использовать протокол итератора. Например, при написании сценариев для обработки файлов CSV я часто пишу следующее:
mydata = csv.reader(open('stuff.csv')
mydata.next()
for row in mydata:
# do something with the row.
Я использую итератор напрямую, вызывая next()
для пропуска строки заголовка, а затем косвенно использую его через встроенный оператор in
в операторе for
.