s='s=%r;print(s%%s)';print(s%s)
我理解百分号(%)是用于在字符串中替换某些内容的(但实际上要替换什么?)。更有意思的是,为什么在将
%s
替换为s
本身之后,print(s%%s)
自动变成了print(s%s)
?s='s=%r;print(s%%s)';print(s%s)
%s
替换为s
本身之后,print(s%%s)
自动变成了print(s%s)
?"%%"
是旧版printf格式化字符串的“转换说明符”。%
格式运算符的参数进行转换(例如,"%d"
表示在插入字符串之前将下一个参数转换为十进制整数)。
"%%"
不同,因为它直接转换为单个"%"
字符而不消耗任何参数。在格式字符串规范中需要此转换,否则任何"%"
都将被视为其他代码的第一部分,并且没有简单的方法来生成包含百分号的字符串。print(s%s)
时,它执行了一个字符串格式化操作,其中格式字符串和单个参数都是相同的字符串s
。"%r"
是一个转换说明符,用于对其参数进行repr
。字符串上的repr
会在其周围添加引号。这就是输出中带引号的字符串的来源。
"%%"
生成出现在print
调用中两个s
之间的%
运算符。如果s
中只包含一个"%"
,则会出现关于格式化操作需要第二个参数的错误(因为%s
是另一个转换说明符)。"%%"
只是一个包含两个百分号的字符串。只有当你将其用作格式化字符串时,这两个字符才会变成一个。尝试使用 "%%" % ()
格式化没有参数的字符串,你就会看到它发生了。 - Blckknghtprint '% %s' % '' #wrong
print '%% %s' % '' #correct and print '% '
思考一下 \\ 和 \。
%%
表示一个百分号%
。 - Dan D."%s%%s" % 'follow me '
=>'follow me %s'
。 - Dan D.printf
函数。尽管有些字母的用法不同。 - Dan D.formatstring % formatitems
,而不是在格式化字符串字段内使用%的情况:“%s%5.2f”。 - smci