在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中轻松计算和打印生成器对象?
快速回答:
对生成器表达式执行list()
操作(几乎)完全等同于将[]
括起来。所以,是的,您可以
>>> list((x for x in string.letters if x in (y for y in "BigMan on campus")))
但你也可以
>>> [x for x in string.letters if x in (y for y in "BigMan on campus")]
是的,这将把生成器表达式转换为列表理解。它和它上面的调用列表()是一样的。因此,将生成器表达式转换为列表的方法是将其括起来。
详细说明:
生成器表达式是"裸"for
表达式。如下所示:
x*x for x in range(10)
现在,您不能将其单独放在一行中,这样会出现语法错误。但是你可以用括号把它括起来。
>>> (x*x for x in range(10))
<generator object <genexpr> at 0xb7485464>
这有时被称为生成器理解,虽然我认为官方名称仍然是生成器表达式,但实际上没有什么区别,括号只是为了使语法有效。如果将其作为唯一参数传递给函数,则不需要它们,例如:
>>> sorted(x*x for x in range(10))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
基本上,Python3和Python2.7中提供的所有其他理解都只是围绕生成器表达式的语法糖。设置理解:
>>> {x*x for x in range(10)}
{0, 1, 4, 81, 64, 9, 16, 49, 25, 36}
>>> set(x*x for x in range(10))
{0, 1, 4, 81, 64, 9, 16, 49, 25, 36}
词典理解:
>>> dict((x, x*x) for x in range(10))
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
>>> {x: x*x for x in range(10)}
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
和Python 3下的列表理解:
>>> list(x*x for x in range(10))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> [x*x for x in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
在Python2中,列表理解不仅仅是语法上的糖。但唯一的区别是,Python2下的x将泄漏到命名空间。
>>> x
9
在Python 3下,您将获得
>>> x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
这意味着要在Python中很好地打印生成器表达式的内容,最好的方法就是对其进行列表理解!但是,如果您已经有一个生成器对象,这显然不会起作用。这样做只会生成一个生成器列表:
>>> foo = (x*x for x in range(10))
>>> [foo]
[<generator object <genexpr> at 0xb7559504>]
在这种情况下,您需要调用list()
:
>>> list(foo)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
虽然这行得通,但有点愚蠢:
>>> [x for x in foo]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
这篇关于如何打印生成器表达式?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!