在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>
对我来说,他们似乎工作相同。
答案 0 :(得分:5)
您的功能确实不是生成器,但此表达式是:
(x**2 for x in range(n))
这是生成器表达式,请参阅reference documentation。
生成器表达式和包含yield
的函数体都会生成生成器对象。由于两者都是对象,因此您可以传递它并从函数返回一个。
生成器函数和等效生成器表达式在功能上完全相同。它们产生相同的字节码。选择您认为对您的用例更具可读性的那个。