Показаны сообщения с ярлыком iterators. Показать все сообщения
Показаны сообщения с ярлыком iterators. Показать все сообщения

воскресенье, 27 апреля 2014 г.

Генераторные выражения

Иногда, в простых случаях, можно не писать функцию-генератор, а обойтись генераторным выражением.

(expr1 expr2)
Где нужно учесть следующее:

Выражение всегда заключено в круглые скобки.
В случае, если выражение используется в качестве единственного аргумента при вызове функции, круглые скобки выражения могут совпадать с круглыми скобками вызова функции.
expr2 - итератор, генерирующий значения.
expr1 - операция, которая производится с сгенрированным expr2 значением.

Таким образом, генераторное выражение работает следующим образом:

При очередном вызове expr2, и генерирует следующее исходное значение.
Сгенерированное исходное значение подставляется в expr1.
Сгенерированное expr1 значение возвращается генераторным выражением.
Генераторное выражение ждет следующего вызова


Простейший пример:

print sum(x*(5+x) for x in xrange(10,20,30))

суббота, 26 апреля 2014 г.

Итераторы

Чтобы получить объект-итератор, нужно создать объект, который будет иметь два метода со специальными именами:

__iter__() - метод, который возвращает сам объект.
next() - метод, который возвращает следующее значение итератора.


 class SimpleIterator(object):
     
     def __init__(self,fname):
         self.fd = open(fname,'r')
         
     def __iter__(self):
         return self

     def next(self):
         l = self.fd.readline()
         if l != '':
             l = l.rstrip('\n')
             num = int(l)
             return num*2
         raise StopIteration

Проверка:

>>> simple_iter = SimpleIterator('test_data.txt')
>>> for i in simple_iter:
...    print i
6
8