您的位置:首页 > 编程语言 > Python开发

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

2017-12-13 17:38 267 查看
一 匿名函数:

尽管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
..
4000
.     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()函数的后续参数,原函数有关键字参数的一定要带上关键字,没有的话,按原有参数顺序进行补充。偏函数的第二个部分(可变参数),按原有函数的参数顺序(必须是有序)进行补充,参数将作用在原函数上。

后续我还会 在写篇对装饰器 和偏函数理解略深度的博客。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: