在字符串格式化中,%s和%d有什么区别?

183

我不明白 %s%d 是做什么的,以及它们是如何工作的。

14个回答

236

它们用于格式化字符串。 %s 作为一个字符串的占位符,而 %d 则作为一个数字的占位符。它们对应的值通过使用百分号运算符传递给一个元组。

name = 'marcog'
number = 42
print '%s %d' % (name, number)

将会打印出marcog 42。请注意,name是一个字符串(%s),而number是一个整数(%d表示十进制)。

详见https://docs.python.org/zh-cn/3/library/stdtypes.html#printf-style-string-formatting

在Python 3中,示例代码应该如下:

print('%s %d' % (name, number))

2
在Google Chrome中:设置 >> 搜索 >> 管理搜索引擎...注意如何使用%s进行搜索引擎配置。Chrome使用%s来替换地址栏中输入的关键字。Python也以类似的方式使用%s。在 print('description: %s' % descrip) 中,%s运算符将被存储在descrip变量中的文本字符串所替换。圆括号可以防止Python 3中出现错误消息。 - noobninja
你如何称呼这些 %s、%d 等符号? - Chaine
1
@Chaine,它们被称为占位符,它们是可替换的变量。 - Leo

76

来自Python 3文档

%d用于十进制整数。

%s用于通用字符串或对象,如果是对象,则会被转换为字符串。

考虑以下代码:

name ='giacomo'
number = 4.3
print('%s %s %d %f %g' % (name, number, number, number, number))

输出结果将为

giacomo 4.3 4 4.300000 4.3

正如你所看到的,%d 将截断为整数,%s 将保持格式,%f 将以浮点数形式打印,%g 用于通用数字。

显然。

print('%d' % (name))

将引发异常;您不能将字符串转换为数字


8
这篇文章应该得到更多的点赞。它解释了如果用“%s”代替数字会发生什么。 - Vikas Prasad
2
%d和%i有什么区别,如果两者都会转换为整数?%d与%i和%f相比有何不同? - srini

40

%s被用作占位符,代表你想要插入格式化字符串中的字符串值。

%d被用作占位符,代表数值或者十进制值。

举个例子(针对 Python 3)

print ('%s is %d years old' % ('Joe', 42))

将会输出什么

Joe is 42 years old

7
不是真正解释问题吗?我并不是在解释问题,而是提供了一个简明扼要的答案来回答这个问题。这个问题明确询问了%s和%d的作用。 - Soviut
3
你知道%i和%d之间的区别吗?Python支持%i吗? - cryanbhu

39

这些都是有用的回答,但都没有完全解释清楚%s%d之间的区别。

%s表示格式化操作将对参数调用str()函数,因为根据定义,我们正在强制转换为字符串,所以%s本质上只执行str(arg)

另一方面,%d在调用str()之前会对参数调用int(),类似于str(int(arg)),这将导致执行整数强制转换和字符串强制转换。

例如,我可以将一个十六进制值转换为十进制:

>>> '%d' % 0x15
'21'

或将浮点数截断。

>>> '%d' % 34.5
'34'

但是如果参数不是数字,该操作将引发异常。

>>> '%d' % 'thirteen'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: %d format: a number is required, not str
所以,如果意图只是调用str(arg),那么%s就足够了,但如果您需要额外的格式(比如格式化浮点数小数位)或其他强制转换,则需要使用其他格式符号。
使用f-string标记时,当您省略格式化程序时,默认值为str
>>> a = 1
>>> f'{a}'
'1'
>>> f'{a:d}'
'1'
>>> a = '1'
>>> f'{a:d}'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: Unknown format code 'd' for object of type 'str'

对于string.format也是如此;默认值为str

>>> a = 1
>>> '{}'.format(a)
'1'
>>> '{!s}'.format(a)
'1'
>>> '{:d}'.format(a)
'1'

4
这应该是可以接受的答案。这是唯一一个真正解释了差异的答案。 - Antimony
2
考虑到我回答晚了9年,这是可以理解的。但是,我对那些答案并不满意,所以我添加了一个新的答案。 - Wyrmwood

11

这些是占位符:

例如: '嗨%s,我有%d个甜甜圈' %('Alice', 42)

这行代码将用Alice (str)替换%s,用42替换%d。

输出结果: '嗨Alice,我有42个甜甜圈'

大多数情况下可以使用"+"来实现。为了更深入地理解您的问题,您可能想要查看{} / .format()。以下是一个示例:Python字符串格式化:%vs.format

还可以在谷歌的Python教程视频中查看40分钟的说明:https://www.youtube.com/watch?v=tKTZoB2Vjuk


10
%d%s 字符串格式化命令用于格式化字符串。其中%d是数字,%s是字符串。例如:
print("%s" % "hi")

print("%d" % 34.6)

传递多个参数:

print("%s %s %s%d" % ("hi", "there", "user", 123456))将返回hi there user123456


1
请注意,%d 不是任何数字。它是一个十进制数(也称为整数)。在上面的示例中,%d' %34.6 将仅输出 34。对于 logger.info("value %d", 34.6) 同样适用。 - Snake Verde

9

%d%s是占位符,它们作为可替换的变量。例如,如果你创建了2个变量

variable_one = "Stackoverflow"
variable_two = 45

你可以使用变量的元组将这些变量分配给字符串中的句子。
variable_3 = "I was searching for an answer in %s and found more than %d answers to my question"

请注意,%s 适用于字符串,%d 适用于数字或十进制变量。
如果您打印 variable_3,它将如下所示。
print(variable_3 % (variable_one, variable_two))

我在StackOverflow上搜索答案,找到了超过45个回答。


5

它们是格式说明符。当你想要将Python表达式的值与特定格式一起包含在字符串中时,就会使用它们。

请参阅《Dive into Python》进行相对详细的介绍。


链接已失效。没有链接,这似乎更像是一条评论。 - Trenton McKinney
1
虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅链接的答案可能会失效。- 来自审查 - user16217248

4
根据最新标准,应该这样做。
print("My name is {!s} and my number is{:d}".format("Agnel Vishal",100))

请查看python3.6文档示例程序,了解更多关于IT技术的内容。


4
这是一个基本示例,用于演示Python字符串格式化和一种新的方法。
my_word = 'epic'
my_number = 1

print('The %s number is %d.' % (my_word, my_number))  # traditional substitution with % operator

//这个史诗级数字是1。

print(f'The {my_word} number is {my_number}.')  # newer format string style

//史诗级数字为1。

两者打印结果相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接