python函数式编程:匿名函数,装饰器,偏函数

一 匿名函数:
尽管python的语法已经很简洁,但是定义函数的过程还是相对繁琐,当我们在调用函数的过程中,python为我们提供了可以节省定义函数时间的方法,让我们可以不用显示的调用函数,那就是匿名函数,匿名函数使用lambda关键字:

L= []
L = list(map(lambda x: x * x,[1,2,3,4,5,6,7,8]))
print(L)
[1, 4, 9, 16, 25, 36, 49,64]
这里面定义了一个将后面列表的值平方的匿名函数:lambda x : x * x  就相当于
def f(x):
    return x * x

匿名函数有一个限制 ,就是没有return,但匿名函数的表达式就是个返回值:

>>> f = lambda x : x * x
>>> f
<function <lambda> at 0x0000020A82D62E18>
>>> f(5)
25

二 装饰器:

  我的理解是   当在频繁的使用某函数的时候,我们想在不改变原函数的基础上,给该函数附加一些功能或者是说明,就用到了装饰器,先说一下装饰器的原理:
 无参函数:
>>> def mul_fn(a,b):
...     return a * b
...
>>> def say_name(fn):
...     def temp():
...             print('附加功能语句')
...             return fn
...     return temp
...
>>> a = say_name(mul_fn)
>>> print(a()(2,3))
附加功能语句
6
 有参函数: 
>>> def add_fn(a,b):
...     return a + b
...
>>> def say_name(fn):
...     def temp(*args,**kw):
...             print('附加功能语句')
...             return fn(*args,**kw)
...     return temp
...
>>> add_fn = say_name(add_fn)
>>> add_fn(2,3)
附加功能语句
5

再说一下 装饰器的 基本语法:

>>> def say_name(fn):
...     def temp(*args,**kw):
...             print('call %s ():'%fn.__name__)
...             return fn(*args,**kw)
...     return temp
...
>>> @say_name
... def add_fn(a,b):
...     return a + b
...
>>> add_fn(2,3)
call add_fn (): 
5
>>>

三 偏函数:
先不说偏函数的定义,我们慢慢往下看,当然这里的偏函数不是指的数学上 的偏函数(而且数学上的偏函数我早就已经还给教我数学的体育老师了)
我们先自己定义一个函数:

>>> def han(x,odd = True):
...     a = 1 if odd else 2
...     return [i for i in range(a,x, 2)]
...
>>> L = han(10)
>>> L
[1, 3, 5, 7, 9]
>>>
该函数传入数值 ,还有一个默认参数 odd 默认值是True,当odd = True
的时候,生成一个奇数列表

当我们想生成一个偶数列表的时候,我们可以这样做:

>>> han(10,odd = False)
[2, 4, 6, 8]
>>>

假如我们想频繁的使用这个函数的时候,一遍又一遍的修改是很麻烦的,于是乎我们可以这样做:

>>> def han2(x,odd = False):
...     return han(x,odd)
...
>>> han2(10)
[2, 4, 6, 8]
>>>

这样做离所谓的偏函数不远了
python中有一个模块叫做functools,该模块提供了很多使用的功能,其中就有偏函数(partial function)的功能。
偏函数让我们不用自己定义函数:

>>> import functools
>>> han2 = functools.partial(han,odd = False)
>>> han2(10)
[2, 4, 6, 8]
>>>

我们做个小测试:

>>> print(type(han),type(han2))
<class 'function'> <class 'functools.partial'>
>>>
从输出结果我们可以看出,han类型是一个函数,han2类型不是一个函数
而是functools.partial(偏函数)类型。
但我们平常使用的时候可以把han2当作成一个函数使用。

看过三国的应该都知道偏将军一职位,官制中,系将军的辅佐,与裨将军两者都为杂号将军;偏函数,其实是函数的辅佐。
偏函数的作用就是:将所作用的函数作为partial()函数的第一个参数,原函数的各个参数依次作为partial()函数的后续参数,原函数有关键字参数的一定要带上关键字,没有的话,按原有参数顺序进行补充。偏函数的第二个部分(可变参数),按原有函数的参数顺序(必须是有序)进行补充,参数将作用在原函数上。

后续我还会 在写篇对装饰器 和偏函数理解略深度的博客。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值