一、global与nonlocal
#global
x = 1
def f1():
global x # 声明此处是全部变量x
x = 2
print(x)
f1() # 调用f1后,修改了全局变量x = 2
print(x) # 打印结果为2
# nonlocal
def f1():
x = 1
def f2():
nonlocal x # 此处声明使用外层函数的变量x
x = 2 # 将外层函数进行了修改
print(x) #
f2()
print(x) # 因为f1()下的x已经被修改,所以打印结果为2
f1()
二、闭包函数
1、什么是闭包函数?
①、根据名词解析:
闭:定义在函数内部的函数,特点是只能在函数内部使用;
包:该函数引用了一个名字,改名字来自函数外层,但又不是全局名称空间
# 闭包函数
def f1()
x = 1
def f2():
print(x)
f2()
# f2()就是一个闭包函数
②、闭包函数升级:能够在全局名称空间使用闭包函数名称
在闭包函数中,使用了函数嵌套,函数名称空间与定义域的知识,要想能够在全局定义域使用闭包函数,就需要使用函数对象的知识
函数可以如变量一般被引用、被当做参数,当然也能被用来赋值给变量,函数名实质上绑定了存放函数内存空间的内存地址,在不+()的情况下,我们得到的是内存地址,就可以赋值到全局名称空间
# 闭包函数
def f1()
x = 1
def f2():
print(x)
return f2 # 此处返回函数f2的内存地址,千万不要加括号
f = f1() # f ------>调用f1()----->返回f2内存地址
f() # 此时,f指向了f2的内存地址,并且是全局名称空间的名称
③为函数传参的两种方式
- 直接以参数的形式传入
- 通过闭包函数的形式包给函数
# 给函数传参的两种方式
#方式一
def f1(x):
print(x)
f1("ksdffbksd")
#方式二
def f2():
x = 2
def f3():
print(x)
f2()
f2()
三、装饰器
1、什么是装饰器
装饰器思想:在开放封闭原则下为被修饰对象添加新功能,所谓开放原则是对拓展新功能是开放的,封闭原则是指对源代码不进行修改,不改变源代码调用方式。
实际生产中,如果需要对以上线的程序添加新功能,但是为了保证程序运行的稳定性与安全性,会根据装饰器思想进行添加。
装饰器:指创建一个工具,在遵循以下原则前提下,为被装饰对象添加新功能
原则1:不修改被装饰对象源代码
原则2:不修改被装饰对象调用方式
2、装饰器详解
现有需求:为函数增加计时功能,该如何实现?
- 方案一:修改源代码