2015-04-02 81 views
2

作爲嘗試理解生成器函數的練習,我試圖編寫一個模擬長分區並一次返回第一位數的函數。我寫了這個函數,它似乎不工作。但是,如果我在shell中逐行執行它,它確實是我想要的,所以我不知道該怎麼做。我已經通過互聯網上關於發電機功能的帖子在這裏閱讀:在Python中使用生成器函數實現長分區

並從我的理解我只是用yield語句替換返回語句。這不是這種情況嗎?任何人都可以告訴我我做錯了什麼?任何幫助表示讚賞。

def decimals(number):  
    """ 
    Takes a numnber and generates the digits of 1/n. 

    """ 
    divisor = number 
    dividend = 1 


    while dividend % divisor != 0: 
     #Floor division is the // operator   
     quotient = divisor // dividend 
     remainder = dividend % divisor 

     temp = quotient * divisor 
     if remainder != 0 : 
      temp = quotient * divisor 

     if temp > dividend: 
      dividend = dividend * 10 
      dividend = dividend - temp 
     else: 
      dividend = dividend - temp 
     yield quotient 



def main(): 
    gen = decimals(4) 
    print(next(gen)) 

if __name__ == "__main__": 
    main() 
+0

究竟是什麼問題呢。你沒有真正描述過這個問題。第二。如果數字分爲無窮大,程序將永不停止。打印功能會因爲試圖輸出的數據量而滯後。 – reticentroot 2015-04-03 00:02:05

+0

小評論,你可以減少你的商/餘數計算爲'quotient,remaining = divmod(dividend,divisor)'。其實......你爲什麼把這兩人顛倒過來呢? 「分紅」不是「分紅」嗎? – 2015-04-03 00:19:39

回答

3

您的主要問題是您只輸出生成器中的單個值:next(gen)。要輸出整個發電機,做一個清單,從它的值:print(list(decimals(4))),或通過值打印值:

for digit in decimals(4): 
    print(digit) 

對付無盡的發電機(例如,從decimals(3)調用),例如,您可以只取一從它的值量有限與itertools.islice

from itertools import islice 
for digit in islice(decimals(3), 10): 
    print(digit) 

另外,我覺得有什麼不對您的算法。它似乎沒有產生正確的結果。我認爲,它應該是這個樣子:

def decimals(number):  
    """ 
    Takes a number and generates the digits of 1/n. 

    """ 
    divisor = number 
    dividend = 1 
    remainder = 1 

    while remainder: 
     #Floor division is the // operator   
     quotient = dividend // divisor 
     remainder = dividend % divisor 

     if remainder < divisor: 
      dividend = remainder * 10 
     else: 
      dividend = remainder 
     yield quotient 

作爲一個側面說明,這個代碼仍可以縮短。例如:

def decimals(number):  
    dividend = 1 
    while dividend:  
     yield dividend // number 
     dividend = dividend % number * 10 
相關問題