2018-07-12(裝飾器、迭代器、生成器)

裝飾器、迭代器、生成器

1、裝飾器:

裝飾器實(shí)現(xiàn)原理有兩種,一種通過類,主要是通過__call__

class Decorator(object):
"""
這是一個(gè)裝飾器
"""

def __init__(self, func):
    print('---初始化---')
    print('func name is %s' % func.__name__)
    self.__func = func

def __call__(self, *args, **kwargs):
    print('---裝飾器的功能---')
    self.__func()


# __call__的用法
# class Test():
#     def __call__(self):
#         print('call me!')
# 
# t = Test()
# t()  # call me


@Decorator
def test():
    print('---test---')

test()


# @Decorator的作用
# test = Decorator(test)

還有一種實(shí)現(xiàn)的原理是閉包,Python支持一個(gè)叫做函數(shù)閉包的特性,嵌套定義在非全局作用域里面的函數(shù)能夠記住它在被定義時(shí)所處的封閉的命名空間

def outer(some_func):
    def inner(*args, **kwargs):
        print "before some_func"
        ret = some_func(*args, **kwargs)
        return ret + 1
    return inner
def foo():
    return 1
decorated = outer(foo)
decorated()
# 當(dāng)調(diào)用外部函數(shù)時(shí)會(huì)返回內(nèi)部函數(shù)的引用,將要裝飾的函數(shù)引用作為變量傳進(jìn)去,再將返回的內(nèi)部函數(shù)賦值給原來的函數(shù)名,
# 原函數(shù)名()實(shí)際上運(yùn)行的是inner()

實(shí)際應(yīng)用時(shí)通常用@裝飾函數(shù)名應(yīng)用到函數(shù)上,@方法本質(zhì)上是語法糖,讓其實(shí)現(xiàn)更加簡潔,本質(zhì)上是上面的原理。

2、迭代器:

符合以下格式的對象被稱為迭代器

class Iterator(object):

def __init__(self):
    pass

def __iter__(self):
    """
    通過該方法取得迭代器對象
    """
    return self

def __next__(self):
    """
    取得下一個(gè)迭代的值,直到結(jié)尾拋出StopIteration異常
    """
    pass

迭代器與可迭代對象的區(qū)別:

1、可迭代對象是實(shí)現(xiàn)了iter()方法的對象,iter()可以返回一個(gè)迭代器對象;

2、迭代器對象是實(shí)現(xiàn)了next()方法的對象,其中他的iter()返回的是迭代器對象本身;

3、迭代器本身一定是個(gè)可迭代對象。

備注:通過isinstance(對象, Iterable)方法判斷一個(gè)對象是否是可迭代對象,iter(可迭代對象)可以返回該可迭代對象的迭代器,next(迭代器)返回可迭代對象的下一條數(shù)據(jù)。

3、生成器

def fib(n):
current_index = 0
num1, num2 = 0, 1
while current_index < n:
    # print(num1) # 打印斐波那契數(shù)列
    """
     1. 假如函數(shù)中有yield,則不再是函數(shù),而是生成器
     2. yield 會(huì)產(chǎn)生一個(gè)斷點(diǎn)
     3. 假如yield后面緊接著一個(gè)數(shù)據(jù),就會(huì)把數(shù)據(jù)返回,
        作為next()函數(shù)或者for ...in...迭代出的下一個(gè)值
    """
    temp = yield num1
    print(temp)
    num1, num2 = num2, num1 + num2
    current_index += 1

yield關(guān)鍵字有兩點(diǎn)作用:

1、保存當(dāng)前運(yùn)行狀態(tài)(斷點(diǎn)),然后暫停執(zhí)行,即將生成器(函數(shù))掛起;

2、將yield關(guān)鍵字后面表達(dá)式的值作為返回值返回,此時(shí)可以理解為起到了return的作用。

3、temp當(dāng)使用 生成器對象.send(msg) 喚醒生成器時(shí)可以接受msg,next(生成器對象)的和上者都可以用來喚醒并執(zhí)行生成器,不同的是send()函數(shù)的一個(gè)好處是可以在喚醒的同時(shí)向斷點(diǎn)處傳入一個(gè)附加數(shù)據(jù)。

迭代器是本質(zhì)上是生成器,其實(shí)現(xiàn)方式更加優(yōu)雅

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容