Python 3 中的字符串格式化

Posted

技术标签:

【中文标题】Python 3 中的字符串格式化【英文标题】:String formatting in Python 3 【发布时间】:2012-12-06 09:55:28 【问题描述】:

我在 Python 2 中这样做:

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

这是什么 Python 3 版本?

我尝试在网上搜索示例,但我不断获得 Python 2 版本。

【问题讨论】:

它没有被弃用;你的代码工作正常。阅读更多here。 休闲读者注意:美元符号没有特殊含义。这里只是一个美元符号。 (感谢 Martijn Pieters) pyformat.info 和 python-course.eu/python3_formatted_output.php(不是我的网站) 美元符号让这变得非常混乱.. 这能回答你的问题吗? How do I put a variable inside a string? 【参考方案1】:

这里是the docs 关于“新”格式语法的内容。一个例子是:

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

如果goalspenalties 都是整数(即它们的默认格式没问题),它可以缩短为:

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

由于参数是self 的字段,因此还有一种方法可以使用单个参数两次(正如@Burhan Khalid 在 cmets 中指出的那样):

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

解释:

表示只是下一个位置参数,具有默认格式; 0 表示索引为0 的参数,默认格式; :d 是下一个位置参数,采用十进制整数格式; 0:d 是索引为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 中可用。有人可能会说这是一个偏好问题,但恕我直言,新的比旧的更具表现力,并且应该在编写新代码时使用(当然,除非它针对的是旧环境)。

【讨论】:

你也可以"(0.goals goals, $0.penalties)".format(self) 你需要把'%'放在花括号外面,例如:.2f% -> :.2f% @SuperElectric 你的意思是,在这一行:"conversion rate: :.2%".format(self.goals / self.shots)?对我来说效果很好......(Python 3.4)请注意,其中没有f,我要求格式化为百分比,而不是浮点数。 你是对的;它似乎在 Python 3.4 中工作,所以这很好,因为 OP 正在询问 Python3。我只是发现它不适用于 python 2.7.6。 ":.2f%".format(float_num) 对两者都适用。 @JohnSchmitt 是的,这个例子应该给出与问题中给出的代码相同的输出。 $ 在这里没有特殊含义,无论是旧格式语法还是新格式语法,因此应该存在于生成的字符串中,不变。【参考方案2】:

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

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

这类似于之前的.format 标准,但让人们可以轻松地做事like:

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

【讨论】:

【参考方案3】:

该行在 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 方式是唯一的方法? Python 3 引入了一种新语法 - 即花括号 - 但您不需要使用它。您可以使用旧的或新的。但它们是不同的;如果您使用卷曲,则不要使用百分号。【参考方案4】:

我喜欢这种方法

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

【讨论】:

以上是关于Python 3 中的字符串格式化的主要内容,如果未能解决你的问题,请参考以下文章

python 3中的字符串格式“%g%%”是啥意思? [复制]

浅谈Python中的格式化字符%s format f

python中的字符串格式化

python 字符串格式化问题

浅谈 Python 中的字符串格式化输出

python format字符串格式化数学意义的函数与python中的函数 day14