Python возможности функционального програмирования

23 Апр
2012

Недавно просматривая посты о python на блоге, не нашел ничего о функциональных возможностях языка в чистом виде, что и послужило поводом для создания данного топика — описания. Python хоть и поддерживает парадигму функционального програмирования но возможностей поддерживающих данный стиль кодинга не так много, одна из таких возможностей включенная в язык это карринг или каррирование. Далее постараюсь кратко описать суть, но прошу не судить строго начинающего, поскольку учусь всему сам, да и не так уж и просто человеку с экономическим образованием и опытом осваивать пусть и интересное но абсолютно новое для себя направление.

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

Возьмем любую функцию принимающую два параметра(в данном случае именно два, для простоты изложения):

def spam( x, y ) :
print u"x=%d, y=%d" % ( x, y )

Так вот иногда имеет смысл вызвать эту функцию подобным способом:

spam(2)(3)


т.е. она подбирает один параметр, а следующий раз другой. Понятно, что способом замыкания этого не сделать, поскольку замыкание параметр просто зафиксирует. В таком случае карринг выполняется следующим образом:

spam_1 = lambda x : lambda y : spam( x, y )

либо аналогично в развернутом виде:

def spam_2( x ) :
def new_spam( y ) :
return spam( x, y )
return new_spam

теперь мы можем убедиться, что все работает:

spam_1(2)(3)
spam_2(2)(3)

>>> x=2, y=3
x=2, y=3


Приминение уже оставлю на ваше усмотрение, хотя замечу, что таким способом удобно реализовывать например отложенное вычисление, пусть редко но все же встречающиеся в прикладном программировании.
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх