2017-06-02 18 views
0

在Python 3.5这将返回一个发电机,但没有产量不“屈服” A作业发生功能

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> 

除了更加明显发电机的功能,有没有理由喜欢产生“版的版本,像

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> 

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

回答

5

你的功能确实不是一个发电机,但这种表达

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

这是一个发电机表达,看到reference documentation

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

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

+0

就是这样,现在我明白了什么试图告诉我。 –