伪知识之通俗易懂的解释基本函数,全局变量,局部变量,内嵌函数,闭包,作用域,装饰器的演变步骤【内向即耻辱--王奕君】

内容并不完全靠谱,仅供参考

#-----------------------函数【一】--------------------------
def boy():
    print('树德小学,袁维娜')
boy()
#                                        基本函数
#res:树德小学,袁维娜
def boy():
    print('真光中学,蔡一梦')  print(boy())                 

                           #把函数作为对象传入print中。print所输出的
                              #是函数return的对象,because 没有return对象。
                              #因此最后print输出结果为None

Res:

None

#-----------------------函数【二】--------------------------——————

改变全局变量

a=[100,200]
def pet():
    a.remove(200)
    print(a)                 注意在基本函数中可以引用a这里的a,函数默认是global(即全局)
pet()                           即函数中只能引用全局变量
print(a)
#res:
#[100]
#[100]

基本函数反面实列【1】:

a=[100,200]
def pet():
    a.remove(200)
    a+=[100]   ---错误语法:   这里的a 是一个局部变量为什么呢  因为python默认x+=y的语法中x是局部变量
    print(a)   ----那如何将局部变量变成全局变量呢?python引进了另一个函数global  该方法声明x+=y中的x 
pet()               是全局变量,而不是局部变量
print(a)
res:

local variable 'a' referenced before assignment

基本函数真实案列【1】:

a=[100,200]
def pet():
    a.remove(200)
    global a              global a  此时  python认为基本函数中a+=【10000000】 中的a不是局部变量而是全
    a+=[10000000]        局变量
    print(a)
pet()
print(a)
#res:
# [100, 10000000]
# [100, 10000000]

【内嵌函数】

a='地'     #a 在这里是全局变量
def girl():     #() 是环境信息      相对les()而言girl()是外部函数
    print('天')
    p='盖'          #p在girl()函数中是局部变量
    def les():  les()相对girl()而言是内部函数
                      #p不是局部变量,p是girl()的局部变量相对les()而言就是全局变量
                     #函数中的任何区域都可以引用外部函数外的变量-----girl()函数外的变量a
        print(a)
        print('王',p,sep='!')                       执行过程:

les()            #开始执行外部函数girl(),执行girl()的过程中,进入内部函数les()
girl()               #执行les(),执行完les(),外部函数girl()函数结束。
print(girl)         #打印girl外部函数的内存空间   ‘本质上无实际意义’ --<functiongirl at 0x01A7CDB0>--
                     内嵌函数就像是函数中的调用函数。如此理解:相当于调用了les()                                                         

Res:

王!盖                                                举例说明:

ab='宝'
def newhalf():
    print('河')
    p='塔'                     #<内部函数类似与调用函数>
    gay(p)

def gay(p):
    print(ab)
    print('镇',p,sep='!')

res:  河

       宝

       镇!塔

①  <内部函数,外部函数引用函数外变量>

代码实列:

y='海贼王'                     注意外部函数的变量是全局变量,该变量可以在外部函数,内部函数中引用。
def girl(s=None):
    # global y
    # y+=100
    def les():

     print(y)                   
    les()
girl() 
print(y)

res:

海贼王

海贼王

海贼王

海贼王

——————————【global and nolocal】————————————————

②  global

y='海贼王'
def girl(s=None):
    global y                         继续提醒:global的作用是在外部函数中修改函数外的变量
    y+='路飞'
    print(y)       
    def les(y):
        print(y)                     
        y+='100'
        print(y)                     总结:从中可以看出要想改变函数外的变量只能通过global一种方式。
                                      将函数外的变量作为内存环境引入函数中叶无法改变函数外的变量
    les(y)
girl()
print(y)

res:

海贼王路飞

海贼王路飞

海贼王路飞100

海贼王路飞

③                                           nolocal

y='海贼王'
def girl(s=None):
    global y
    y+='路飞'
    print(y)
    x=y                  

def les(y):
        print(y)
        nonlocal x
        x+='索隆'           注意如果使用global x则是错误语法。  global只能用在外部函数中,在内部函数中想修改全局变量使用x+=y的语法要使用nolocal。内部函数想修改函数外变量,只能通过传参的方式。
        y+='100'
        print(y)
        print(x)                          

    les(y)
girl()
print(y)

res:

海贼王路飞

海贼王路飞

海贼王路飞100

海贼王路飞索隆

海贼王路飞

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

【闭包】前传-------作用域:

作用域是程序运行时变量可被访问的范围,定义在函数内的变量是局部变量,局部变量的作用范围只能是函数内部范围内,它不能在函数外引用。

定义在模块最外层的变量是全局变量,它是全局范围内可见的,当然在函数里面也可以读取到全局变量的。

而在函数外部则不可以访问局部变量。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

【闭包】前传--------缘由

何为闭包,就是要明白闭包的在函数中的作用,为何要使用闭包。了解这个了,就能明白闭包的组成和关键要素。

Python中规定,在内部函数中只能引用全局变量---(函数外变量)

              但是不能修改函数外变量,

                        在内部函数想修改函数外变量,只能通过在内部函数中传参的方式修改。

                         【即传入内存环境 或 环境变量】但这里传入的环境变量是内部函数的局部变量

              局部变量无法再函数外中被引用,为了能引用内部函数的局部变量,

                        此时产生了产生了新的算法:闭包

a【闭包】后传--------算法实战

y='yellow'
def girl(s=None):
    global y
    y+='red'
    print(y)
    x=y
    def les(y):
        print(y)
        nonlocal x
        x+='black'

        y+='100'
        print(y)
        print(x)

        return y                                
                        

    return les(y)                               在内部函数外一定要return 内部函数,要想调用return的               
print(girl())                               内部函数内容一定要在内部函数里面return局部变量
print(y,'--------------------------')        

res:                                             注意要点:永远要知道闭包的目的就一个在函数外引用的内部函数的局部变量

yellowred

yellowred

yellowred100

yellowredblack

yellowred100

yellowred--------------------------

【简单的装饰器】-----【简单的语法糖】

简而言之:@a就是将 b 传递给a(),并返回新的 b = a(b)

print(1)                                         关于装饰器与语法糖,通过调试方法来一探究竟。
def newhalf(qf):                执行函数:【1】输出1---【2】输出5---【3】进入@newhalf----
    print(2)       与装饰器对应的函数       【4】进入newhalf(qf)中---【5】输出2--【6】return qf()

                                         【7】进入@newhalf---【8】输出3--【9】输出butterfly
    return qf()                             【10】进入return qf()---【11】进入@newhalf--【12】输出4
print(5)                                                                                               
@newhalf==cowgirl=newhalf(cowgirl)         --------------语法糖  |   整体是装饰器                                                       
def cow_girl():                               被装饰的函数             |                                 
   print(3)                                   装饰器                   |                                
   print('butterfly')                                                 |                                   
print(4)

Res:                                好通过以上的了解,现在把装饰器变成闭包函数。

1                                         从中了解装饰器算法的本质。

5                                        

2

3

butterfly

猜你喜欢

转载自blog.csdn.net/qq_37995231/article/details/82819543
今日推荐