Python生成器中的意外输出

时间:2013-12-18 15:37:55

标签: python list generator

我试图在Python中找出生成器,我试图过滤列表并对它们进行平方并返回输出。

list = [1, 4, -5, 10, -7, 2, 3, -1]

def square_generator(optional_parameter):
    return (x ** 2 for x in list if x > optional_parameter)
g = (square_generator(i) for i in list)

h = square_generator(0)
print h

我做错了什么?

3 个答案:

答案 0 :(得分:5)

当你定义一个生成器时,你必须像这样迭代它:

for x in h:
    print x

如果您只是尝试打印生成器,那么您将获得该对象:

<generator object <genexpr> at 0x02A4FB48>

答案 1 :(得分:3)

如果您想制作一个列表,只需使用列表推导:

def square_generator(optional_parameter):
    return [x ** 2 for x in somelist if x > optional_parameter]

或在生成器上转动list()(前提是您没有使用list作为本地名称):

list(h)

你的发电机工作正常,否则:

>>> somelist = [1, 4, -5, 10, -7, 2, 3, -1]
>>> def square_generator(optional_parameter):
...     return (x ** 2 for x in somelist if x > optional_parameter)
... 
>>> list(square_generator(0))
[1, 16, 100, 4, 9]

答案 2 :(得分:1)

您的square_generator函数返回一个生成器对象。生成器是迭代器,它们不是列表,而是包含用于生成序列的下一个元素的规则的对象。

因此,当您的函数返回时,它不会计算平方。它们仅在需要时计算。因此,您需要遍历序列以获取元素。在您要求查看它们之前,它们根本不存在。

这也意味着当您迭代列表时它会消失。如果你想要它是持久的,你必须看看Martin Pieters的答案,即使用列表而不是生成器/迭代器。