python字符串格式

Python string formatting

本问题已经有最佳答案,请猛点这里访问。

我正在研究一个开源项目的代码。它是用Python编写的代码,不幸的是我对它不太有经验。我在代码中发现了很多这样的语句:

1
print"the string is %s" % (name_of_variable, )

我知道,与C语言类似,这是一种正确格式化输出的方法,但我真的不理解在括号内的"变量名"后面逗号的含义。

我搜索了python文档,但没有找到关于这种语句的任何信息。有人知道它的意思吗?


如果name_of_variable是元组,那么

1
print"the string is %s" % (name_of_variable)

将抛出一个TypeError

因此,您必须使用print"the string is %s" % (name_of_variable, )来打印它。


尾随逗号是一种创建单元素元组的方法。通常,通过在括号中列出一组值或变量(用逗号分隔)来创建元组:

1
my_tuple = (1, 2, 3)

然而,括号实际上并不必要。您可以创建这样的元组:

1
my_tuple = 1, 2, 3

当然,这会引起一个元素元组的问题。如果省略括号,则只需将变量赋给单个变量:

1
my_tuple = 1    # my_tuple is the integer 1, not a one-element tuple!

但是使用括号是不明确的,因为括号中的值是完全合法的:

1
my_tuple = (1)    # my_tuple is still the integer 1, not a one-element tuple

因此,通过添加尾随逗号来指示一个元素元组:

1
2
3
my_tuple = 1,
# or, with parentheses
my_tuple = (1,)

字符串格式采用一个元组作为参数,因此如果使用的是一个元素元组,则使用一个尾随逗号。(当然,字符串格式对于只传递一个要格式化的变量的情况有特殊的处理,在这些情况下,您可以只使用一个值,而不是元组。)


当有多个变量时使用逗号。如

1
print"the string is %s %s" % (name_of_variable1, name_of_variable2)

更多详情请访问:https://stackoverflow.com/a/5082482/2382792


(x,)中的逗号是告诉python括号中包含一个元组,而不是单个值子表达式的括号形式(最常用于更改运算符优先级,例如(a+b) * 2a + b*2不同)。字符串格式运算符非常擅长猜测单个值不应该是序列的情况,但如果要传递一个元组而不是字符串,它将被解包:

1
2
3
4
5
6
7
8
9
10
>>> mytup=("Hello world!",)
>>> print"%s"%(mytup)
Hello world!
>>> print"%s"%(mytup,)
('Hello world!',)
>>> mytup=("Hello world!","Yoo-hoo, big summer blow-out!")
>>> print"%s"%(mytup)
Traceback (most recent call last):
  File"<stdin>", line 1, in <module>
TypeError: not all arguments converted during string formatting

该运算符尝试类似于函数调用,其中参数列表始终作为元组(也可能是命名参数的字典)传递。当以str.format的形式调用时,这种差异就会消失,因为构成括号的元组是方法调用语法的一部分。


这是创建一个元素元组的语法。例如,请参见此链接。这里并不重要,因为print也接受一个变量,但一般来说,(x)等同于x,所以强制将其解释为tuple语法的唯一方法就是这种奇怪的形式。注意区别:

1
2
3
4
5
6
7
8
9
10
>>> x = 0
>>> (x)
0
>>> (x,)
(0,)
>>> type((x))
<type 'int'>
>>> type((x,))
<type 'tuple'>
>>>

此外,不需要括号:

1
2
>>>x,
>>>(0,)

您可能还需要阅读有关格式化语法的百分比。


当您只使用一个变量时,是否使用逗号并不重要,您也不需要只有一个变量的括号。

它使用元组(括号和逗号)在这里只是与多变量情况一致。

而且,如果在一个元素元组中没有逗号,它就不再是元组。

例如,
a = (1)
type(a) #

人们还喜欢在元组的最后一个元素后面追加一个逗号,即使它们有不止一个元素来保持一致性。


这里,,不是特定的,因为您只使用单个变量。

1
2
3
4
5
In [96]: print"the string is %s" % (name_of_variable, )
the string is assdf

In [97]: print"the string is %s" % name_of_variable
the string is assdf

输出相同。

但如果name_of_variabletuple的话,就需要在打印报表中使用,

1
2
3
4
5
6
7
8
9
10
11
In [4]: tup = (1,2,)
In [6]:  print ("the string is %s" % (tup))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-6-fb9ef4de3ac3> in <module>()
----> 1 print ("the string is %s" % (tup))

TypeError: not all arguments converted during string formatting

In [7]:  print ("the string is %s" % (tup,))
the string is (1, 2)