Python中的四种字符串格式,格式化


假设有以下变量可以供我们使用:

name = "小明"
age  = 20

方式一:通过 % 操作符

没加别名时,%号后的参数需要按顺序传入:

result = "我的名字叫%s,我今年%d岁了。" % (name, age)
print(result) # 我的名字叫小明,我今年20岁了。

加了别名时根据别名传参,可以不按顺序传递参数:

result = "我的名字叫%(name)s,我今年%(age)d岁了。" % {"name": name, "age": age}
print(result) # 我的名字叫小明,我今年20岁了。

方式二:通过在字符串对象上调用format()函数

不使用别名时,参数要按顺序传入:

result = "我的名字叫{},我今年{}岁了。".format(name, age)
print(result) # 我的名字叫小明,我今年20岁了。

使用别名时,可以根据别名传参,不需要按顺序传入:

result = "我的名字叫{name},我今年{age}岁了。".format(age=age, name=name)
print(result) # 我的名字叫小明,我今年20岁了。

方式三:字符串的字面值插值(需要Python 3.6+ 才支持)

这种方式可以在字符串常量内使用嵌入的Python表达式,这种语法很强大,我们可以嵌入任意的Python表达式

result = f"我的名字叫{name},我今年{age}岁了。"
print(result) # 我的名字叫小明,我今年20岁了。

还可以直接在 {} 中进行计算,或插入函数等

result = f"再过两年我就{age+2}岁了"
print(result) # 再过两年我就22岁了

result = f"我会计算1-100的和:{sum(range(1,101))}"
print(result) # 我会计算1-100的和:5050

方式四:使用模板字符串 Template

使用 Template 需要从 string 中导入 Template,模板字符串不能使用格式说明符

from string import Template

b = Template("我的名字叫$name,我今年$age岁了。")
result = b.substitute(name=name, age=age)
print(result) # 我的名字叫小明,我今年20岁了。

字符串格式化方式的选择

如果格式字符串是用户提供的,则推荐使用方式四 模板字符串 来避免安全问题,如果不是,则考虑Python的版本,Python 3.6 + 的使用方式三 字符串字面值插值 ,老的版本则使用方式二 通过在字符串对象上调用format()函数 来对字符串进行格式化。