迭代模式:對外提供一個接口义桂,實現(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)方法而言更加的簡潔剧劝。
迭代器模式常應(yīng)用場景是在只提供接口而不暴露內(nèi)部機制的場景中,yield關(guān)鍵詞在python協(xié)程中也有應(yīng)用抓歼。
迭代器讥此、生成器拢锹、可迭代對象概念
生成器:對于一個數(shù)據(jù)集合,生成器并不記住每個元素值萄喳,但在循環(huán)中記錄元素位置并根據(jù)元素生成規(guī)則推算出數(shù)值卒稳,這種邊循環(huán)邊計算的形式是生成器。
迭代器:是一種訪問集合的方式他巨,記住遍歷位置充坑,從第一個元素開始訪問,直到最后一個元素染突,并且只能前進(jìn)不能后退捻爷。
可迭代對象:像list、set份企、str這種可以通過for遍歷的類型是可迭代對象也榄,這種遍歷順序可以從尾到頭。
凡是通過next()訪問的對象都是迭代器類型司志,也就是說生成器就是迭代器的一種甜紫;凡是可以通過for遍歷的都是可迭代對象,可迭代對象可以通過iter()轉(zhuǎn)化為迭代器骂远。
生成器中有幾個關(guā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__()
迭代器和可迭代對象有幾個關(guān)鍵詞: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)
其中奧秘可能得親身恭行,才能探知刘莹,這里只做拋磚引玉阎毅。