一 函数对象
函数同样可以作为对象复制给一个变量,如下:
1 | f = abs; |
map 函数
,map函数接受一个函数变量
,第二个参数为一个可迭代对象
,最后返回一个迭代器,由于迭代器的惰性,需要用list()函数返回所有元素
。
1 | def squart(n): |
reduce函数
, reduce函数接受两个参数,第一个参数同样是函数对象f
,f必须接受两个参数
,并且返回和参数同类型的数据
。第二个参数为一个可迭代序列
。
1 | def func(a, b): |
可以通过reduce和map函数搭配,将一个字符串转化为整数
1 | def str2int(str): |
filter 函数
,filter函数同样有两个参数,第一个参数为函数对象,返回值为bool类型
,第二个参数为可迭代序列,返回值为迭代器
,
同样需要list()转化为序列。下面用filter和生成器实现一个素数生成器函数
1 | # 构造奇数序列的生成器 |
打印测试:
1 | for i in primer_generater(): |
sorted 函数,第一个接受一个list,第二个为比较的规则,可以不写
1 | print(sorted(["Abert","cn","broom","Dog"]) ) |
二 函数封装和返回
1 | def lazy_sum(*arg): |
定义了一个lazy_sum函数,函数返回内部定义的sum函数。可以在函数A内部定义函数B,调用A返回函数B,从而达到函数B延时调用。
闭包
:
在函数A
内部定义函数B,函数B
内使用了函数A定义的局部变量或参数,这种情况就是闭包
。
使用闭包需要注意,在函数B中修改了函数A 定义的局部变量,那么需要使用nonlocal关键字
。如果在函数B中修改了全局变量
,那么需要使用global关键字
。
1 | def lazy_sum(*arg): |
匿名函数
:lambda, lambda后面跟函数的参数
,然后用:隔开
,写运算规则作为返回值
1 | it = map(lambda x:x*x, (1,3,5,7,9)) |
装饰器
: 装饰器实际就是函数A中定义了函数B,并且返回函数B
,为了实现特殊功能,如写日志,计算时间等等。
先看个返回函数,并且调用的例子
1 | def decoratorfunc(func): |
以后每次调用helloword,不仅会打印Helloworld,还会打印函数名字。
python提供装饰器的功能,可以简化上面代码,并且实现每次调用helloworld函数都会打印函数名字。
1 | def decoratorfunc(func): |
如果函数带参数,实现装饰器可以内部定义万能参数的函数
1 | def decoratorfunc(func): |
装饰器执行@decoratorfunc相当于
output = decoratorfunc(output)
output(‘hello world!!!’)
如果装饰器需要传入参数,那么可以增加多一层的函数定义,完成装饰器参数传入和调用。
1 | def decoratorfunc(param): |
#实际执行过程
1 | decorator = decoratorfunc('execute') |
执行print(output.name)发现打印出的函数名字不是output而是wrapperfunc,这对以后的代码会有影响。
可以通过python提供的装饰器@functools.wraps(func) 完成函数名称的绑定
1 | def decoratorfunc(param): |
print(output.name)显示为output,这符合我们需要的逻辑。
三 偏函数
如函数 int(a, base = 2)
可以实现一个字符串根据base提供的进制,转化成对应进制的数字。
可以通过偏函数,实现指定参数的固定,并且生成新的函数
1 | intnew = functools.partial(int, base = 2) |
也可以自己定义函数:
1 | def add(a,b): |
函数部分介绍到此为止,我的公众号,谢谢关注: