Объекты-иттераторы
Примеры с xrange() и xreadlines() являются примерами функций, которые возвращают объекты-итераторы: специальные объекты, призванные выдавать очередное значение по требованию. В версиях Python 2.1 и ниже такие объекты можно было создавать с помощью описания довольно хитрого класса. Вот простейший пример, в котором класс Fibonacci описывает объекты для получения последовательности чисел Фибоначчи:
class Fibonacci:
"""Прообраз итератора последовательности Фибоначчи"""
def __init__(self, max):
self.n, self.a, self.b, self.max = 0, 0, 1, max
def __getitem__(self, x):
if self.n < self.max:
a, self.n, self.a, self.b = self.a, self.n+1, self.b, self.a+self.b
return a
else:
raise IndexError
# Пример выполнения
for i in Fibonacci(10):
print i,
Итераторы в Python можно встретить повсюду, где раньше были списки. Например, ключи, значения и пары ключей-значений теперь можно получить в виде итератора:
d = {1: 'a', 2: 'b', 3: 'c'}
for k, v in d.iteritems():
print k, v
1 a
2 b
3 c
То есть, теперь нет нужды создавать отдельный (подчас огромный) список на основе словаря -- значения без труда в нужный момент (just-in-time, так сказать) выдаст итератор!
Нужно пронумеровать объекты списка или другого итерабельного объекта? Теперь есть встроенная функция enumerate():
for (n, v) in enumerate("example"):
print n, ":", v
0 : e
1 : x
2 : a
3 : m
4 : p
5 : l
6 : e