提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
一、闭包
1.什么是闭包?
闭包,定义函数时,在其内部又定义了一个函数,内部函数的内部作用域引用了外部函数的局部变量,外部函数返回内部函数,这种函数嵌套的方式就是闭包。
# 闭包函数
# outer为外部函数,a、b为其临时变量
def outer(a):
b = 12
# inner为内部函数
def inner():
print(a+b)
return inner # 返回内部函数引用
if __name__ == '__main__':
number = outer(6)
number() # 18
2.global与nonlocal
2.1、什么是global?
global关键字用来在函数或局部作用域下对全局变量修改
# number 为全局变量
number = 1
# 函数
def global_test():
global number
number += 2
print(number)
global_test() # number为3
2.2、什么是nonlocal?
nonlocal是外部函数嵌套下的变量
def nonlocal_test():
num = 0
def non_1():
nonlocal num
num += 2
return num
return non_1
abc = nonlocal_test()
print(abc()) # 2
print(abc()) # 4
print(abc()) # 6
2.3 、global与nonlocal 的区别?
1.global可以用在任何地方,包括上层函数与嵌套函数中,对未定义变量修饰后也可直接使用。
2.nonlocal只能用于嵌套函数,并且外层函数中必须定义了相应的局部变量。
3.global是对全局变量的修改,nonlocal是对上一级函数的局部变量进行修改
二、装饰器
1.什么是装饰器?
装饰器,它是闭包的一种应用形式,可以在不改变源码的情况下扩展函数的功能。使用\@高阶函数去装饰另一个函数,进行功能扩展。
装饰器
import functools
def login(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print('call %s():' % func.__name__)
print('args = {}'.format(*args))
return func(*args, **kwargs)
return wrapper
调用
@login
def test(p):
print(test.__name__ + " param: " + p)
test("I'm a param")
输出
call test():
args = I'm a param
test param: I'm a param