2017-07-14 57 views
3

我是想了解Python生成和實現這一點:發電機的問題在Python

def yfun(): 
    print("into y fun ... ") 
    for x in range(1,6): 
     print("tryin to yield : {}".format(x)) 
     yield x 

yieldVar = yfun() 

for val in yieldVar: 
    print("value generated -> ", val) 

輸出來自如下:

into y fun ... 
tryin to yield : 1 
value generated -> 1 
tryin to yield : 2 
value generated -> 2 
tryin to yield : 3 
value generated -> 3 
tryin to yield : 4 
value generated -> 4 
tryin to yield : 5 
value generated -> 5 

能否請您介紹一下爲什麼功能再次被調用,然後再次 ?是不是變量應該有值和迭代應該在發電機變量上完成?

+1

當您調用該函數時,它會爲您提供一個生成器對象。遍歷該對象執行產生值的'yfun'定義中的代碼。 – khelwood

+0

看一看[docs](https://wiki.python.org/moin/Generators)。 – architrex

+5

是什麼讓你覺得函數被一次又一次地調用?畢竟,「變得有趣」只打印一次。 –

回答

4

功能是又一次打來電話,你又可以看到的事實,"into y fun ..."只印刷一次

發生了什麼事是通過調用包含yield的函數獲得的生成器正在由for循環提前(即消耗)。

yieldVar = yfun() # call yfun and get a generator 

生成器繼續生成值時,循環運行並打印已生成的元素。

+0

thanx您的回覆,但現在我無法理解爲什麼生成器對象不是一次創建,而是分配給「yieldVar」? 我想說的是,不應該像..當我從函數yfun()分配yieldVar值時,應該創建一個生成器並將其分配給yieldVar,因此當我使用第二個因爲我寫的輸出爲 產生的值 - > 1 \ n 產生的值 - > 2 ........ –

1

當您調用生成器函數時,將返回一個生成器對象。不是像正常功能那樣的單個值。這是一個可用於懶惰評估的對象。每個生成器對象都有一個名爲__next__()的方法。這允許Python通過調用__next__()多次從生成器對象 - 而不是函數 - yieldVar多次產生一個值。

+0

因此,這意味着行「yieldVar = yfun()」正在被延遲評估當我遍歷變量,並沒有做任何操作,直到它達到了那個點? –

+0

@SirTesla確實如此。 –

+0

非常感謝你@Christian Dean –