python設計模式(十七):迭代器模式——迭代器與生成器

迭代模式:對外提供一個接口,實現(xiàn)順序訪問聚合數(shù)據(jù),但是不顯示該數(shù)據(jù)的內(nèi)部機制。這就是Python中大名鼎鼎的迭代器。

實現(xiàn)迭代模式對于Python來說沒有多余的代碼,寥寥幾行代碼足可以實現(xiàn)迭代模式。

示例code:

# -*- coding:utf-8 -*-

def FibonacciSequence(n):
    x = 0
    y = 1
    i = 1
    while True:
        yield y
        if i == n:
            break
        x, y = y, x+y
        i += 1

if __name__ == '__main__':
    test = FibonacciSequence(7)
    next(test)
    1
    next(test)
    1
    next(test)
    2
    next(test)
    3
    next(test)
    5
    next(test)
    8
    next(test)
    13
    next(test)

以上是使用迭代模式輸出斐波那契數(shù)列的前n列,較傳統(tǒng)的實現(xiàn)方法而言更加的簡潔。

迭代器模式常應用場景是在只提供接口而不暴露內(nèi)部機制的場景中,yield關鍵詞在python協(xié)程中也有應用。

迭代器、生成器、可迭代對象概念

生成器:對于一個數(shù)據(jù)集合,生成器并不記住每個元素值,但在循環(huán)中記錄元素位置并根據(jù)元素生成規(guī)則推算出數(shù)值,這種邊循環(huán)邊計算的形式是生成器。

迭代器:是一種訪問集合的方式,記住遍歷位置,從第一個元素開始訪問,直到最后一個元素,并且只能前進不能后退。

可迭代對象:像list、set、str這種可以通過for遍歷的類型是可迭代對象,這種遍歷順序可以從尾到頭。

凡是通過next()訪問的對象都是迭代器類型,也就是說生成器就是迭代器的一種;凡是可以通過for遍歷的都是可迭代對象,可迭代對象可以通過iter()轉(zhuǎn)化為迭代器。

生成器中有幾個關鍵詞:yield、yield form、send、next()、next()具體作用見示例代碼。

# 生成器示例

def test():
    a = 1
    while True:
        b = yield a
        a += b

def test1():
    yield from test()   # yield form 是創(chuàng)建一個嵌套的生成器,form后面跟一個生成器,每次執(zhí)行到y(tǒng)ield form后會先把內(nèi)層的生成器執(zhí)行完。

if __name__ == '__main__':
    fn = test()
    next(fn)    # 通過next訪問內(nèi)部元素
    fn.__next__()   # 通過__next__()方法訪問內(nèi)部元素,作用同上
    fn.send(4)  # send有next的作用,同時向生成器內(nèi)部的yield左邊等式賦值

    fn1 = test1()
    fn.__next__()

迭代器和可迭代對象有幾個關鍵詞:next()、itre()、for

# 迭代器及可迭代對象

a = (i for i in range(50))
b = [1, 2, 3, 4, 5, 6]

if __name__ == '__main__':
    next(a)
    c = iter(b)
    next(c)

其中奧秘可能得親身恭行,才能探知,這里只做拋磚引玉。

image
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容