一.闭包
1.python闭包
闭包是有外函数和内函数组成的函数
2.创建闭包的三个条件:
a.要有函数的嵌套(外部函数,内部函数)
b.内部函数要使用外部函数的变量
c.外部函数必须有返回值,返回内部函数名
3.闭包的简单使用
代码
def out(a): #外部函数
def sum( b): #内部函数
print('this is sum')
return a + b
return sum
fun=out(100)
print(type(fun))
print(fun(20))
输出结果
<class 'function'>
this is sum
120
上面程序中,out是外部函数,sum是内部函数,赋值后fun只是一个函数名,相当于内部函数名sum。若想在内部函数中修改外部函数的变量a,可以使用nonlocal语句指定上级函数的变量a。
二.装饰器
装饰器跟闭包作用差不多,可以在不修改函数源码的基础上增加一些新的功能。
1.装饰器的简单使用
代码
def fun1(fun2):
def a():
print('this is a')
fun2()
return a
@fun1
def fun3(): #此处的作用相当于fun3=fun1(fun2)
print('this is function3')
fun3()
结果
this is a
this is function3
装饰器的作用相当于执行了fun3=fun1(fun3),而fun1(fun3)的返回值是a,所以相当于赋值fun3=a,执行fun3就是执行a。
2.带参数的装饰器
代码
def fun1(fun2):
def a(b,c):
print('this is a')
fun2(b,c)
return a
@fun1
def sum(a,b):
print(a+b)
sum(100,200)
结果
this is a
300
3.通用装饰器
def fun1(fun2):
def a(*args,**kwargs):
print('this is a')
fun2(*args,**kwargs)
return a
@fun1
def sum(a,b):
print(a+b)
sum(100,200)
该代码的执行结果与上面的执行结果一样,但不同的是该装饰器可以装饰参数数量任意的函数
原本sum函数的执行可以输出数值300,加了装饰器后多输出了一行’this is a’,所以装饰器可以在不修改源码的基础上给函数增加一定的功能