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

来源:互联网 发布:淘宝打折活动怎么设置 编辑:程序博客网 时间:2024/05/16 05:23

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

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

阅读全文
0 0