python函数式编程之返回函数、匿名函数、装饰器、偏函数学习

xiaoxiao2021-02-28  14


python函数式编程之返回函数

高阶函数处理可以接受函数作为参数外,还可以把函数作为结果值返回。

函数作为返回值

def laxy_sum(*args): def sum(): ax = 0; for n in args: ax = ax + n; return ax; return sum; print(laxy_sum(1, 3, 5, 7)); # <function laxy_sum.<locals>.sum at 0x000001F2E3272F28>返回一个函数而不是一个值

在这个函数中,内部函数sum可以引用外部函数laxy_sum的参数和局部变量,当外部函数返回函数sum时,相关参数和变量都保存在返回的函数中,这种情况称为“闭包”个人觉得和JavaScript的闭包很相似,这种程序结构拥有极大的威胁。 当我们调用lazy_sum时,每次调用都会返回新的函数,即使传入相同的参数。

闭包 当一个函数返回了一个函数后,其内部的局部变量还被新函数引用。返回的函数并没有立即执行,而是直到调用了外部函数才执行

python函数式编程之匿名函数

当我们在传入函数时,有时候不需要显式的定义函数,而是直接传入匿名函数。 匿名函数就是没有函数名的函数,python用关键字lambda表示匿名函数,冒号前面的x表示函数的参数

#匿名函数 p = list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6])); print(p); # [1, 4, 9, 16, 25, 36]

匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。

python函数式编程之装饰器

由于函数也是一个对象,函数对象也可以赋值给变量,所以我们可以通过变量也能调用函数。

def now(): print('2017-11-22'); f = now; print(f());# 2017-11-22

函数对象有一个属性name属性,可以拿到函数的名字:像上面的例子就可以用 f.name取到函数的名字now

在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。如,在函数now调用前后自动打印日志,但又不希望修改now()函数的定义。装饰器本质上是一个干返回函数的高阶函数。

def log(func): def wrapper(*args, **kw): print('call %s():' % func.__name__); return func(*args, **kw); return wrapper; @log def now(): print('2017-11-22'); print(now()); # call now(): # 2017-11-22

Python的@语法后续

python函数式编程之偏函数

简单理解 如int()函数可以把字符串转换成整数形式:

print(int("1234"));#字符串转换成整数

int函数还提供了base参数,用来把字符串转换成N进制的数,默认是10.

print(int("12345", base=8));

但是当我们要进行很多的值转换的时候,一个个传入函数的话,就会很低效,那么我们就可以编写一个这样的函数,让他能实现我们的想法。

def int2(x, base=2): return int(x, base) print(int2("100001"));#33 print(int2("1101110"));#110

向上面这样我们就不用多次输入int(x, base=n),python的functools.partial就帮我们创建了一个偏函数,不需要我们编写函数int2,可以直接创建一个int2函数:

#偏函数 import functools; int2 = functools.partial(int, base=2); print(int2("11101"));#29

所以,functools.partial的作用就是,把一个函数的某些参数设置默认值,返回个新的函数,调用这个新函数会更简单。但也可以传入其他的值,如:int2(“10010”, base=10);

总结 当我们函数参数个数很多,需要简化时,我们可以使用python的functools.partial来创建一个偏函数来固定一些参数,使得我们在使用新函数的时候更加方便。

转载请注明原文地址: https://www.6miu.com/read-2150272.html

最新回复(0)