PYTHON-函數對象,嵌套,名稱空間與做用域,閉包函數

一 函數是第一類對象,即函數能夠看成數據傳遞    1 能夠被引用    2 能夠看成參數傳遞    3 返回值能夠是函數    3 能夠看成容器類型的元素    def foo():        return len    f = foo    print(foo)    [foo, ]    函數嵌套(把大問題細分紅小問題,把小問題平道一塊兒解決)        函數的嵌套定義: 在函數內部又定義了其餘函數        函數的嵌套調用:在一個函數內部又調用其餘函數2.名稱空間與做用域:    什麼是名稱空間?        名稱空間:存放名字的地方,三種名稱空間,        (以前遺留的問題x=1,1存放於內存中,那名字x存放在哪裏呢?名稱空間正是存放名字x與1綁定關係的地方)        名稱空間Namespaces:指的就是存放名字與內存地址綁定關係的地方(內存空間)    名稱空間分爲三大類        內置名稱空間: 存放的是python解釋器自帶的名字            產生:python解釋器的啓動則產生            銷燬:python解釋器關閉則銷燬        全局名稱空間: 在頂級定義的名字            產生:執行python程序時產生            銷燬:python程序執行完畢後則銷燬        局部名稱空間: 在函數內定義的名字            產生: 在函數調用時臨時產生            銷燬: 在函數調用完畢後則銷燬    三種名稱空間的產生的前後順序: 內置->全局->局部        查找名字的順序:從當前位置往外一層一層查找            若是當前在局部名稱空間: 局部->全局->內置            若是當前在全局名稱空間: 全局->內置        須要注意的是:在全局沒法查看局部的,在局部能夠查看全局的,以下示例        # max=1        def f1():            # max=2            def f2():                # max=3                print(max)            f2()        f1()        print(max)做用域:    #一、做用域即做用範圍        - 全局範圍(內置名稱空間與全局名稱空間屬於該範圍):全局存活,全局有效       - 局部範圍(局部名稱空間屬於該範圍):臨時存活,局部有效        全局做用域:包含內置與全局名稱空間的名字            特色:全局存活,全局有效        局部做用域:包含局部名稱空間的名字            特色:臨時存活,局部有效    #二、!!!!!做用域關係是在函數定義階段就已經固定的,與函數的調用位置無關,以下    x=1    def f1():        def f2():            print(x)        return f2    x=100    def f3(func):        x=2        func()    x=10000    f3(f1())    #三、查看做用域:globals(),locals()        locals 是函數內的名字空間,包括局部變量和形參        globals 全局變量,函數定義所在模塊的名字空間global與nonlocal關鍵字        global  適用於函數內部修改全局變量的值        nonlocal  適用於嵌套函數中內部函數修改外部變量的值        若是沒有使用以上關鍵字,對全局變量或者外部變量進行修改,python會默認將全局變量隱藏起來4.閉包函數 = 函數對象 + 函數嵌套定義 + 做用域    閉包函數指的是定義在函數內部的函數,        而且該內部函數包含對外層函數做用域名字的引用    def outter(x):        def inner():            print(x)        return inner    f = outter(10)    #閉包的意義:返回的函數對象,不單單是一個函數對象,在該函數外還包裹了一層做用域,                這使得,該函數不管在何處調用,優先使用本身外層包裹的做用域    #應用領域:延遲計算(原來咱們是傳參,如今咱們是包起來)        from urllib.request import urlopen        def index(url):            def get():                return urlopen(url).read()            return get        baidu=index('http://www.baidu.com')        print(baidu().decode('utf-8'))
相關文章
相關標籤/搜索