迭代器和生成器使用注意點

2021-08-22 13:08:47 字數 2144 閱讀 5945

func 裡面的yield,要呼叫對應方法的next即,next(func),自己看**時也要觀察誰對應誰

def fibonacci(n, w=0):  # 生成器函式 - 斐波那契

a, b, counter = 0, 1, 0

while true:

if (counter > n):

return

yield a

a, b = b, a + b

print('%d,%d' % (a, b))

counter += 1

f = fibonacci(10, 0)

# 取出的方法得用next

# for i in f:

#     print(i,end=',')

# 使用了yield的方法就叫做生成器,生成器是乙個函式,是乙個返回迭代器的函式

# python 遍歷迭代器的方式比較固定,通常用while方法迭代

print(next(f),end='--')

print(next(f),end='--')

print(next(f),end='--')

print()

result:

0--1,1

1--1,2

1--

while true:

try:

print(next(f), end='--')

except:

# sys.exit()

break

result:

0--1,1

1--1,2

1--2,3

2--3,5

3--5,8

5--8,13

8--13,21

13--21,34

21--34,55

34--55,89

55--89,144

note:根據返回結果,我們可以知道

在呼叫生成器執行的過程中,每次遇到 yield 時函式會暫停並儲存當前所有的執行資訊,返回 yield 的值, 並在下一次執行 next() 方法時從當前位置繼續執行。

呼叫乙個生成器函式,返回的是乙個迭代器物件。

乙個帶有 yield 的函式就是乙個 generator,它和普通函式不同,生成乙個 generator 看起來像函式呼叫,但不會執行任何函式**,直到對其呼叫 next()(在 for 迴圈中會自動呼叫 next())才開始執行。雖然執行流程仍按函式的流程執行,但每執行到乙個 yield 語句就會中斷,並返回乙個迭代值,下次執行時從 yield 的下乙個語句繼續執行。看起來就好像乙個函式在正常執行的過程中被 yield 中斷了數次,每次中斷都會通過 yield 返回當前的迭代值。

yield 的好處是顯而易見的,把乙個函式改寫為乙個 generator 就獲得了迭代能力,比起用類的例項儲存狀態來計算下乙個 next() 的值,不僅**簡潔,而且執行流程異常清晰。

什麼情況下需要使用 yield?

乙個函式 f,f 返回乙個 list,這個 list 是動態計算出來的(不管是數學上的計算還是邏輯上的讀取格式化),並且這個 list 會很大(無論是固定很大還是隨著輸入引數的增大而增大),這個時候,我們希望每次呼叫這個函式並使用迭代器進行迴圈的時候乙個乙個的得到每個 list 元素而不是直接得到乙個完整的 list 來節省記憶體,這個時候 yield 就很有用。

==>通常用於只遍歷一次的情況,如果需要多次遍歷,用yield則不方便。

在乙個 generator function 中,如果沒有 return,則預設執行至函式完畢,如果在執行過程中 return,則直接丟擲 stopiteration 終止迭代。

另乙個 yield 的例子**於檔案讀取。如果直接對檔案物件呼叫 read() 方法,會導致不可**的記憶體占用。好的方法是利用固定長度的緩衝區來不斷讀取檔案內容。通過 yield,我們不再需要編寫讀檔案的迭代類,就可以輕鬆實現檔案讀取:

清單 9. 另乙個 yield 的例子

def read_file(fpath): block_size = 1024 with open(fpath, 'rb') as f: while true: block = f.read(block_size) if block: yield block else: return

迭代器和生成器,使用生成器讀取大檔案

可迭代型別 和 迭代器 什麼是迭代協議。迭代器是什麼?是訪問集合類的一種方式,一般用來遍歷資料。for迴圈可以遍歷資料 迭代器和以下標的訪問方式不一樣,迭代器是不能返回的 後退 alist 0 alist 2 alist 1 是不行的 下標訪問 背後的原理 協議 是 getitem 迭代器提供了一種...

生成器和迭代器

可以直接作用於for迴圈的物件稱為可迭代物件 iterable.可以用isinstance 判斷乙個物件是否是iterable物件。isinstance iterable true isinstance iterable true isinstance 235,iterable false 而生成器...

迭代器和生成器

1 迭代器的概念 print dir 告訴我列表的所有用法 有雙下劃線的所有方法叫做雙下方法,是c語言已經寫好的方法。你可以用不止一種方法呼叫它。列表的用法變集合 set dir 求交集 set dir set dir set dir 求列表,字典,字串它們的用法的交集 他們共同的用法 iterab...