闭包
由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存
x = 300
def test1():
x=200
def test2():
# global x
nonlocal x
print('---1---x=%d'%x)
x=100
print('---2---x=%s'%x)
return test2
t1 = test1()
t1()
装饰器
装饰器就是用于拓展函数功能的一种函数,它的特殊之处,在于它的返回值也是一个函数,使用装饰器的好处就是,在不用更改原函数代码的前提下,给函数增加新的功能
def outside1(test):
print('执行了装饰器外部函数1')
def inside(*args,**kwargs):
print('welcome1')
return test(*args,**kwargs)
return inside
def outside2(test):
print('执行了装饰器外部函数2')
def inside(*args,**kwargs):
print('welcome2')
return test(*args,**kwargs)
return inside
@outside1
@outside2
def func(*args,**kwargs):
print(kwargs)
# print(*args,**kwargs)
# print('hello world')
#
# a = outside1(func)
# a()
func(a=1,b=2)
带参数的装饰器
def set_level(level_num):
def set_func(func):
def call_func(*args,**kwargs):
if level_num == 1:
print('---权限级别1,验证---')
elif level_num == 2:
print('---权限级别2,验证---')
elif level_num == 10:
print('---权限级别10,验证---')
return func()
return call_func
return set_func
@set_level(10)
def test1():
print('---test1---')
return 'ok'
@set_level(2)
def test2():
print('---test2---')
return 'ok'
test1()
test2()
# 1、调用set_func并且将1当做实参传递
# 2、用上一步调用的返回值,当做装饰器对test1函数进行装饰
闭包:
定义:在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一些变量称之为闭包
闭包的本质就是函数嵌套,就是在函数里面定义函数
内部函数可以引用外部函数的参数和变量
参数和变量不会被垃圾回收机制给回收
闭包的用途:可以存循环的索引值、做私有变量计数器
如果没有闭包,我们就需要更多的参数传递,也减少了代码的可移植性。
注意点:
由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存
装饰器:
装饰器就是用于拓展函数功能的一种函数,它的特殊之处,在于它的返回值也是一个函数,使用装饰器的好处就是,在不用更改原函数代码的前提下,给函数增加新的功能