迭代模式:對外提供一個接口,實現(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