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


一、名稱空間和作用域

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

二、函數的嵌套

1、函數的嵌套調用
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()

三、函數的使用

1、函數可以被當做變量賦值
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()的結果

2、函數可以當做參數傳遞

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

四、閉包:內部函數的代碼包含對外部作用域的引用,但一定不是對全局作用域的引用,閉包函數一定有__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
    
    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM