裝飾器一

一:函數名解析閉包

首先,咱們定義一個函數,分別打印他們函數和變量名app

def func():
    print(111)
print(func())
print(func)
print(())

打印結果:函數

解讀:首先打印111,是由於執行了func()這個函數。測試

           其次打印的是空,none,是由於函數沒有返回值。spa

           在次打印得是函數名內存地址,由於定義函數自己就是一個變量。內存

           最後打印()是由於裏面沒有東西,放什麼打印什麼for循環

 

2 函數名能夠賦值。變量

def func():
    print(111)
def func1():
    print(222)
def func2():
    print(333)
f=func
x=func1
y=func2
f()
x()
y()
l1=[f(),x(),y()]
for i in l1:
    print(i)

打印結果:循環

解讀:引用

第一次先打印111,222,333是由於函數調用結果

第二次打印此結果是由於for循環打開這個函數,上面分別調用而成。

第三次打印是none是由於函數沒有返回值,打印這個函數,就是none。

 

函數名練習2

def func2():
    print(111)
def func3(x):
    print(222)
    x()
func3(func2)

執行結果:222,111

解讀:func3(fuc2)將func2傳值給x,打印222,x()執行上面func2函數,打印111

 

練習3

def func2():
    print(222)
def func3(x):
    print(a)  # func2()
    return a
a = 3
ret = func3(a)
print(ret)

打印結果:3,3

解析:沒通過func2函數,因此不執行222

def func2():
    print(222)
def func3(x):
    # print(x)  # func2()
    return x
f = func2
f()
ret = func3(func2)  # x func2
ret()
func3(func2)()

打印結果:222,222,222

第一個打印222,f()調用執行了一次。

第二次打印 return x給了fun3(fun2)   而x=func2  ret接收這個x   ret()就是print222

第三次func3(func2)()   就至關於x()  也就是又打印了一遍222

 

二:閉包函數

內部函數引用外部函數(非全局變量)的變量

def  func():
    x=1
    def func1():
         print(x)
    func1()
    print( func1.__closure__)
func()

測試是否是閉包函數的方法

函數名.__closure__,而後打印出來包含cell就是閉包

以下圖就不是一個閉包,由於是全局變量,打印結果是1,NONE,none就說明不是一個閉包。

閉包陷阱

# 在外層函數的內部,執行inner()
# return inner
def wrapper():
    def inner():
        print(666)
    return inner
# wrapper()  # inner
wrapper()()

執行過程是什麼?

首先在內存開闢一個臨時空間將wrapper函數存儲裏面,而後wrapper()開始執行函數,返回inner,給最後,此時inner=wrapper(),後面加上(),開始執行inner裏面函數,打印666,此時結束。

爲何不是閉包,由於沒有傳值,返回值顯示none,內部不沒有調用外部的值,談什麼閉包。

def wrapper():
    def i():
        def inner():
            print(666)
        print(inner.__closure__)
        return inner
    return i
# wrapper()  # inner
wrapper()()
相關文章
相關標籤/搜索