Python 为什么可以';我不能用星号表达吗?

Python 为什么可以';我不能用星号表达吗?,python,python-3.x,python-2.x,Python,Python 3.x,Python 2.x,我的代码 $ python Python 3.5.2 |Continuum Analytics, Inc.| (default, Jul 2 2016, 17:53:06) [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux Type "help", "copyright", "credits" or "license" for more information. >>> a = (1, 2) >>> '%d %

我的代码

$ python
Python 3.5.2 |Continuum Analytics, Inc.| (default, Jul  2 2016, 17:53:06) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> a = (1, 2)
>>> '%d %d %d' % (0, *a)
'0 1 2'
>>> '%d %d %d' % (*a, 3)
'1 2 3'
>>> '%d %d' % (*a)
  File "<stdin>", line 1
SyntaxError: can't use starred expression here
>>> 
$python
Python 3.5.2 | Continuum Analytics,Inc.|(默认,2016年7月2日,17:53:06)
linux上的[GCC 4.4.7 20120313(Red Hat 4.4.7-1)]
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>a=(1,2)
>>>“%d%d%d%”(0,*a)
'0 1 2'
>>>“%d%d%d%”(*a,3)
'1 2 3'
>>>“%d%d%”(*a)
文件“”,第1行
SyntaxError:此处不能使用带星号的表达式
>>> 
我的问题是,为什么

用更严肃的语气:我想要一个答案,或者一个参考,详细说明使用星号表达的所有细节,因为我有时会对它的行为感到惊讶

补遗 来反映一些有启发性的评论 紧接着我的问题,我添加了以下代码

>>> '%d %d' % (, *a)
  File "<stdin>", line 1
    '%d %d' % (, *a)
               ^
SyntaxError: invalid syntax
>>> '%d %d' % (*a,)
'1 2'
>>> 
>'%d%d'(,*a)
文件“”,第1行
“%d%d%”(,*a)
^
SyntaxError:无效语法
>>>“%d%d%”(*a,)
'1 2'
>>> 
(在发布原始问题之前,我尝试了
(,a)
部分,但我忽略了它,因为错误与星号无关。)

python中有一种语法≥ 3.5,这“只是工作”,但我希望得到一些理解

我的问题是,为什么

因为你的python语法不允许这样。它是这样定义的,所以没有真正的“为什么”

而且,这是不必要的

"%d %d" % a
会有用的

因此,您需要将扩展转换为元组,而正确的方法是,正如Lafexlos所指出的,be

"%d %d" % (*a,)
这是因为:

(a)
只是一个用括号括起来的值。它不是一个新的元组对象。你的表情是:

>>> '%d %d' % (*a)
将被翻译为:

>>> '%d %d' % * a
这在python语法方面显然是错误的

为了使用一个表达式作为初始值设定项创建一个新元组,您需要在其后面添加“
”:

>>> '%d %d' % (*a,)
注意:除非
a
是生成器,否则在此特定情况下,您可以键入:

另外,如果我可以提出一些建议的话:您可以开始使用新样式的格式化表达式。他们很棒

>>> "{} {}".format(*a)
您可以在python文档的w段中阅读更多关于它们的内容,还有一个很棒的网站。上面的行使用下面描述的参数解包机制

更新:自python 3.6以来,您还可以使用字符串插值-f-strings!中对这些进行了描述,在中可以找到一些示例

星条旗 星号表达式的用途远不止创建一个新的列表/元组/字典。其中大多数在和中进行了描述

它们可以归结为两种:

R值拆包:

>>> a, *b, c = range(5)
# a = 0
# b = [1, 2, 3]
# c = 4
>>> 10, *range(2)
(10, 0, 1)
positional_arguments = [12, "a string", (1, 2, 3), other_object]
keyword_arguments = {"hostname": "localhost", "port": 8080}
send(*positional_arguments, **keyword_arguments)
Iterable/dictionary对象初始化(请注意,您也可以在列表中解包字典!):

当然,最常见的用法是参数解包:

>>> a, *b, c = range(5)
# a = 0
# b = [1, 2, 3]
# c = 4
>>> 10, *range(2)
(10, 0, 1)
positional_arguments = [12, "a string", (1, 2, 3), other_object]
keyword_arguments = {"hostname": "localhost", "port": 8080}
send(*positional_arguments, **keyword_arguments)
也就是说:

send(12, "a string", (1, 2, 3), other_object, hostname="localhost", port=8080)
这一主题在本书中已经有了相当大的篇幅。

这是因为:

>>> '%d %d' % (*a)
可以是:

>>> '%d %d' %a
当然,我们能够做到:

>>> '%d %d' % (*a,)
但是:

>>> (*a,)==a
True
>>> 
>>> [*a]
[1, 2]
>>> a
(1, 2)
>>> 
或者你可以:

>>> '%d %d' % [*a]
但是:

>>> (*a,)==a
True
>>> 
>>> [*a]
[1, 2]
>>> a
(1, 2)
>>> 
因此:


(*a,)
注意结尾处的逗号,使其成为元组。@MarcusMüller扩展的解包(对于RHS上的
*
**
)为3.5。正确的语法是
(*a,)
…@JonClements我知道。这就是为什么我在上面要求GBOFI澄清她/他使用的python版本!!请看一看关于的“Unpacking Iterables”文档,有趣的是,
format()
函数没有这个问题,即
{:d}{:d}.format(*a)
-->
'1,2'
。该问题似乎与
%
字符串格式化程序有关。Re
%d%d”%a
,我的实际用例涉及生成器表达式…。在这个问题上,我想让事情变得简单,而且,我真的想知道解包的细节