函數的嵌套,名稱空間,以及做用域

函數的嵌套,名稱空間,以及做用域

一、調用函數的三種形式

def func():
    print('from func')
func()#第一種函數名加括號


def max_2(x,y):
    if x > y:
        return x
    else:
        return y
res = max_2(10,3)
print(res)#表達式去調用


def max_2(x,y):
    if x > y:
        return x
    else:
        return y
res = max_2(10,max(2,3))
print(res)#函數做爲參數的形式

二、函數的嵌套

def func1():
    print('from func1')

def func2():
    func1()
    print('from func2')

func2()
>>>from func1
from func2

三、函數的名稱空間

  • 什麼是名稱空間?python

    名稱空間就是用來存放名字的空間。函數

  • 名稱空間的做用code

    若是你想訪問一個變量值,必須先訪問對應的名稱空間,拿到對應的內存地址的綁定關係blog

  • 名稱空間的分類生命週期

    一、內置名稱空間:內存

    就是python解釋器一啓動就可使用的名字,好比print,len,max,input等等咱們以前也並無定義過,能夠直接拿來使用的名字,這些名字就存儲在內置名稱空間中作用域

    二、全局的名稱空間:input

    存放文件級別的名字,就是全局名稱空間,是在程序從上到下被執行的過程當中依次加載進內存的,放置了咱們設置了全部變量名和函數名,if,while,for,內部定義的名字執行以後都存放在全局名稱空間class

    三、局部名稱空間變量

    就是在函數內部定義的全部名字,注意的是當調用函數的時候,纔會產生這個名稱空間,隨着函數執行的結束,命名空間就消失

  • 生命週期:

    一、內置名稱空間

    在python解釋器啓動的時候生效,關閉python解釋器的時候失效

    二、全局名稱空間

    當你啓動這個py 文件的時候生效,當前頁面代碼執行結束以後失效

    三、局部名稱空間

    當你調用函數的時候生效,函數一旦調用完畢就失效

  • 名稱空間的使用範圍

    一、在局部能夠全局名稱,內置名稱

    x = 1
    def func():
        print(x)#使用了全局名稱x,以及使用了內置名稱print
    
    func()
    >>>1

    二、在全局可使用內置名稱空間,但不可以使用局部名稱空間

    x = 1
    def func():
        a = 1
        print(x)#使用了全局名稱x,以及使用了內置名稱print
    
    func()
    print(a)#NameError: name 'a' is not defined
            #此時a已經消失了

    三、在內置不可以使用局部和全局的名稱

    x = 1
    def func():
        x = 2
        print(x)#使用了局部名稱x
        def func1():
            x = 3#我本身有就用我本身的,沒有就去找上一級,若是上一級都沒去找內置,若是內置都沒有那就保存
            print(x)
        func1()
    
    func()
    >>>2
    >>>3
    
    x = 1
    def func():
        x = 2
        print(x)#使用了局部名稱x
        def func1():
            print(x)#我本身沒有就用上一級的x=2
        func1()
    
    func()
    >>>2
    >>>2
    
    x = 1
    def func():
        print(x)
        def func1():
            print(x)#我本身沒有就用上一級的,上一級也沒有就再找上一級
        func1()
    
    func()
    >>>1
    >>>1
    x = 1
    
    def index(arg = x):#默認參數,此時已經將x=1賦值給arg
        print(x)
        print(arg)
    
    x = 2
    index()
    >>>2
    >>>1

四、做用域的分類

一、全局做用域

全局能夠調用的名字就存在於全局做用域

內置名稱空間+全局名稱空間

二、局部做用域

局部能夠調用的名字就存放於局部做用域

局部名稱空間

對於不可變類型,在局部能夠查看全局做用域中的變量。可是不能直接修改,

若是想要修改,須要在程序中添加一個global變量,那麼這個變量在局部的全部操做將對全局的變量有效

x = 1
def func():
    global x#聲明此時的x就是全局變量
    x =2
    print(x)


func()
print(x)
>>>2
>>>2

#在局部修改外部函數的變量

def func():
    x = 1
    def func1():
        nonlocal x
        x = 3

    func1()
    print(x)#經過nonlocal就能夠修改離他當前最近的一個外層變量的值,此時不會打印x=1,會打印x=3

func()
>>>3

加油吧,亞峯gogogo

相關文章
相關標籤/搜索