1. 程式人生 > >Python迭代器 閉包 裝飾器

Python迭代器 閉包 裝飾器

迭代器:

可迭代物件:生成器(range)是Iterator             而list  tuple dict set  str是Iterable 把他們轉換成Iterator可以用iter()函式     可以用for進行迴圈取到  可以用next()進行取值

使用isinstance("xxx",Iterable)  判斷xxx是否是可以迭代

 

閉包:

def test():

    pass

b=test

b()也指向test記憶體空間 ,可以呼叫test()

 

def test(number):
    
    def test_in():
        print number+100  #內部定義了一個方法並且呼叫了外部的變數  這種方式叫做閉包
    return test_in

ret=test(100)     # 此時ret指向test_in()

ret()      #print 200

 

裝飾器:(語法糖)

def w1(func):
    def inner():
        print "驗證階段"
        func()
    return inner
def f1():
    print "_____f1____"
def f2():
    print "______f2____"

f1=w1(f1)
f1()    #這樣在沒有改變f1()呼叫的時候就能給每個被呼叫函式加上驗證程式碼

裝飾器方法

@w1          #這樣的方法等價於f1=w1(f1)

def  f1():

        print "_____f1____"

多個裝飾器的時候;

@w1
@w2     #先裝飾下面的w2  先把f1裝飾一遍成為新的f1 然後通過@w1再裝飾一遍成為又一個f1
def f1():
    print "_____f1____"

python直譯器執行到@w1的時候就開始裝飾,而不是等到呼叫的時候裝飾

如果f1有引數  那麼裝飾方法的內部方法也必須有引數,內部引數對於外界引數的呼叫也需要有引數

不定長引數的話  上面新增引數的地方新增*arg,**args即可

當有被裝飾方法有返回引數的時候,需要在內部類呼叫函式的時候需要有返回值和return

 

通用裝飾器:

def func(functionName):
    def func_in(*arg,**kwargs):
        ret=functionName(*arg,**kwargs)
        return ret
    return func_in