2017-02-21 127 views
0

我試圖打印由生成奇數小於10的生成器函數返回的第三個值。但是,我一直無法打印任何值。對於我發現的這個問題,最常見的答案是下面的代碼。如何打印生成器函數返回的值?

def get_odds(): 
    yield (n for n in range(10) if n % 2 != 0) 
for n in get_odds(): 
    print(n) 

這將返回:

<generator object get_odds.<locals>.<genexpr> at 0x000001C88ABFC258>

它應該返回1,然後3,等等。如何返回生成器函數生成的值?

你的方式
+0

習慣上選擇一個可以幫助你的答案,並且在你喜歡的時候選擇喜歡的答案。 –

回答

2

表達(n for n in range(10) if n % 2 != 0)是在自己的權利發電機。這是您的印刷聲明在您收到印刷品時正在採用的內容。以下是一些重寫代碼的方法,可以按照您的需要進行操作。

的瑣碎:

for n in (n for n in range(10) if n % 2 != 0): 
    print(n) 

沒有明確的產量發電機功能:

def get_odds(): 
    return (n for n in range(10) if n % 2 != 0) 
for n in get_odds(): 
    print(n) 

的收率發電機功能:

def get_odds(): 
    for n in range(10): 
     if n % 2: 
      yield n 
for n in get_odds(): 
    print(n) 

的碼作爲overkilled修復發表:

def get_odds(): 
    yield (n for n in range(10) if n % 2 != 0) 
for n in next(get_odds()): 
    print(n) 
1

,您的發電機包含另一個發電機

>>> def get_odds(): 
...  yield (n for n in range(10) if n % 2 != 0) 


>>> odd = get_odds() 
>>> odd 
<generator object get_odds at 0x102270f10> 
>>> n = next(odd) 
>>> n 
<generator object get_odds.<locals>.<genexpr> at 0x102270eb8> 
>>> next(n) 
1 
>>> next(n) 
3 
>>> next(n) 
5 

你應該寫這樣的代碼:

def get_odds(): 
    for n in range(10): 
     if n % 2 != 0: 
      yield n 
+0

不是元組......它是一個發生器,因爲它有一個「for」的對象 –

+0

是的,它是一個發生器,它只包含另一個你想要的發生器 – Pythonify

+0

我的意思是它不是一個元組。你應該考慮改寫你的答案 –