Объекты-иттераторы

Примеры с 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