Python 3中的字符串格式


114

我在Python 2中执行此操作:

"(%d goals, $%d)" % (self.goals, self.penalties)

这是什么Python 3版本?

我尝试在线搜索示例,但一直在获取Python 2版本。


它不被弃用;您的代码工作正常。在这里阅读更多。
jackcogdill

32
临时读者注意:美元符号没有特殊含义。这只是一个美元符号。(感谢Martijn Pieters)
kevinarpe 2014年


1
美元符号使这一点非常令人困惑
。.– cchamberlain

Answers:


173

这是有关“新”格式语法的文档。一个例子是:

"({:d} goals, ${:d})".format(self.goals, self.penalties)

如果goalspenalties均为整数(即​​默认格式为ok),则可以将其缩短为:

"({} goals, ${})".format(self.goals, self.penalties)

而且由于参数是的字段self,所以还有一种使用单个参数两次的方法(如@Burhan Khalid在评论中指出的那样):

"({0.goals} goals, ${0.penalties})".format(self)

说明:

  • {} 表示仅下一个位置参数,采用默认格式;
  • {0}表示带有index的参数0,默认格式;
  • {:d} 是下一个位置参数,采用十进制整数格式;
  • {0:d}是带有index的参数0,十进制整数格式。

选择参数时,您可以执行许多其他操作(使用命名参数而不是位置参数,访问字段等),还有许多格式选项(填充数字,使用千位分隔符,显示或不显示符号等)。其他一些例子:

"({goals} goals, ${penalties})".format(goals=2, penalties=4)
"({goals} goals, ${penalties})".format(**self.__dict__)

"first goal: {0.goal_list[0]}".format(self)
"second goal: {.goal_list[1]}".format(self)

"conversion rate: {:.2f}".format(self.goals / self.shots) # '0.20'
"conversion rate: {:.2%}".format(self.goals / self.shots) # '20.45%'
"conversion rate: {:.0%}".format(self.goals / self.shots) # '20%'

"self: {!s}".format(self) # 'Player: Bob'
"self: {!r}".format(self) # '<__main__.Player instance at 0x00BF7260>'

"games: {:>3}".format(player1.games)  # 'games: 123'
"games: {:>3}".format(player2.games)  # 'games:   4'
"games: {:0>3}".format(player2.games) # 'games: 004'

注意:正如其他人指出的那样,新格式并不能取代前一种格式,这两种格式都可以在Python 3和更高版本的Python 2中使用。有人可能会说这是优先考虑的问题,但是恕我直言,较新的版本比旧的版本更具表现力,并且在编写新代码时应使用(当然,除非它针对较旧的环境)。


9
您也可以"({0.goals} goals, ${0.penalties})".format(self)
Burhan Khalid

您需要在花括号之外加上'%',例如{:.2f%}-> {:.2f}%
SuperElectric 2015年

@SuperElectric你的意思是,在这一行:"conversion rate: {:.2%}".format(self.goals / self.shots)?对我来说很好用...(Python 3.4)请注意,其中没有任何f内容,我要求将其格式设置为百分比,而不是浮点数。
mgibsonbr

你是对的; 它似乎可以在Python 3.4中使用,所以很好,因为OP询问了Python3。我只是发现它不适用于python 2.7.6。"{:.2f}%".format(float_num)两者都适用。
SuperElectric 2015年

1
@JohnSchmitt是的,此示例应该提供与问题中给出的代码相同的输出。在$这里没有特殊的意义,无论是在旧格式的语法也不在新的,因此应该存在生成的字符串中,环比持平。
mgibsonbr

67

Python 3.6现在支持PEP 498的简写文字字符串插值。对于您的用例,新语法很简单:

f"({self.goals} goals, ${self.penalties})"

这与以前的.format标准,但让一个容易做的事情一样

>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal('12.34567')
>>> f'result: {value:{width}.{precision}}'
'result:      12.35'

12

该行在Python 3中保持原样。

>>> sys.version
'3.2 (r32:88445, Oct 20 2012, 14:09:29) \n[GCC 4.5.2]'
>>> "(%d goals, $%d)" % (self.goals, self.penalties)
'(1 goals, $2)'

好。凉。发布问题后,我继续搜索,发现我们必须做{%d}而不只是%d是正确的吗?还是Python2方法是唯一的方法?
JoseBazBaz

2
Python 3引入了一种新语法-大括号-但您不需要使用它。您可以使用旧的或新的。但是它们是不同的。如果您使用的是冰壶,则不要使用百分号。
马克·里德

2

我喜欢这种方法

my_hash = {}
my_hash["goals"] = 3 #to show number
my_hash["penalties"] = "5" #to show string
print("I scored %(goals)d goals and took %(penalties)s penalties" % my_hash)

请分别注意括号中的d和s。

输出将是:

I scored 3 goals and took 5 penalties
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.