飄逸的python yield簡明教程

2021-09-22 08:57:43 字數 1051 閱讀 9571

發現還有非常多人對yield不理解,雲裡霧裡,於是試著用文字表述.

僅僅要函式含有yield語句,它就返回乙個生成器.所以我們與其把其看成函式定義,不如看作是生成器定義.函式用return返回,而生成器用yield返回.

接下來是yield的行為.

比方

def html():

yield 'header'

for i in range(5):

yield i

yield 'footer'

h = html()#此時h變數就是乙個生成器.

for x in h:#遍歷生成器

print x

怎麼理解這個函式呢?

使用"yield消除技術",用乙個結果變數來收集yield的東西並返回.

於是轉換成

def html():

ret =

for i in range(5):

return ret

能夠看到,yield語句沒了,全部東西都在ret這個序列.

生成器的強大魔法在於它是延遲執行的,在須要的時候它才去執行**,它"記住"了yield的執行位置,獲取下乙個結果的時候從上一次yield的位置繼續往下走.

所以生成器相對於list,它每乙個時刻僅僅儲存乙個當前結果,節省了記憶體,缺點是無法用下標索引,遍歷一次就沒了.還有乙個優點是能夠生成無窮序列,如cycle.

須要注意的是,當我們呼叫函式的時候,它並不開始執行函式體**,僅僅是返回乙個生成器.

比方

def a():

print 'hehe'

yield 1

yield 2

當我們a()時,並不會print 'hehe',而僅僅有當我們遍歷的時候,它才開始執行,從函式體第一行**直到第乙個yield,而後繼續往下執行**到下乙個yield,如此下去.

飄逸的python inspect誰呼叫了我

當程式出現詭異的bug時,我們需要層層去跟蹤,尤其是要理清順序。這時如果有個清晰的呼叫脈絡除錯就容易多了。利用inspect模組的getframeinfo方法來實現這需求。上 感受下。python view plain copy import inspect deffoo who inspect.g...

Python yield 的使用方法

帶有 yield 的函式在 python 中被稱之為 generator 生成器 使用 yield 可以大大簡化 yield 返回的是乙個generator物件,帶有 yield 的函式不再是乙個普通函式 def fab max n,a,b 0,0,1 while n fab 5 yield 的作用...

python yield的返回值

初識yield表示式是在生成器學習中,只要函式 現yield表示式,那麼這個函式就是生成器函式。當函式執行到yield那一行時,yield就會返回後面的值,然後凍結當前函式狀態,下行 不執行,等下一次呼叫再喚醒接著往下執行。先來個簡單生成器函式 def my gen yield 1 yield 2 ...