「这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战」
前言
上次总结了python高阶函数, 函数作为参数的情况, 这次总结一下函数作为结果返回
举例,在函数a里面定义了一个计算整数列表求和的函数,该求和函数作为a函数的结果返回
def a(int_list1):
def sum_list():
cal = 0
for i in int_list1:
cal+=i
return cal
return sum_list
复制代码
我们去使用它
f = a([1,2,3,4,5])
print(f)
print(f())
复制代码
执行结果
# print(f), f是一个函数对象
<function a.<locals>.sum_list at 0x022DB858>
# print(f()), f()是函数调用,执行了sum_list
15
复制代码
在这个例子中,我们在函数a中又定义了函数sum_list,并且,内部函数sum_list可以引用外部函数a的参数int_list1和局部变量,当a返回函数sum_list时,相关参数和变量都保存在返回的函数中,这就是闭包。
请再注意一点,当我们调用a时,每次调用都会返回一个新的函数,即使传入相同的参数
闭包
内部函数可以引用外部函数的局部变量和参数, 返回的内部函数没有被立即执行,直到调用了才会被执行 有一个经典的例子,每次循环,都创建了一个新的函数,然后,把创建的3个函数都返回了
def count():
fs = []
for i in range(1, 4):
def f():
return i*i
fs.append(f)
return fs
f1, f2, f3 = count()
复制代码
我们去调用这三个函数的时候,并不是我们认为的结果1, 4, 9,而是全都是9, 那是因为内部函数f调用了外部函数的变量i, 因为没有被立即执行,那么等到三个函数全部都创建好之后,变量i变成了3, 那么你去调用这三个函数的时候,都是用的3,所以最终结果都是9.
装饰器
如果不想影响原来函数的功能,而是在代码运行期间动态的额外增加一些功能的方式被成为装饰器, 这个装饰器其实跟闭包的写法一样,也是在函数里面嵌套一个函数,返回内部函数
定义一个装饰器
def log(func):
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrapper
复制代码
使用装饰器
@log
def dest_func():
# write some code
复制代码
执行结果
dest_func()
扫描二维码关注公众号,回复:
13692885 查看本文章
@log相当于log(dest_func)