我试图打印由生成函数返回的第三个值,该函数生成小于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)
具有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