我试图在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
我做错了什么?
答案 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的答案,即使用列表而不是生成器/迭代器。