Элементы функционального программирования в Python

Материал из Xgu.ru

Перейти к: навигация, поиск

Содержание

[править] Интересные возможности и инструменты языка

  • itertools
  • functools
  • generators
  • continuations

[править] Вопросы и ответы

[править] Как сделать карриинг функции?

class curry:
    def __init__(self, fun, *args, **kwargs):
        self.fun = fun
        self.pending = args[:]
        self.kwargs = kwargs.copy()

    def __call__(self, *args, **kwargs):
        if kwargs and self.kwargs:
            kw = self.kwargs.copy()
            kw.update(kwargs)
        else:
            kw = kwargs or self.kwargs

        return self.fun(*(self.pending + args), **kw)

Connect = curry(ODBC.Connect, dsn='MyDataSet')

Подробнее: [1].

[править] Можно ли делать замыкания (closures) в Python?

Без проблем, но есть некоторые ньюансы[1].

[править] Есть ли ленивые вычисления в Питоне?

В принципе, это не совсем ленивые вычисления, но нечто подобное можно сделать используя итераторы и yield. Хороший набор функций для работы с итераторами есть в модуле iterools.

Пример ленивого вычисления чисел Фибонначи:

$ cat fib.py
from itertools import chain, islice, izip, starmap, imap

def fib():
    for i in chain([1,1], starmap(lambda x,y: x+y, izip(fib(), islice(fib(), 1, None)))):
        yield i

print list(islice(fib(), 0, 10))

$ python fib.py
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

Конечно, это далеко не то же самое, что

   fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

в Хаскеле, но визуально выглядит похоже.


[править] Что такое декоратор?

Декоратор -- это вещь.

Ещё несколько ссылок, с которых я бы даже советовал начать:

Полезные модули:

  • pypi decorator (англ.)
  • functools.wraps (англ.) — функция functools.wrap, которая помогает создавать декораторы

[править] Дополнительная информация

[править] Элементы функционального программирования

[править] Примечания

  1. http://me.veekun.com/blog/2011/04/24/gotcha-python-scoping-closures/