gpt4 book ai didi

python - 如何打印生成器表达式?

转载 作者:IT老高 更新时间:2023-10-28 21:10:20 25 4
gpt4 key购买 nike

在 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")]

是的,这会将生成器表达式转换为列表推导式。这是同一件事,并在其上调用 list() 。 所以将生成器表达式变成列表的方法是在它周围加上括号。

详细解释:

生成器表达式是“裸”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]

基本上,Python 3 和 Python 2.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]

在 Python 2 中,列表推导式不仅仅是语法糖。但唯一的区别是 x 在 Python 2 下会泄漏到命名空间中。

>>> 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]

关于python - 如何打印生成器表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5164642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com