day13
函数的嵌套定义
在一个函数的内部定义另一个函数。①一个函数想使用另一个函数的局部变量,可以将fn2直接定义到fn1内部,这样fn2就可直接访问fn1的变量②函数fn2名字就变成fn1的局部变量,正常只能在fn1中使用,可以将fn2函数对象作为fn1函数的返回值③在外部也用同名的变量fn2来接收fn1函数的执行结果,那么fn2也就可以在外部使用。
global关键字
作用:将局部的变量提升为全局变量
num = 888
def fn1():
global num
num = 666 #没用global修饰,num就是自己局部的变量
def fn2():
print(num) #666(无global num则为888)有global修饰,num就是全局的num,全局中只能出现一个num,如果出现了值的改变,大家一起变。
fn1()
fn2()
注:1.全局没有同名变量,直接提升局部变量为全局变量。(全局变量不会随函数调用而销毁)
2.有同名变量,就是统一全局与局部的同名变量(用global声明,局部就可改变全局变量的值)
nonlocal关键字
作用:将局部的变量提升为嵌套局部变量
def outer():
num = 888
def inner():
nonlocal num
num = 666
inner()
print(num) #666(无nonlocal num为888)
outer()
1.必须有同名嵌套局部变量,统一嵌套局部与局部的同名变量
2.如果局部想改变嵌套局部变量的值,可用nonlocal声明该变量
闭包
被函数包裹的定义在函数内部的函数。
闭包应用场景:1.闭包中使用的变量可以被外层函数所传递---外层函数可为闭包传递参数
2.延迟执行
完整的闭包结构:1.将函数进行闭包处理;2.提升函数名的作用域
案例:延迟加载
def get_site(url): #url='https://www.baidu.com'
def site():
response=requests.get(url)
if response.status_code == 200:
print(response.text)
return site
baidu=get_site('https://www.baidu.com')
python=get_site('https://www.python.org')
1.不能修改源代码 ①无权修改②功能不特有③修改的位置多个,需要一一修改
2.不能修改原函数的调用方式
开放封闭原则:在1.2情况下,为函数添加新功能
弊端:原项目的所有函数调用都要修改
装饰品公式(满足开放封闭原则的一个闭包应用)
def outer(func):
def inner(*args,**kwargs): #outer语法来调用outer,规定传入被传入装饰的对象,参数固定为一个
pass #新功能位
func(*args,**kwargs):
res = func(*args,**kwargs): #解压带给原功能
pass #新功能位
return res
return inner
@outer #使用装饰品(outer),将功能装饰成闭包,得到新功能(inner),用被装饰的函数名去接受装饰器的执行结果,调用装饰器时传入被装饰的函数对象。
def fn():
pass #fn = outer(fn) =inner
#表面感觉调用的是原函数,本质调用的是闭包(inner),使用fn调用和fn定义及inner需要参数统一fn()

浙公网安备 33010602011771号