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