如何打印生成器函数返回的值?

时间:2017-02-21 03:57:29

标签: python-3.x generator

我试图打印由生成函数返回的第三个值,该函数生成小于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,依此类推。如何返回生成器函数生成的值?

2 个答案:

答案 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)

具有yield的生成器函数:

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

发布代码的过度使用修补程序:

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

答案 1 :(得分: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