python之生成器yeild

2022-07-22 09:12:14 字數 1404 閱讀 7142

思考:

首先思考這樣乙個問題:

建立乙個列表,但是記憶體受限,容量一定是有限的。那麼如果建立了乙個包含100萬個元素的列表,不僅占用很大的儲存空間,而我們僅僅需要訪問前面幾個元素,那後面絕大多數元素占用的空間都白白浪費了?

這個時候就需要乙個容器,在我們需要資料的時候拿出來,不取資料的時候就釋放掉。這樣就能夠節省資源和空間。

yield的作用:

把乙個函式變成乙個生成器,起到乙個延遲的作用,在需要的時候產生結果,節省資源。與宣告乙個序列相比,生成器在不使用的時候不占用記憶體。

1、首先實現乙個功能,建立乙個列表,然後挨個取出其中的元素。

def

getnum(n):

i =0

while i print

(i) i += 1getnum(5)

2、在這個基礎上新增乙個功能,每次呼叫這個函式都要返回乙個值。

但是加入return之後整個函式就退出了,下次再使用這個需要需要從頭開始,那能不能實現接著上次停掉的地方開始呢?

def getnum(n):

i = 0

while i < n:

return i

i += 1

a = getnum(5)

print(a)

3、yeild。如果暫時想不明白,就把它看成return,但與return不同的是返回乙個值並不會退出函式,而是停在這,直到下次被喚醒。

yield與return返回相同的值,區別在於return返回後,函式狀態終止,而yield會儲存當前函式的執行狀態,再次呼叫時,函式又回到之前儲存的狀態繼續執行。

但是,如果直接print,發現返回的是乙個記憶體位址。並不是我們想象的那個東西。

此時,對應於生成器的使用有乙個專門的關鍵字next,就是相當於告訴生成器往下走一步。直至結束

def getnum(n):

i = 0

while i < n:

yield i

i += 1

a = getnum(5)

print(a)

##呼叫生成器的兩種方式

print(next(a))

print(a.__next__)

最後,那麼這個生成器有什麼用呢?加入你有100萬張影象,而每次你都只取n張,下次再取的時候接著剛剛的序列繼續取。

那麼它是如何實現節省記憶體的呢?只記住當前位置,生成器只保留乙個值,next之後上乙個值就沒有了,這就是為什麼它能接著上次停止的位置繼續下去!

python生成器 yeild關鍵字

1.yeild版本的斐波那契數列 def fab max n,a,b 0,0,1 while n max yield b print b a,b b,a b n n 1 第四個版本的 fab 和第一版相比,僅僅把 print b 改為了 yield b,就在保持簡潔性的同時獲得了 iterable ...

python之生成器

使用生成器表示式取代列表解析可以同時節省cpu 和 記憶體 ram 如果你構造乙個列表的目的僅僅是傳遞給別的函式,比如 傳遞給tuple 或者set 用生成器表示式替代吧 def ord map a string for c in a string yield ord c gen ord map u...

python之生成器

先來介紹下迭代器 迭代器即迭代取值的工具 迭代 的意思就是重複的基於上一次的結果取值 迭代器可以不依賴索引取值 取值 取乙個值就會少乙個,取完了,還取值就會報錯 1.什麼是生成器 在函式內但凡出現yield關鍵字,在呼叫函式就不會執行函式內 會返回乙個迭代器物件的值,該值稱之為生成器 強調 生成器的...