一个工作的发电机功能没有"产量"

时间:2017-06-02 06:36:08

标签: python python-3.x generator

在Python 3.5中,这将返回一个生成器,但没有 yield

def square(n):
    return (x**2 for x in range(n))

print(square) 
# <function square at 0x7f1ad0990f28>
print(square(10))
# <generator object square.<locals>.<genexpr> at 0x7f1ad08e0af0>

除了显然是一个生成器函数之外,是否有理由选择 yield 版本,例如

def square(n):
    for x in range(n): yield x**2

print(square)
# <function square at 0x7f1ac413ed90>
print(square(10))
# <generator object square at 0x7f1ad08e0d58>

对我来说,他们似乎工作相同。

1 个答案:

答案 0 :(得分:5)

您的功能确实不是生成器,但此表达式

(x**2 for x in range(n))

这是生成器表达式,请参阅reference documentation

生成器表达式和包含yield的函数体都会生成生成器对象。由于两者都是对象,因此您可以传递它并从函数返回一个。

生成器函数和等效生成器表达式在功能上完全相同。它们产生相同的字节码。选择您认为对您的用例更具可读性的那个。