在python中使用str.join和生成器表达式

时间:2017-05-17 02:22:46

标签: python call generator

当我阅读问题Python string.join(list) on object array rather than string array时,我发现以下句子:

', '.join(str(x) for x in list)

我已经知道(str(x) for x in list)是一个生成器表达式,我也知道generator是一个可迭代的。以下代码验证了我的观点的正确性。

>>> gen = (x for x in [1,2,3])
<generator object <genexpr> at 0x104349b40>
>>> from collections import Iterable
>>> isinstance(gen, Iterable)
True

同时,str.join(iterable)返回一个字符串,该字符串是iterable中字符串的串联。因此,以下工作正常,我希望。

>>> ",".join((str(x) for x in [1,2,3]))
'123'

接下来是问题,为什么代码在下面工作正常,为什么在函数调用中不需要括号。

', '.join(str(x) for x in [1,2,3])

毕竟,str(x) for x in [1,2,3]本身不是生成器。

>>> tmp = str(x) for x in [1,2,3]
  File "<stdin>", line 1
    tmp = str(x) for x in [1,2,3]
                   ^
SyntaxError: invalid syntax

3 个答案:

答案 0 :(得分:6)

这是在引入生成器表达式时指定的(PEP 289):

  

如果函数调用具有单个位置参数,则它可以是没有额外括号的生成器表达式,但在所有其他情况下,您必须将其括起来。

在你的情况下,它只是一个位置参数,所以两种方式都是可能的:

', '.join(str(x) for x in [1,2,3])
', '.join((str(x) for x in [1,2,3]))

答案 1 :(得分:2)

在逐字仔细阅读文档后,我发现它已经提到Generator expressions

  

只有一个参数的调用可以省略括号。请参阅电话详细信息部分。

答案 2 :(得分:2)

它是一种生成器表达式 - 但是括号是否为必需取决于生成器表达式出现的上下文。参数列表是一种特殊情况:如果生成器表达式是唯一的参数,则不需要括起括号(但如果您愿意,仍然可以使用)。但是,如果调用具有多个参数,则需要括起括号。这基本上是第2B点in the PEP that introduced this feature