格式化字符串
什么是格式化字符串
还记得前面学过的,计算税后薪资 的程序的例子吗?
让用户输入薪资,乘以75% 得到税后薪资,打印到屏幕上。
代码如下
salary = input('请输入薪资:')
# 计算出税后薪资
aftertax = int(salary)*75/100
# 再转化为字符串,方便下面的字符串拼接
aftertaxStr = str(aftertax)
print('税后薪资是:' + aftertaxStr)
如果我们要显示的不仅是税后薪资,还有税前薪资,缴税额。像下面这样
代码又该怎么写呢?我想肯定难不倒聪明的你。
对了, 加号可以连接多个字符串,可以这样
salary = input('请输入薪资:')
# 计算出缴税额,存入变量tax
tax = int(salary) *25/100
# 转化为字符串,方便下面的字符串拼接
taxStr = str(tax)
# 计算出税后工资,存入变量aftertax
aftertax = int(salary) *75/100
# 转化为字符串,方便下面的字符串拼接
aftertaxStr = str(aftertax)
print('税前薪资是:' + salary + '元, 缴税:' + taxStr + '元, 税后薪资是:' + aftertaxStr + '元')
运行一下,确实可以。
但是这里面有问题吗?
对了最后一句代码,写的是不是有点。。。。。烧脑?
字符串的多次拼接比较麻烦,一不小心就可能 漏掉了 一个加号或者引号。
如果我们能够这样写
然后,直接将我们计算好的 税前薪资, 缴税额,税后薪资 分别作为 x, y, z 填入进去。
这样就不需要麻烦的字符串拼接了。
Python 支持这样的操作,这样的操作称之为字符串的格式化。
python3 中字符串格式化有如下几种方法
printf 风格
这种格式化语法 和 传统的C语言printf函数 一样 。
比如上面的例子里面,我们可以这样格式化字符串
salary = input('请输入薪资:')
# 计算出缴税额,存入变量tax
tax = int(salary) *25/100
# 计算出税后工资,存入变量aftertax
aftertax = int(salary) *75/100
print('税前薪资:%s元,缴税:%s元,税后薪资:%s元' %(salary,tax,aftertax))
大家运行一下看看,可以发现也能正确的输出结果。
大家可以发现,和前面的字符串拼接不同, 我们使用了下面这样模板一样的字符串
税前薪资是:%s 元, 缴税:%s 元, 税后薪资是:%s 元
其中 %s 就是模板中的占位符,表示这个位置先占着,待会儿要有数据填入到这里。
然后再提供一个元组,里面依次存放需要填入到 %s 位置 的数据。
这里是使用变量 (salary,tax,aftertax)
。
%s 是一种格式化符号, Python 解释器 看到 %s , 就会调用内置函数 str(),并将对应的 格式化对象 作为 参数传入 , 返回的结果字符串填入对应占位符。
简单说 %s 位置填入的结果,就是调用str函数的返回值。
str()内置函数的参数 可以是任何类型的对象,比如:字符串、 整数、 浮点数、列表、元组 等等,都可以。
所以 %s 为占位符, 对应的格式化对象, 不仅仅是字符串,还可以是整数、 浮点数、列表、元组 等等。
格式化字符串里面占位符的个数 必须 和 后面对应的格式化对象个数相同,
比如
占位符是3个,后面的元组里面 也应该 是3个对象 。
如果占位符是2个,后面的元组里面 也应该是2个对象。像这样
如果占位符是1个,后面的元组里面的格式化对象就应该是1个。像这样
还记得,我们说过, 元组里面只有1个元素,后面别忘了加个逗号。
像这种只有一个格式化对象的情况下,可以直接就用格式化对象,不需要放到元组里面,像这样
指定宽度和对齐
如果我们需要将下面这样的3个字符串进行格式化
得到的结果如下
会发现,由于被格式化的数字对应的字符串长度不同,导致结果不对齐。
这样的输出结果显得不够美观。
我们可以指定格式化结果的字符串长度,比如我想要格式化结果至少10个字符,不足10个字符补空格,就可以这样
%10s
中的 10
就是指定了格式化结果至少10个字符。
得到的结果就是
如果我们希望是左边对齐,而不是右边对齐,就可以加一个
-
,像这样
可以得到如下结果
%d 和 %f
占位符除了 %s ,还有其它的一些。
常见的是 %d 和 %f 。
%d 用在 格式化对象 是 整数的情况 ,比如
%f 用在 格式化对象 是 浮点数的情况,比如
前面我们说过了 %s 也可以用来格式化 整数和 浮点数,但是有些情况下, %d %f 有特别的用处。
比如,打印数字的时候,我们指定宽度,而且希望不足宽度 补零
,而不是补空格,就可以这样
可以得到如下结果
对于小数的格式化,通常使用 %f,如下
可以得到如下结果
如果我们想保留小数点后面2位数字,就可以加上 .2
像这样
可以得到如下结果
参考文档
更多 printf 风格的格式化 使用技巧,可以参考如下官方文档
我们这里不打算介绍更多了,因为到了Python3.6 ,有另外一种更方便的方式: f-string 格式化
f-string 格式化
f-string 格式化 就是在字符串模板前面加上f,然后占位符使用{} ,里面直接放入对应的数据对象。
如下所示
完整的代码如下
salary = input('请输入薪资:')
# 计算出缴税额,存入变量tax
tax = int(salary) *25/100
# 计算出税后工资,存入变量aftertax
aftertax = int(salary) *75/100
print(f'税前薪资是:{salary}元, 缴税:{tax}元, 税后薪资是:{aftertax}元')
运行一下,可以发现输出结果一样。
这种方式是不是更加的直观明了呢?
要注意的是,这种写法必须要Python解释器是3.6 以后的版本才支持哦。
指定宽度
同样,为了输出对齐,我们需要指定填入的字符串的宽度。
方法是,在括号里面的变量后面加上 :宽度值
比如
f'{salary:10}'
就指定了 宽度为10 个字符, 如果填入的字符串不足10个字符,就在前面加上空格
比如上面的输出结果就是
完整的一个示例程序如下
# 员工 1
salary = 8000
tax = int(salary) *25/100
aftertax = int(salary) *75/100
print(f'税前薪资是:{salary:8}元, 缴税:{tax:8}元, 税后薪资是:{aftertax:8}元')
# 员工 2
salary = 15000
tax = int(salary) *25/100
aftertax = int(salary) *75/100
print(f'税前薪资是:{salary:8}元, 缴税:{tax:8}元, 税后薪资是:{aftertax:8}元')
# 员工 3
salary = 100000
tax = int(salary) *25/100
aftertax = int(salary) *75/100
print(f'税前薪资是:{salary:8}元, 缴税:{tax:8}元, 税后薪资是:{aftertax:8}元')
运行一下结果如下:
税前薪资是: 8000元, 缴税: 2000.0元, 税后薪资是: 6000.0元
税前薪资是: 15000元, 缴税: 3750.0元, 税后薪资是: 11250.0元
税前薪资是: 100000元, 缴税: 25000.0元, 税后薪资是: 75000.0元
这样,整体就显得很清爽。
当然上面的代码 有很多重复的部分。聪明的你想到怎么优化一下了吗?
对了,用函数。像这样
def calcTax(salary):
tax = int(salary) *25/100
aftertax = int(salary) *75/100
print(f'税前薪资是:{salary:8}元, 缴税:{tax:8}元, 税后薪资是:{aftertax:8}元')
# 员工 1
calcTax(8000)
# 员工 2
calcTax(15000)
# 员工 3
calcTax(100000)
左右对齐
上面的输出结果是不足在前面补空格,对于数字对象来说,缺省为 右边对齐
,而字符串缺省为 左边对齐
。
比如
如果我们想指定左右对齐,可以在括号里使用 <
>
符号
箭头朝左就是左对齐,箭头朝右就是右对齐
比如
上面的薪资计算代码中,要打印的数字左对齐,就可以这样写
def calcTax(salary):
tax = int(salary) *25/100
aftertax = int(salary) *75/100
print(f'税前薪资是:{salary:<8}元, 缴税:{tax:<8}元, 税后薪资是:{aftertax:<8}元')
calcTax(8320)
calcTax(15023)
calcTax(100030)
运行结果如下:
税前薪资是:8320 元, 缴税:2080.0 元, 税后薪资是:6240.0 元
税前薪资是:15023 元, 缴税:3755.75 元, 税后薪资是:11267.25元
税前薪资是:100030 元, 缴税:25007.5 元, 税后薪资是:75022.5 元
小数点后位数
如果我们想指定小数点后保留几位,可以像这样 {salary:8.1f}
后面的.1f
就表示小数点后面保留1位
def calcTax(salary):
tax = int(salary) *25/100
aftertax = int(salary) *75/100
print(f'税前薪资是:{salary:8.1f}元, 缴税:{tax:8.1f}元, 税后薪资是:{aftertax:8.1f}元')
calcTax(8320)
calcTax(15023)
calcTax(100030)
运行结果如下:
税前薪资是: 8320.0元, 缴税: 2080.0元, 税后薪资是: 6240.0元
税前薪资是: 15023.0元, 缴税: 3755.8元, 税后薪资是: 11267.2元
税前薪资是:100030.0元, 缴税: 25007.5元, 税后薪资是: 75022.5元
不足补零
如果我们想在不足指定宽度的时候不是补空格,而是补数字0,可以像这样 {salary:08}
def calcTax(salary):
tax = int(salary) *25/100
aftertax = int(salary) *75/100
print(f'税前薪资是:{salary:08}元, 缴税:{tax:08.1f}元, 税后薪资是:{aftertax:08.1f}元')
calcTax(8320)
calcTax(15023)
calcTax(100030)
运行结果如下:
税前薪资是:00008320元, 缴税:002080.0元, 税后薪资是:006240.0元
税前薪资是:00015023元, 缴税:003755.8元, 税后薪资是:011267.2元
税前薪资是:00100030元, 缴税:025007.5元, 税后薪资是:075022.5元
上面的例子是对 数字
的不足补零,如果要对 字符串
不足补零,就应该 使用符号 <
或者 >
同时指定左右对齐方式。
>>> var = '34324'
>>> f'{var:08}'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: '=' alignment not allowed in string format specifier
>>> f'{var:<08}'
'34324000'
>>> f'{var:>08}'
'00034324'
16进制格式化数字
# 用 x 表示格式化为16进制,并采用小写格式
f'数字65535的16进制表示为:{65535:x}'
# 用 X 表示格式化为16进制,并采用大写格式
f'数字65535的16进制表示为:{65535:X}'
字符串内容里有花括号
采用 f-string 方式格式化的 字符串内容本身就有 {
或者 }
符号,一定要 双写
进行转义,否则会被当成是 格式化占位符。
比如 我们要格式化的字符串为 文章中 { 符号 出现了 xx 次