一 匿名函数:
尽管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()函数的后续参数,原函数有关键字参数的一定要带上关键字,没有的话,按原有参数顺序进行补充。偏函数的第二个部分(可变参数),按原有函数的参数顺序(必须是有序)进行补充,参数将作用在原函数上。
后续我还会 在写篇对装饰器 和偏函数理解略深度的博客。