Питон - модули, пакеты, классы, экземпляры. :: Бройтман Олег
Страница:
6 из 7
А можно воспользоваться возможностями функционального программирования, которые есть в Питоне - функциями map, filter, reduce и тому подобное. Эти функции требую в качестве первого параметра функцию, которую они в процессе цикла вызывают. Это эффективнее, чем цикл for (эти функции-то написаны на C), но возникает проблема с хранением состояния между итерациями. Функция, которую вызывает map может хранить состояние только в глобальных переменных. Для простых программ это вполне приемлемо. Но вот, скажем, с многопоточными программами будут проблемы - необходимо запирать и синхронизировать доступ к глобальным переменным. Да и вообще к глобальным переменным надо обращаться только при крайней нужде.
Вот тут на помощь приходит дополнительное пространство имен, существующее в экземпляре класса. Создадим класс
class Process:
def __init__(self):
self.foo = 0
def __call__(self, v):
if self.foo > 100:
raise OverflowError
self.foo += v
return self.foo
Создадим экземпляр этого класса: p = Process(), и передадим этот объект в map вместо функции: result = map(p, sequence). Функция map, ничего не подозревая, будет вызывать переданный ей объект как функцию с одним параметром. Никаких проблем - мы так описали класс, что его экземпляры можно вызывать, и именно с одним параметром! И от итерации к итерации объект p сохраняет необходимое состояние.
Другой похожий пример:
class Process:
def __init__(self):
self.sum = 0
def add(self, v):
self.sum += v
return self.sum
p = Process()
result = map(p.add, sequence)
print p.
|< Пред. 3 4 5 6 7 След. >|