2016-02-09 49 views
2

我試圖演示如何使用Python中的yield。我想通過一個例子來證明這一點。在這個例子中使用「yield」的正確方法

該示例將要求用戶輸入yesno,並在每次輸入yes時將計數器n加1。

我想要展示yield工作方式的部分是用戶再次調用函數並獲取更新次數的值。例如,如果使用了回車,並且用戶再次運行該腳本,它將從頭開始,並且次數將是1。相反,我希望用戶得到1,2,3,...等等,這是輸入的次數。

這裏的問題是如何使用yield來演示這樣的例子。在我下面寫的代碼中,我總是得到返回的generator object而不是n的值。我怎樣才能得到返回的整數值n

def yes_times(answer): 
    n = 0 
    if answer == 'yes': 
     n = n + 1 
     yield n 


answer = raw_input('"yes" or "no": ') 
times = yes_times(answer) 
print 'You answered yes ' + str(times) + ' times' 

謝謝。

+6

這不是在所有的如何(或者)使用發電機的功能。你只需要輸入一次! – jonrsharpe

+0

生成器主要用於當您希望在大型數據集上操作,因爲它們被懶惰地評估並且不會在單個輸入上保存內存@jonrsharpe聲明 – danidee

回答

1

對於你的榜樣,你可以嘗試:

def yes_times(answer = None): 
    count = 0 
    while True: 
     if answer=="yes": 
      count += 1 
      answer = yield count 
     else: 
      answer = yield count 


gen = yes_times() 
gen.next() 
while True: 
    answer = raw_input('"yes" or "no": ') 
    print 'You answered yes ' + str(gen.send(answer)) + ' times' 
0

問題是,您正在嘗試使用生成器,就像它是一個函數一樣。我強烈建議您在線閱讀教程,直到您掌握其中的差異 - 畢竟,我就是這麼放棄了這個錯誤。 :-)

你的陳述

times = yes_times(answer) 

實例化的生成器,它是當你打印你所得到的。相反,你必須要麼使用下一個功能...

times = next(yes_times(answer)) 

...或正確使用發電機,做你所需要的。一般使用的發電機是將其識別爲數據,像

for times in yes_times(answer): 

然而,這需要更新您的發電機,以獲得輸入本身。

這足以讓你感動嗎?

+0

真的還不清楚,尤其是如何用您提到的for語句來做到這一點。謝謝 – Simplicity

+0

發電機產生一串結果。典型的使用消耗那個流,一次一個結果。 ** for **語句遍歷結果序列。 @Useless在另一個答案中做得很好。 – Prune

4

我想演示如何使用Python中的yield

...例題...

這裏的問題是如何使用yield證明這樣的例子。

你正在做這個倒退。

請不要示範如何使用yield來挑選一些與生成器行爲無關的任意示例,並嘗試使用yield來實現它。

取而代之,選擇yield擅長的東西,然後執行該操作 - 理想情況下使用類似的非yield實現,以便展示優勢。


簡單的例子:玩具實施range

def naive_range(begin, end): 
    i = begin 
    result = [] 
    while i < end: 
     result.append(i) 
     i = i + 1 
    return result 

def generate_range(begin, end): 
    i = begin 
    while i < end: 
     yield i 
     i = i + 1 

現在,您可以命名幼稚的做法的弊端?它何時會比發電機差得多,爲什麼?

相關問題