[Python]偏函数应用

     Currying的概念将函数式编程的概念和默认参数以及可变参数结合在一起。一个带n个参数,curried的函数固化第一个参数为固定参数,并返回另一个带n-1个参数的函数对象,分别类似于LISP的原始函数car和cdr的行为。Currying能泛化称为偏函数应用(partial function application,PFA),这种函数将任意数量(顺序)的参数的函数转化为另一个带剩余参数的函数对象。

简单的函数式例子

from operator import add,mul
from functools import partial
add1 = partial(add,1)
mul100 = partial(mul,100)
print add1(10)
print mul100(7)
11
700

    当调用带多个参数的函数的时候,PFA是最好的办法。使用带关键字参数的PFA也是较简单的,因为能显示给出特定的参数,要么作为curried参数,要么作为那些更多在运行时刻传入的变量,并且我们不需要关心次序。下面的一个例子来自Python文档中关于在应用程序中的应用,在这些程序中需要经常将二进制(作为字符串)转换成整型。

base2 = partial(int, base=2)
base2.__doc__ = 'Convert base 2 string to an int.'
print base2('10010')
18

警惕关键字

    如果你创建了不带base关键字的偏函数,比如,baseTwoBAD = partial(int,2),这可能会让参数以错误的顺序传入int(),因为固定参数的总是放在运行在运行时刻参数的左边,比如baseTwoBAD(x) == int(x,2)。如果你调用它,它会将2作为需要转化的数字,它会将2作为需要转化的数字,base作为‘10010’来传入,会产生一个TypeError异常。由于关键字放置在恰当的位置,顺序就得固定下来,如大家所知,关键字参数总是出现在形参之后,所以base2(x) == int(x,2)。

baseTwoBAD = partial(int,2)
baseTwoBAD('10010')
Traceback (most recent call last):
  File "----------------------x----------------------", line y, in <module>
    baseTwoBAD('10010')
TypeError: an integer is required


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值