格式化输出字符串的用处是,你有一个字符模板,然后不同的场景下替换掉模板的不同部分(比如人名)来输出字符。Python有两种方法可以用来格式化字符串(formatting string),一种是C语言的语法,即用%来格式化,另一种是format函数,下面我们来介绍这两种方法。
C-style formatting: %
使用%的语法形式是
"%dxxx%sxxx ..." % (var1, var2, ...)
var1和var2会被用来替换前面的%d %s。下面我们来解释他们各自是什么意思。我们先从最简单的一个例子看起
name = "Jack"
print("Hello,%s" % name) # ==> Hello, Jack
在上面这个例子中name的值会用来替换前一个字符串中的%s,%s被称作占位符,也就是会被替换掉的部分,它们都是以%开头,后面接上s d f等字母,比如%s %d %f %x等等。不同的占位符有不同的含义,这些含义基本上继承了C语言:%s表示替换的是个字符串(String)
%d表示替换的是个整数(Integer)
%f表示替换的浮点数(Float)
%x和%X表示替换的是整数的16进制表示,分别是小写和大写
下面我们看一个更复杂的例子
name = "Jack"
age = 18
height = 175.5
print("%sis%dyears old, with a height of%f" % (name, age, height))
# ==> Jack is 18 years old, with a height of 175.500000
这里有两点需要注意:一个是当需要替换的占位符多于一个的时候,替换值要用括号括起来形成一个tuple。第二个是这里的浮点数输出结果是175.500000而不是175.5,这是因为默认有一个浮点数的显示长度,你可以用下面的语法控制长度:比如%.2f表示保留两位小数。
print("%sis%dyears old, with a height of%.2f" % (name, age, height))
# ==> Jack is 18 years old, with a height of 175.50
format函数
除了C-style的%之外,Python引进了自己的格式化函数format,它的基本语法如下
"Hello, {}".format("world") # ==> "Hello, world"
{}替代了%成为了新的占位符标识,替换的时候也不再使用%而是使用format函数,替换的值作为函数的参数。新的format的好处在我看来有三点More pythonic,看起来更像是Python的代码,更美观一点。{}对新人来说没有%那么吓人
更简洁,{}可以不用像%s %d那样指定替换类型,format函数会自动识别
新的语法提供了更强大的功能,让你能从更细节的地方控制字符串的输出
我们用format函数来复现一下上面的例子
print("{} is {} years old, with a height of {}".format(name, age, height))
# ==> Jack is 18 years old, with a height of 175.5
可以注意到一点,format默认输出的浮点数的长度跟%是不一样的,不会输出多余的位数。那么如何像%那样控制输出结果呢?如下
print("{} is {} years old, with a height of {:.2f}".format(name, age, height))
# ==> Jack is 18 years old, with a height of 175.50
为了保留两位小数,我们在{}中加入了:.2f,:是必须的,用来表示后面的部分用来控制输出歌是,.2f的意思与%相同。
format中参数的顺序
format与%最为不同的一点在于,%要求替换的时候必须按照替换值出现的顺序来,而format则可以乱序替换,看下面的例子
print("{1} is {0} years old.".format(18, "Jack"))
# ==> Jack is 18 years old.
这里我们在{}中写上了数字,就代表用第几个参数替换当前的{},注意,顺序是从0开始数的。而且,format不要求每个替换值都被使用,也不要求每个替换值智能使用一次,比如
print("{1}'s name is {1}".format(18, "Jack"))
# ==> Jack's name is Jack
当我们想要同时控制替换顺序和格式化输出的时候我们就需要:了,如下
print("{2} is {0} years old, with a height of {1:.2f}".format(18, 175.5, "Jack"))
# ==> Jack is 18 years old, with a height of 175.50
注意第三个替换符{1:.2f},:前的1表示用第一个替换值,后面的.2f表示保留两位小数。相比之下,format是不是比%更加灵活而且更加容易阅读了呢?
以上便是本文的内容,谢谢阅读。