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()

 

 

 

posted @ 2019-04-28 22:12  呼吸决定丶  阅读(111)  评论(0)    收藏  举报