您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python:打印生成器表达式?

Python:打印生成器表达式?

快速回答:

做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 2022/1/1 18:47:19 有334人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶