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

sel*_*oot 4 python generator call

当我在对象数组而不是字符串数组上读取Python string.join(list)的问题时,我找到以下句子:

', '.join(str(x) for x in list)
Run Code Online (Sandbox Code Playgroud)

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

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

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

>>> ",".join((str(x) for x in [1,2,3]))
'123'
Run Code Online (Sandbox Code Playgroud)

接下来是问题,为什么代码在下面工作得很好,为什么在函数调用中不需要括号.

', '.join(str(x) for x in [1,2,3])
Run Code Online (Sandbox Code Playgroud)

毕竟, 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
Run Code Online (Sandbox Code Playgroud)

MSe*_*ert 7

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

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

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

', '.join(str(x) for x in [1,2,3])
', '.join((str(x) for x in [1,2,3]))
Run Code Online (Sandbox Code Playgroud)