Python基礎--函數的嵌套和閉包

1、名稱空間和做用域

名稱空間:Python全部有關命名的操做都是在操做名稱空間,例如變量名,函數名
    一、內置名稱空間:Python解釋器提供好的功能,解釋器啓動跟着一塊兒啓動,是全局做用域
    二、全局名稱空間:Python中頂行寫的,不在函數內部定義的,都是全局名稱空間,在運行的時候會產生名稱空間,是全局做用域
    三、局部名稱空間:在一個小範圍定義,只能當前範圍及其子空間內運行,例如在函數內部定義的,是局部做用域

2、函數的嵌套

一、函數的嵌套調用
二、函數的嵌套定義
x = 1111111111111111
def f1():
    #x=1
    print('------>f1 ',x)
    def f2():
        #x = 2
        print('---->f2 ',x)
        def f3():
            x=3
            print('-->f3 ',x)
        f3()     
    f2()
f1()

3、函數的使用

一、函數能夠被當作變量賦值
def foo():
    print("foo")
print(foo)          #打印foo的內存地址空間,函數的名字在不帶小括號時表示的是函數的內存地址
f=foo               #把foo的內存地址空間作值賦值給f變量
print(f)            #打印f,起始就是打印foo的內存地址空間
f()                 #f()事實上就是執行foo函數,等同於foo()


打印結果爲
<function foo at 0x0000000000B91378>    #print(foo)的結果
<function foo at 0x0000000000B91378>    #print(f)的結果
foo                                     #執行f()的結果,實際就是執行foo()的結果

二、函數能夠當作參數傳遞閉包

def foo():
    print("foo")
print(foo)          #打印foo的內存地址空間
f=foo               #把foo的內存地址空間作值賦值給f變量
print(f)            #打印f,起始就是打印foo的內存地址空間
f()                 #f()事實上就是執行foo函數,等同於foo()

def bar(func):
    print(func)     #這個是打印foo()函數的內存地址
    func()          #func是foo的內存地址,加()實際就是執行foo()函數
    return func
f = bar(foo)        #這個是獲取bar的返回值
print(f)            #打印f,就是打印bar()的返回值,就是foo()的內存地址,和print(func)相同
f()                 #f是bar

def bar(func):
    print(func)

bar(foo())      #這個是先執行foo()行數,執行函數裏的代碼,先打印foo,而後把foo()的返回值做爲bar()函數的實參傳遞給bar,foo()沒有返回值,因此是None
                #結果就是先輸出一個  "foo"     而後bar(None),把none傳遞給bar()函數,打印No

4、閉包:內部函數的代碼包含對外部做用域的引用,但必定不是對全局做用域的引用,閉包函數必定有__closure__方法

x=1
def f1():
    x=2
    y=3
    def f2():
        print(x)
        y
    return f2
f=f1()                  #f是f2的內存地址
f()                     #f()就是f2(),能夠保證f2()能夠在任何位置執行,而不受做用域的限制
print(f.__closure__)    #打印結果是元組,元組個數表明的是閉包所引用的上次函數的元素個數
print(f.__closure__[0]) #結果是元組,能夠使用索引的方式查看
print(f.__closure__[0].cell_contents)   #查看指定元組所對應的應用上層參數的值
def init(func):
    def wrapper(*args,**kwargs):
        res=func(*args,**kwargs)
        return res
    return wrapper
相關文章
相關標籤/搜索