【发布时间】:2021-04-26 07:00:29
【问题描述】:
在 Python shell 中,如果我输入一个列表理解,例如:
>>> [x for x in string.letters if x in [y for y in "BigMan on campus"]]
我得到了一个很好的打印结果:
['a', 'c', 'g', 'i', 'm', 'n', 'o', 'p', 's', 'u', 'B', 'M']
字典理解也一样:
>>> {x:x*2 for x in range(1,10)}
{1: 2, 2: 4, 3: 6, 4: 8, 5: 10, 6: 12, 7: 14, 8: 16, 9: 18}
如果我输入一个生成器表达式,我会得到不那么友好的响应:
>>> (x for x in string.letters if x in (y for y in "BigMan on campus"))
<generator object <genexpr> at 0x1004a0be0>
我知道我能做到:
>>> for i in _: print i,
a c g i m n o p s u B M
除此之外(或编写辅助函数),我能否在交互式 shell 中轻松评估和打印该生成器对象?
【问题讨论】:
-
这里真正的问题是什么?你错过了什么?
-
@pynator:“真正的问题”是我希望能够打印
generator object的内容,因为我在交互式提示下交互式地构建了一个理解。调用list(_)就可以做到这一点。我所做的是使用列表推导然后将它们转换为更大代码中的 genexp。这些在运行时可能会以列表推导不会失败的方式失败。 -
简短的回答是生成器表达式无法打印,因为它的值不存在;它们是按需生成的。您可以做的(假设生成器在某个时候停止)是从中获取所有值,例如使用
list(),然后打印它们。 -
另一种方法是
x = (i for i in range(1)); print(*x)