2017-02-21 22 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

Я имею в виду, что это не кортеж. Вы должны рассмотреть вопрос о переписывании своего ответа –

 Смежные вопросы

  • Нет связанных вопросов^_^