不知道有多少学校计算机科学与技术大一的时候就教C语言,接触到的第一个函数就是printf()
函数,它接收至少一个参数:要格式化的字符串,里面包含一系列占位符,如%d表示整数、%e表示科学计数法,然后后面再使用变量替换这些占位符。Python格式化字符串总共有以下几种方式,一起来看看吧。
使用“%”运算符
Python的字符串对运算符“%”进行了重载,它用于将字符串中由百分号和一个字母组成的占位符替换成具体的值,这个百分号占位符和C语言很类似,如%d代表十进制整数、%e代表科学计数法、%s代表字符串、%x代表十六进制数。
python 代码:num = 12
print('%s %d %x %o %e %f' % (num, num, num, num, num, num))
# 12 12 c 14 1.200000e+01 12.000000
使用format()方法
以下内容来自我的云笔记。
模板的格式为{[index][:[fill]align][sign][#][width][.precision][type]}
index,可选参数,指定要设置格式的对象在参数列表的索引位置,索引值如果省略,则使用默认排序。
fill,可选参数,指定空白处填充的字符。
align,可选参数,指定对齐参数,<左对齐,>右对齐,^居中对齐,=只对数字有效,右对齐,正数前无符号。
sign,可选参数,指定数字格式化格式,可选为,-,+,若为空格则表示正数加空格,负数加负号。
\#,可选参数,在二进制,八进制,十六进制数前分别显示\0b,\0o,\0x。
width,可选参数,指定所占宽度。
.precision,可选参数,指定保留的小数位数。
type,可选参数,指定类型,和C语言非常类似,若为G或g,则自动在e和f转换。
python 代码:num = 12
string = 'abc'
print('{:.2f}, {}'.format(num, string))
# 12.00 abc
Python3.6新出的f-string
f-string就是在字符串前面加一个“f”,在字符串内部使用大括号包围变量的方式来格式化字符串,如上方f'{num}
就相当于'%d'%num
和'{:d}.format(num)
。我最喜欢用这种方式格式化字符串,因为它直接将变量名称作为占位符,不需要使用上方的两种方法而来回对比占位符和变量名称,使代码更简洁。
name = "Alice"
age = 25
formatted_string = f"My name is {name} and I am {age} years old."
print(formatted_string)
f-string也支持一些预处理操作,如'%.2f'%num
表示将数字小数点后保留两位,对应的f-string为f'{num:2f}
。Python中常用的f-string字符串预处理如下。
- 格式化数字。
num = 3.14159
formatted_num = f"{num:.2f}"
print(formatted_num)
# 3.14
- 对其和填充。“>”表示右对齐,“^”表示居中对齐,“<”表示左对齐,后面的数字表示文字宽度,字符表示填充字符,格式为
:<填充字符><宽度>
。
name = "Alice"
print(f"|{name:<10}|") # 左对齐: |Alice |
print(f"|{name:>10}|") # 右对齐: | Alice|
print(f"|{name:^10}|") # 居中对齐: | Alice |
print(f"|{name:*^10}|") # 填充: |**Alice***|
运行结果如下。

- 格式化日期和时间。当对datetime对象进行格式化时可以在冒号后面跟上要格式化的时间。
import datetime
now = datetime.datetime.now()
print(f'现在是{now:%Y年%m月%d日%H时%M分%S秒}')
# 现在是2023年07月21日17时40分29秒
- 当数字位数过多时,指定使用何字符隔开数字。
number = 42000
formatted_number = f"{number:,}" # 使用千位分隔符: 42,000
print(formatted_number)
# 42,000
- 将数字转换为对应的进制。b为二进制数,o为八进制数,e为指数,x为十六进制数。
num = 22
print(f'{num:d} {num:b} {num:o} {num:e} {num:x}')
# 22 10110 26 2.200000e+01 16
num = 1.234
print(f'{num:.2f}')
# 1.23
自定义格式化预处理。
通过重写`__format__(self, format_spec)
即可自定义格式化字符串时做何种处理。其中format_spec代表格式化处理选择,如前面提到的%.2f中的.2f代表保留小数点后两位、format方法中{}
占位符内冒号后面的.2f以及f-string中冒号后方的.2f都是format_spec参数。
class Text:
def __init__(self, text: str):
self.text = text
def __format__(self, format_spec):
if format_spec == 'upper':
return self.text.upper()
return self.text.__format__(format_spec)
abc = Text('abc')
print(f'{abc:upper}')
# ABC