55个案例吃透python字符串格式化
在上一篇Python字符串初相识中,我们介绍了字符串的很多基础内容。本文中介绍的字符串一个非常重要的知识点:字符串格式化输出。
格式化怎么理解?简答来说:就是让字符串按照我们设定的格式来输出,达到我们想要的结果。主要是有4种方式:
- %:占位符的格式化
- format()函数的格式化:重点掌握
- f-string格式化:重点掌握
- 字符串模板函数string template
占位符%
常见格式符
格式化符号其实是为真实的值预留出一个空位,而且还可以控制显示的格式。格式符包含一个类型码,用来显示不同的数据类型,比如字符串、二进制、指数等。常见的不同的占位符如下:
- %s: 字符串 (采用str()的显示),常用
- %r: 字符串 (采用repr()的显示)
- %c: 单个字符,格式化字符及其ASCII码
- %b: 二进制整数
- %u: 格式化无符号整数,常用
- %d: 格式化十进制整数,常用
- %i: 十进制整数
- %o: 八进制整数
- %x: 十六进制整数
- %g: 指数(e)或浮点数%f (根据显示长度)
- %G: 指数(E)或浮点数%F (根据显示长度)
- %e: 指数 (基底写为e),用科学计数法格式化浮点数
- %E: 指数 (基底写为E),用法同%e
- %f: 浮点数,格式化浮点数字,可以指定小数点后面的精度,常用
- %F: 浮点数,与%f相同
- %%: 字符“%”,用来显示百分号%
对齐问题
关于对齐问题:
1 | 1. ^:居中对齐 |
语法形式
常用的语法形式为:%[(name)][flags][width].[precision] typecode
- (name):参数的名称,可以省略;如果使用必须加上()
- flags:对齐标志位;可以是+、-、“”、0;+右对齐,-左对齐,""填充一个空格;0表示左侧使用0填充
- width:显示的宽度
- precision:小数点后的精度
多种类型连用
1 | print("%9.3f" % 2.3) |
2.300 # 前面4个空格
- 第一个 % 后面的内容为显示的格式说明,9 为显示宽度,3 为小数点位数,f 表示输出为浮点数类型
- 第二个 % 后面为显示的内容来源,输出结果默认为右对齐,2.300 长度为 5,故前面有4个空格
1 | print("%+9.3f" % 2.3) # 带上+符号输出,9表示宽度,3表示小数位 |
+2.300
1 | print("%-9.3f" % 2.3) # -表示左对齐输出 |
2.300
1 | print("%-9.3f" % -2.3) |
-2.300
1 | # 我们显示声明3个变量 |
1 | # 1、浮点数默认是6位小数 |
我是:Yule Cottage,年龄: 25,身高是:1.760000
1 | # 指定浮点数的小数位 |
我是:Yule Cottage,年龄: 25,身高是:1.760
下面的代码是通过字典对的形式来传入不同的数据类型,字典(后面会介绍python的字典)的值就是待格式的内容。
需要注意的是name、age、height必须写在%号的后面
1 | print("我是:%(name)s,年龄: %(age)d,身高是:%(height).3f" % {"name":name,"age":age,"height":height}) |
我是:Yule Cottage,年龄: 25,身高是:1.760
输出不同进制
1 | print("八进制:%o,十进制:%i,十六进制:%x" %(age,age,age)) |
八进制:31,十进制:25,十六进制:19
1 | # print("二进制:%b" %(age)) # 二进制不能使用 |
1 | bin(age) # 通过bin函数查看 |
'0b11001'
输出的宽度、精度等设置
1 | number = 1.23456789 |
1.2346
1 | print("%-10.4f" % number) # -符号表示左对齐,显示4位小数 |
1.2346
1 | # 右对齐,保留10位小数,不足的用0补齐 |
1.2345678900
1 | print("%-10.8f" % number) # 左对齐,保留8位小数 |
1.23456789
1 | # 左对齐,保留7位小数,会自动地进行四舍五入 |
1.2345679
下面是针对字符串的宽度等输出设置:
1 | name |
'Yule Cottage'
1 | print("%.10s" % name) # 9个字母+一个空格:左对齐 |
Yule Cotta
1 | print("%.15s" % name) # 如果位数不够,直接全部输出 |
Yule Cottage
1 | print("%10.6s" % name) # 右对齐,取出6个字符 |
Yule C
解释:总长度为10,前面4个空格,加上4+一个空格+C
format格式化
从python2.6+开始,新增了一种格式化字符串的函数str.format
,可以说极大地增强了字符串格式化的功能,基本语法是通过{}
和:
来代替占位符%
- 接收多个不限制的参数
- 位置可以不按照顺序
语法形式
{<参数序号>:<格式控制标记>}
,中间有一个冒号,不能省略!!!
1 | name = "Yule Cottage" # 字符串类型 |
多个参数连用
1 | # 1、不设置位置 |
名字是:Yule Cottage,年龄是:25,身高是:1.76,性别:男
1 | # 2、设置位置参数 |
名字是:Yule Cottage,年龄是:25,身高是:1.76,性别:男
1 | # 设置位置参数 |
名字是:Yule Cottage,身高是:1.76,年龄是:25,性别:男
1 | print("性别:{3},身高是:{2},名字是:{0},年龄是:{1}".format(name,age,height,sex)) |
性别:男,身高是:1.76,名字是:Yule Cottage,年龄是:25
1 | # 3、元组形式 |
姓名是:Peter,年龄是:25
1 | # 4、字典形式 |
名字是:Yule Cottage,年龄是:25,身高是:1.76,性别:男
1 | # 5、直接变量赋值 |
名字是:Yule Cottage,年龄是:2岁,身高是:1.75m,性别:男
对齐
宽度为20,我们实现居中、靠左、靠右对齐
1 | name |
'Yule Cottage'
1 | print("{:^20s}".format(name)) # 居中 |
Yule Cottage
Yule Cottage
Yule Cottage
数值多种形式
首先我们还是看看对齐问题,浮点数的对齐只保留6位小数:
1 | pi = 3.1415926 |
3.141593
3.141593
3.141593
看看不同情况下的输出格式,浮点数需要带上小数点,默认全部是左对齐:
1 | # 不同的输出方式 |
3.1415926
3.14
3.1415926000
314.1593%
3.14e+00
填充
1 | sex |
'男'
1 | print("{0:30}".format(sex)) # 字符串默认左对齐 |
男
男
25
1.76
1 | # 指定填充的字符 |
*****************************男
+++++++++++++++++++++++++++++男
++++++++++++++男+++++++++++++++
1.76++++++++++++++++++++++++++
千位分隔符
主要是用来显示数字的千位分隔符,在货币金额中使用的比较多:
1 | b = 1003005000600 |
---1003005000600----
-1,003,005,000,600--
1 | # 小数的千位分隔符显示 |
12,567.9876
----12,567.9876-----
---------12,567.9876
12,567.9876---------
精度
精度输出的时候前面必须有一个小数点开头,具有两层含义:
- 浮点数:表示输出小数位的有效位数
- 字符串:精度表示输出的最大长度
1 | pi |
3.1415926
1 | "{:.3f}".format(pi) |
'3.142'
1 | "{:30.5f}".format(pi) # 小数点后5位,整体宽度30 |
' 3.14159'
1 | "{:*^30.5f}".format(pi) # 小数点后5位,宽度30,居中后补充* |
'***********3.14159************'
1 | name |
'Yule Cottage'
1 | "{:.4}".format(name) # 最大长度为4 |
'Yule'
1 | "{:.6}".format(name) # 输出最大长度为6 |
'Yule C'
多种输出类型
表示输出整数和浮点数类型的格式规则。对于整数类型,输出格式包括6 种:
- c: 输出整数对应的 Unicode 字符;
- b: 输出整数的二进制方式;
- o: 输出整数的八进制方式;
- d: 输出整数的十进制方式;
- x: 输出整数的小写十六进制方式;
- X: 输出整数的大写十六进制方式;
下面的例子表示的是365的二进制、Unicode字符、十进制、小写16进制和大写的16进制的不同输出格式:
1 | "{0:b},{0:c},{0:d},{0:o},{0:x},{0:X}".format(365) |
'101101101,ŭ,365,555,16d,16D'
如果是浮点数类型,那么输出格式包括4种:
- e: 输出浮点数对应的小写字母 e 的指数形式;
- E: 输出浮点数对应的大写字母 E 的指数形式;
- f: 输出浮点数的标准浮点形式;
- %: 输出浮点数的百分形式。
浮点数输出时尽量使用<.精度>表示小数部分的宽度,有助于更好控制输出格式。
1 | "{0:e},{0:E}".format(3.1415) |
'3.141500e+00,3.141500E+00'
1 | "{0:f},{0:F}".format(3.1415) |
'3.141500,3.141500'
1 | "{0:%}".format(3.1415) # 保留6位小数,百分比输出 |
'314.150000%'
1 | "{0:.2%}".format(3.1415) # 2位小数,百分比输出 |
'314.15%'
f-string
f-string是python3.6开始引入的新字符串格式化方法。其实它的方法很多和format是类似的,下面通过具体的例子来讲解。
简单例子
首先我们看一个简单的例子,说明f-string如何使用:
1 | a = "hello" |
'hello python'
指定变量格式化
1 | # 我们显示声明3个变量 |
1 | f'名字是:{name},年龄是:{age},身高是:{height}' # 前面加上f |
'名字是:Yule Cottage,年龄是:25,身高是:1.76'
我们和format进行一下对比:
1 | "名字是:{},年龄是:{},身高是:{}".format(name,age,height) # format函数在最后面 |
'名字是:Yule Cottage,年龄是:25,身高是:1.76'
指定表达式格式化
如果后面的string部分是表达式,也可以进行格式化
1 | f'{1+2+3}' |
'6'
1 | f'{1*2*3*4}' |
'24'
对表达式进行变量的赋值再格式化:
1 | x = 100 |
'5002.0'
指定函数格式化
上面的例子是直接赋值再通过表达式来格式化,我们其实可以将上面的表达式改成函数,传入参数来格式化,函数可以是:
- python自带的函数
- 自定义的函数
1 | # 自带函数 |
my name is: Yule Cottage
my name is: YULE COTTAGE
1 | # 自己写个函数 |
'5002.0'
1 | # 或者直接写成lambda 匿名函数 |
'执行的结果是:5002.0'
对齐
- <:靠左,字符串默认方式
- >:靠右,数值类型默认方式
- ^:居中
1 | print(f'{name}') # 字符串默认左 |
Yule Cottage
Yule Cotta
Yule Cottage
1 | pi = 3.1415926 |
3.1415926
3.1416
3.1416
3.1416
填充
1 | print(f'{pi}') # 原数据 |
3.1415926
**3.1416**
****3.1416
3.1416****
千位分隔符
和format中的千位分隔符相同,主要是用于金融货币中,自带金钱属性呀。可以使用逗号或者其他符号,常用逗号:
1 | money = 1234567890 |
1,234,567,890.000000
1 | print(f'{money:_f}') # 使用下滑线 |
1_234_567_890.000000
字符串模板string template
string.Template是将一个string设置为模板,通过替换变量的方法,最终得到想要的string
1 | from string import Template # 导入模板 |
'Peter is male'
1 | from string import Template # 导入模板 |
'Peter is male'
在上面的例子中:
-
模板s中有以$符号说明模板中有两个变量名,用实际的变量来替换。
-
格式是dictionary,并且字典中的key值与模板中的变量名要保持一致
-
string.Template默认用$符号来标识出变量;可以进行修改
1 | from string import Template |
格式整理
整理下关于对齐、精度、数值类型的符号等知识点:
对齐
- <:右对齐(数值默认对齐方式)
- >:左对齐(字符串默认对齐方式)
- ^:居中
符号
- +:负数前加负号(-),正数前加正号(+)
- -:负数前加负号(-),正数前不加任何符号(默认)
- 空格:负数前加负号(-),正数前加一个空格
宽度和精度
- width:指定宽度为width
- width.precision:宽度为width,精度为precision
- 0width:宽度为width,指定高位用0补足宽度
总结
1、%占位符
表达式比较直观,容易上手;但是当参数变多的时候,格式就变得繁琐,这种方式现在几乎淘汰
2、format函数
方法比较灵活,能够自己设置参数来对应相应的变量;参数变多的时候,表达式同样繁琐,整个式子会非常长
3、f-string
相对前两种方式会灵活些,也更直观。Python3.6开始出现,语句格式可能稍显复杂
重点还是要掌握format函数和f-string