一.前言

本文按照Python格式化字符串的历史来按顺序介绍三种字符串格式化方法。

二.字符串格式化的方法

2.1 使用%格式化运算符

使用%来进行字符串格式化时,预定义的文本模板在%运算符的左侧,要插入文本模板的值在%的右侧,以单个值或多个值组成元组的形式提供,例如:

m_str = "python"
print("hello %s" % m_str)
# hello python
a,b = 2,3
print("%d + %d = %d" % (a,b,a + b))
# 2 + 3 = 5

在上述的例子中,我们可以看到这种字符串格式化方法需要在文本模板中指定占位符(格式说明符),例如%s。Python继承了C语言中的printf函数的所有常用选项,例如%s %x %f,以及对小数位数、填充和对齐的控制。

但是Python中的C风格的格式化字符串也存在着一些问题。

问题1:左侧的占位符在右侧对应的值的类型必须要与占位符指定的类型一致,若不一致则会报错。为此,每次都必须进行手动检查类型一致性。

pi_str = 'pi'
pi_value = 3.14
print("%s = %.2f" % (pi_str, pi_value))
# pi = 3.14
print("%s = %.2f" % (pi_value, pi_str))
# TypeError: must be real number, not str

问题2:倘若需要使用多个相同的值,必须在%运算符右侧多次传入同一个值,虽然可以在格式化表达式用使用字典来解决,但是这样会增加行代码的长度,可能破坏Python代码的美感。

print("%f is %f" % (pi_value, pi_value))
# 3.141593 is 3.141593
print("%(piv)f is %(piv)f" % {'piv':pi_value})
# 3.141593 is 3.141593

2.2 使用str.format

Python3提供了一个更具有表达能力的字符串格式化函数format,其使用示例如下:

pi_str = 'pi'
pi_value = 3.1415926
print("{} = {}".format(pi_str, pi_value))
# pi = 3.1415926

上述示例中{}表示一个占位符,在占位符中可以使用冒号:+格式说明符来指定对相应值的格式设置。

print("{:<10} = {:.2f}".format(pi_str, pi_value))
# pi         = 3.14

另外,在format中还可以指定右侧参数的位置索引

print("{1} = {0}".format(pi_value, pi_str))
# pi = 3.1415926

位置索引可以重复多次,这样可以避免在format()参数列表中多次传入同一个值。

print("{0} is {0}".format(pi_value))
# 3.1415926 is 3.1415926

2.3 使用F-strings

Python3.6开始引入了F-strings,其语法格式是在格式化字符串前面加一个字符f

print(f"{pi_str} = {pi_value}")
# pi = 3.1415926

F-string允许在格式化字符串中直接引用其作用域内的所有名称来作为格式化表达式的一部分。倘若需要指定某个值的格式,同样采用:+格式说明符的方式,即:

print(f"{pi_str} = {pi_value:.2f}")
# pi = 3.14

F-strings还允许在占位符括号中直接使用完整的Python表达式

m_str = "hello world"
print(f"The length of '{m_str}' is {len(m_str)}")
# The length of 'hello world' is 11

在F-strings中,Python表达式也可能出现在格式说明符选项中,例如:

num = 2
pi_str = 'pi'
pi_value = 3.1415926
print(f"{pi_str} = {pi_value:.{num}f}")
# pi = 3.14

三.总结

从对上面三种字符串格式化方法的介绍来看,最间接,最优雅的当属F-strings了,这种方式也是官方推荐的。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐