格式化字符串
还记得前面学过的,计算税后薪资 的程序的例子吗?
让用户输入薪资,乘以75% 得到税后薪资,打印到屏幕上。
代码如下
salary = input('请输入薪资:') # 计算出税后薪资 aftertax = int(salary)*75/100 # 再转化为字符串,方便下面的字符串拼接 aftertaxStr = str(aftertax) print('税后薪资是:' + aftertaxStr)
如果我们要显示的不仅是税后薪资,还有税前薪资,缴税额。像下面这样
税前薪资是 10000元, 缴税:2500元, 税后薪资是:7500元
代码又该怎么写呢?
我想肯定难不倒聪明的你。
对了, 加号可以连接多个字符串,可以这样
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 元
然后,直接将我们计算好的 税前薪资, 缴税额,税后薪资 分别作为 x, y, z 填入进去。
这样就不需要麻烦的字符串拼接了。Python 支持这样的操作,这样的操作称之为字符串的格式化。
可以点击文章末尾【了解更多】,或者百度搜索白月黑羽教Python,一起来学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()内置函数,它的参数几乎所有内置类型的对象,字符串、 整数、 浮点数 、list 等等都可以
所以 我们可以用 %s 为占位符, 对应的格式化对象, 不仅仅是字符串,可以是整数、 浮点数 、list 等等。
格式化字符串里面占位符的个数 必须 和 后面对应的格式化对象个数相同,
比如
'税前薪资:%s 元, 缴税:%s 元, 税后薪资:%s 元' % (salary,tax,aftertax)
占位符是3个,那么后面的元组里面的格式化对象就是3个。
如果占位符是2个,后面的元组里面的格式化对象就应该是2个。像这样
'税前薪资:%s 元, 缴税:%s 元' % (salary,tax)
如果占位符是1个,后面的元组里面的格式化对象就应该是1个。像这样
'税前薪资:%s 元' % (salary,)
还记得,我们说过, 元组里面只有1个元素,后面别忘了加个逗号。
像这种只有一个格式化对象的情况下,可以直接就用格式化对象,不需要放到元组里面,像这样
'税前薪资:%s 元' % salary
指定宽度和对齐
如果我们需要将下面这样的3个字符串进行格式化
'税前薪资:%s 元' % 100000 '税前薪资:%s 元' % 10000 '税前薪资:%s 元' % 1000
得到的结果如下
税前薪资:100000 元 税前薪资:10000 元 税前薪资:1000 元
会发现,由于被格式化的数字对应的字符串长度不同,导致结果不对齐。
这样的输出结果显得不够美观。
我们可以指定格式化结果的字符串长度,比如我想要格式化结果至少10个字符,不足10个字符补空格,就可以这样
'税前薪资:%10s 元' % 100000 '税前薪资:%10s 元' % 10000 '税前薪资:%10s 元' % 1000
%10s 中的 10 就是指定了格式化结果至少10个字符。
得到的结果就是
税前薪资: 100000 元 税前薪资: 10000 元 税前薪资: 1000 元
如果我们希望是左边对齐,而不是右边对齐,就可以加一个 - 好,像这样
'税前薪资:%-10s 元' % 100000 '税前薪资:%-10s 元' % 10000 '税前薪资:%-10s 元' % 1000
可以得到如下结果
税前薪资:100000 元 税前薪资:10000 元 税前薪资:1000 元
%d 和 %f
占位符除了 %s ,还有其它的一些。
常见的是 %d 和 %f 。
%d 用在 格式化对象 是 整数的情况 ,比如
'税前薪资:%d 元' % 10000
%f 用在 格式化对象 是 浮点数的情况,比如
'税前薪资:%f 元' % 10000.32
前面我们说过了 %s 也可以用来格式化 整数和 浮点数,但是有些情况下, %d %f 有特别的用处。
比如,打印数字的时候,我们指定宽度,而且不足宽度,希望补零,而不是补空格,就可以这样
'税前薪资:%010d 元' % 100000 '税前薪资:%010d 元' % 10000 '税前薪资:%010d 元' % 1000
可以得到如下结果
税前薪资:0000100000 元 税前薪资:0000010000 元 税前薪资:0000001000 元
对于小数的格式化,通常使用 %f,如下
'税前薪资:%010f 元' % 1000.4522 '税前薪资:%010f 元' % 1008.6621 '税前薪资:%010f 元' % 1009.3351
可以得到如下结果
税前薪资:1000.452200 元 税前薪资:1008.662100 元 税前薪资:1009.335100 元
如果我们想保留小数点后面2位数字,就可以加上 .2 像这样
'税前薪资:%010.2f 元' % 1000.4522 '税前薪资:%010.2f 元' % 1008.6621 '税前薪资:%010.2f 元' % 1009.3351
可以得到如下结果
税前薪资:0001000.45 元 税前薪资:0001008.66 元 税前薪资:0001009.34 元
参考文档
详细的 printf风格的格式化,可以参考如下官方文档
https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting
我们这里不打算介绍更多了,因为到了Python3.6 ,有另外一种更方便的方式: f-string 格式化
f-string 格式化
f-string 格式化 就是在字符串模板前面加上f,然后占位符使用{} ,里面直接放入对应的数据对象。
如下所示
f'税前薪资是:{salary}元, 缴税:{tax}元, 税后薪资是:{aftertax}元'
完整的代码如下
salary = input('请输入薪资:') # 计算出缴税额,存入变量tax tax = int(salary) *25/100 # 计算出税后工资,存入变量aftertax aftertax = int(salary) *75/100 print(f'税前薪资是:{salary}元, 缴税:{tax}元, 税后薪资是:{aftertax}元')
运行一下,可以发现输出结果一样。
这种方式是不是更加的直观明了呢?
要注意的是,这种写法必须要Python解释器是3.6 以后的版本才支持哦。
指定宽度
同样,为了输出对齐,我们需要指定填入的字符串的宽度。
方法是,在括号里面的变量后面加上 :宽度值
比如
salary = 10000 print(f'{salary:10}')
f'{salary:10}' 就指定了 宽度为10 个字符, 如果填入的字符串不足10个字符,就在前面加上空格
比如上面的输出结果就是
>>> salary = 10000 >>> print(f'{salary:10}') 10000
完整的一个示例程序如下
# 员工 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)
左对齐
上面的输出结果是不足在前面补空格,最终的结果就是右边对齐。 如果我们想左对齐,可以在括号里使用 < 符号
像这样 {salary:<8}
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元
转义符
我们在代码中定义一个字符串的时候,有些字符不太方便用键盘直接敲出来,或者敲出来看起来也不知道那是一个字符。
比如 换行符, 我们可以用回车键,敲出来。
a = '''abcd efg'''
其中abcd 和efg之间其实就是有一个换行字符。
有时候像这样的字符出现在字符串中,可以使用转义写法来表示,比如上的字符串就等价于
a = 'abcd\nefg'
‘\n’就是一个转义字符,表示一个换行字符。
处理’\n’ 之外,还有一些其他的字符可以用转义符表示,比如我们还可以用 ‘\t’表示tab字符。
Python字符串中 转义字符都是用反斜杠 \ 开头 。
如果字符串中本身需要有反斜杠,并非转义,比如Windows下面的路径
path = 'c:\windows\temp'
其中的 \t 会被当做一个tab字符,而不是 \ 和 t 两个字符。
这时,可以在在前面再加一个反斜杠, 像下面这样
path = 'c:\\windows\\temp'
也可以在字符前面加上一个 r ,表示字符串内容是raw string, 无需转义,像这样
path = r'c:\windows\temp'