1 闭包:保小
闭包:
函数内的属性,都是有生命周期的,都是在函数执行期间,函数执行完,就会被回收。但可以通过闭包,将函数内的属性给保留下来,除非通过 del 删除掉,否则就是存在的。
内部函数对外部函数作用域(肚子里的东西)里变量的引用
def func():
print("this is function")
def func1():
print("this is function1")
func()
若我想用func1,该怎么办呢?将func1()返回就可以用了啊
def func():
print("this is function")
def func1():
print("this is function1")
return func1
var = func()
var()
def func():
a = 1
print("this is function")
def func1(num):
print("this is function1")
print(num + a)
return func1
var = func()
var(3)
但是此时a是在var里面的,若def val,那么此时a才会被真正意义的删除。(看下面的例子),我们会发现obj其实是没有被删除的,obj[0] 仍然在叠加的状态。
mylist = [1, 2, 3, 4]
def func(obj):
print('func', obj)
def func1():
obj[0] += 1
print("func1", obj)
return func1
var = func(mylist)
var()
var()
var()
闭包的意义:闭包是func(),闭包函数func1() 闭包内的闭包函数func1私有化了变量,完成了数据的封装,类似于面向对象。
2 装饰器(也叫语法糖 @)
装饰器存在的意义:不影响原有函数的功能,而且还可以添加新的功能。 场景:对不可修改的第三方API进行添加新功能。
2.1 装饰器
def func1(func):
def func2():
print("aaaabbbb")
return func()
return func2
@func1
def myprint():
print("你好,我是print")
myprint()
2.2 装饰器函数带参数:多一层包装来接收装饰器的参数
def func1(func,sex):
def func2():
if sex == "men":
print("你不可以生娃")
if sex == "women":
print("你可以生娃")
return func()
return func2
@func1(sex='men')
def men():
print("好好上班。")
@func1(sex='women')
def women():
print("好好上班。")
men()
@func1(sex='men')
TypeError: func1() missing 1 required positional argument: 'func'
但是这样会报错,所以其实还需要一个外层函数,如下:
def func0(sex):
def func1(func):
def func2():
if sex == "men":
print("你不可以生娃")
if sex == "women":
print("你可以生娃")
return func()
return func2
return func1
@func0(sex='men')
def men():
print("好好上班。")
@func0(sex='women')
def women():
print("好好上班。")
men()
women()
你不可以生娃
好好上班。
你可以生娃
好好上班。
2.3 被装饰的函数带参数:只需要在最内部函数传入
def func1(func):
def func2(x, y):
print(x, y)
x += 5
y += 5
return func(x, y)
return func2
@func1
def mysum(a, b):
print(a + b)
mysum(1, 2)
|