字符串的内置方法大致有40来个,但是一些常用的其实就那么20几个,而且里面还有类似的用法,区分度高比如:isalpha,isalnum,isdigit,还有一些无时不刻都会用到的split切分,join拼接,strip首尾去指定字符,作用无非就是围绕字符串的增删改查来进行,本人认为要弄清楚和熟练使用这些常用的方法,一方面需要在理解的基础上多多练习多多回顾,同时在工作使用中去巩固,加深记忆。忘记没关系,善于总结归纳,善于对自己大脑记忆的‘增删改查’才是重点。

str.format的意义:
作为一个初学者,最近发现字符串中最繁杂的一个方法莫过于:str.format()了,format见名思义,格式化,格式化完为了干嘛,其实就是为了得到我们需要格式的数据,也就是格式化输出,格式化输出我们一开始学习的是用%s、%d来实现,但是这种方法有很多局限性,比如%s是按照位置格式化输出,局限性显而易见,如果一次性格式化输出太多,还是根据位置来输出的话就太容易出错了。所以更精确的一种格式化输出方法就是str.format()
str.format方法介绍:
1、通过字符串中的花括号{}来识别替换字段,从而完成字符串的格式化。
2、替换的内容包括:字段名、格式说明符三部分,形式一般为:{字段名:格式说明符}
以上是简介,下面是干货:
具体实现:
1、简单实现方法:
(1)省略不写{} ____写法类似%s按位置格式化输出
(2)数字{十进制非负整数} ____写法类似依据位置索引传参
(3)变量名{关键字} ____写法类似关键字参数传参
(4)可以混合使用
1.1 省略不写:花括号内省略不写,代表传递位置参数
替换字段形式{}
注意事项:花括号个数少于等于后面的位置参数的个数,多了肯定报错。
1 2 3 4 5 6 7 | # 用{}代表占位符,直接位置传参
print ( '我是{},喜欢{}!' .format( '灭霸' , '打响指' ))
# 我是灭霸,喜欢打响指!
# {}数量必须少于后面位置参数数量,不然报错
print ( '我是{},喜欢{},不喜欢{}。' .format( '宙斯' , '放大抢人头' , '放空大' , '小短腿' ))
print ( '我是{},喜欢{},不喜欢{}。' .format( '宙斯' , '放大抢人头' ))
# 报错误:IndexError: tuple index out of range
|
1.2 数字形式传参:通过位置索引值传递位置参数
索引从整数0开始
索引可以重复引用,输出
索引数值就是后面位置参数放入一个元组来取值的过程,所以索引数值不能大于元组里面位置参数的索引值,否则报错
1 2 3 4 5 6 | print ( '我身高{0},年龄正好{1},{2}长。' .format( '180cm' ,18, '15cm' ))
# 我身高180cm,年龄正好18,15cm长。
print ( '我身高{0},{0}不多不少,年龄正好{1}。' .format( '180cm' ,18))
# 我身高180cm,180cm不多不少,年龄正好18。
print ( '我身高{0},年龄正好{1},{2}长。' .format( '180cm' ,18))
# IndexError: tuple index out of range
|
1.3 变量名{关键字} 传递输出参数
想想关键字参数怎么传参,类比一下,bingo!
特别注意,关键字的变量名在参数那里无需加引号,同时{}里面引用直接填变量名。
1 2 3 4 | print ( '我的名字叫{name},我其实是一名{career}!' .format(name= '尹天仇' ,career= '演员' ))
# 我的名字叫尹天仇,我其实是一名演员!
print ( '我叫{name2},又名{name1},我弟弟叫{name3}!' .format(name1= '至尊宝' ,name2= '秦汉' ,name3= '秦祥林' ))
# 我叫秦汉,又名至尊宝,我弟弟叫秦祥林!
|
1.4 {}、{0}、{name}混合使用
位置参数在前,关键字参数在后
{}不能与数字形式{0}同时使用。
1 2 3 4 5 6 7 8 | print ( '吹个{0},吹个{2},吹大了{1},玩{ball}!' .format( '球' , '气球' , '大气球' ,ball= '球球' ))
# 吹个球,吹个大气球,吹大了气球,玩球球!
print ( '吹个{},吹大了{},玩{ball}!' .format( '球' , '气球' , '大气球' ,ball= '球球' ))
# 吹个球,吹大了气球,玩球球!
print ( '吹个{0},吹大了{1},玩{ball}!' .format( '球' , '气球' , '大气球' ,ball= '球球' ))
# 吹个球,吹大了气球,玩球球!
print ( '吹个{0},吹大了{},玩{ball}!' .format( '球' , '气球' , '大气球' ,ball= '球球' ))
#报错 ValueError: cannot switch from manual field specification to automatic field numbering
|
2、使用元组和字典传参:
str.format()方法可以使用*元组和**字典的形式传参,可以混用。
方法相当于*args和**kwargs打散传参,元组按位置或索引传参,字典按关键字传参。
位置参数、关键字参数、*元组、**字典也可以同时使用,但要注意位置参数在关键字参数前,*元组要在**字典前。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # 元组
print ( '我喜欢{},喜欢{},同时也喜欢{}!' .format(*( '篮球' , '足球' , '观球' )))
# 我喜欢篮球,喜欢足球,同时也喜欢观球!
print ( '我喜欢{0},喜欢{1},同时也喜欢{2}!' .format(*( '篮球' , '足球' , '观球' )))
# 我喜欢篮球,喜欢足球,同时也喜欢观球!
# 字典
print ( '{name}的女朋友是{gf},我也喜欢{gf}!' .format(**{ 'name' : '钢铁侠' , 'gf' : '小辣椒' }))
# 钢铁侠的女朋友是小辣椒,我也喜欢小辣椒!
# 元组+字典
print ( '我是{beauty}的{1},我们都喜欢{0},请大家{2}!' \
.format(*( '球类' , '球迷' , '文明观球' ),**{ 'beauty' : '斯嘉丽约翰逊' ,}))
# 我是斯嘉丽约翰逊的球迷,我们都喜欢球类,请大家文明观球!
# 位置参数、关键字参数、元组、字典混合使用:
print ( '我是{name},好像{age}了 ^_^,在{0},等你哦!\n喜欢{1}、{2}和{3}。\n我的唯一 >>>:{only_one}\n我的小可爱 >>>: {love}!' \
.format( '武汉' ,name= '苏光体' ,age=18,*( '读书' , '健身' , '折腾数码' ),**{ 'only_one' : '杨林' , 'love' : '苏弘睿' }))
# 我是苏光体,好像18了 ^_^,在武汉,等你哦!
# 喜欢读书、健身和折腾数码。
# 我的唯一 >>>:杨林
# 我的小可爱 >>>: 苏弘睿!
|
使用元组或者字典格式化输出的形式就是相当于将元组和字典打散,变成位置参数们和关键字参数们然后按照前面的方法传参就行。
相关推荐:《Python视频教程》
3、对象参数格式化输出传值:
formate还可以使用对象属性传参,这个对象可以是实例化的对象,也可以是列表、字典。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | # 对象属性传参
# 实例化对象:
class Dog:
def __init__(self,name,speak):
self.name=name
self.speak=speak
dog1=Dog( '小黄' , '汪汪汪' )
print ( '我的{0.name}会{0.speak}。' .format(dog1))
# 我的小黄会汪汪汪。
# 文件对象
with open( 'text.txt' , 'wb' ) as f:
print ( '打开的文件名为:{0.name}' .format(f))
# 打开的文件名为:text.txt
# 列表、字典对象
print ( 'I have a {0[0]} , I have a {0[1]} .' .format([ 'Apple' , 'Pen' ]))
print ( '我叫{0[name]},{0[id]}就是我!' .format({ 'name' : '阿星' , 'id' : '9527' }))
print ( '{1[name]}变成了{0[0]},藏进了{1[role]}的裤裆里,为什么不变{0[1]}而是{0[0]}呢?' .format([ '葡萄' , '苹果' ],{ 'name' : '菩提老祖' , 'role' : '至尊宝' }))
# I have a Apple , I have a Pen .
# 我叫阿星,9527就是我!
# 菩提老祖变成了葡萄,藏进了至尊宝的裤裆里,为什么不变苹果而是葡萄呢?
|
4、格式说明符:规定传入参数字符的格式
比如:
1 2 | print ( '{0:.4f}' .format(3.1415926))
#在传入参数后面用冒号:写入规定的格式:.4f(取4位小数) 结果为:3.1416
|
说明符格式标准:[填充]对齐方式][正负号][#][0][宽度][分组选项][.精度][类型码] 同时存在是有顺序之分的,具体使用下面有具体示例:
填充:
(1)填充字符只能有一个
(2)不指定默认用空格填充
(3)如果指定填充字符,则必须要同时指定对齐方式
对齐方式:
(1)< 左对齐
(2)> 右对齐
(3)^ 居中对齐
(4)= 在正负号和数字之间填充(仅对数字类型有效)可以输出类似:+00000012的字符串。
正负号:
(1)仅对数字类型生效
(2)+ - 正负号
(3)空格:正数前面需要添加一个空格,以便与负数对齐
宽度width
(1)不指定宽度,宽度由内容决定
(2)宽度前有0,意味着用0填充,等价于 0=的填充和对齐方式
精度
(1)指小数点后面展示的小数位数。
(2)对于非数字类型,指字段宽度。
(3)整数类型不能指定精度,会报错的。
下面看示例吧:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #在传入参数后面用冒号:写入规定的格式:.4f(取4位小数) 结果为:3.1416
# 填充、对齐、宽度
print ( '{0:人>2}' .format( '<我是谁>' )) # 宽度不够,按实际字符显示
print ( '{0:人<11}' .format( '<我>' ))
print ( '{0:人^11}' .format( '<我>' ))
# <我是谁>
# <我>人人人人人人人人
# 人人人人<我>人人人人
# 正负号、精度
print ( '{0:*=+10.4f}' .format(3.1415926)) # '*' >填充符, '=' >指定在正负号和数字之间填充, '10' >宽度, '.4f' >精度
print ( '{0:*>+10.4f}' .format(3.1415926)) # 同上, '>' >右对齐
# +***3.1416
# ***+3.1416
print ( '{0:&>10.4f}' .format(3.1415926))
print ( '{0:&<10.4f}' .format(3.1415926))
print ( '{0:&>10.4}' .format( '我是中国人' )) # 精度为4,去字符串中的前4个字符
# &&&&3.1416
# 3.1416&&&&
# &&&&&&我是中国
|
类型码(规定输出的数据类型)
(1)字符串类型
(2)整数类型
(3)浮点数类型
1 2 3 4 5 6 7 8 9 10 11 12 13 | # 字符串类型(默认类型,忽视)
print ( '{0:s}' .format( 'abc' )) # abc
print ( '{0:}' .format( 'abc' )) # abc
# 整数类型
# b 二进制|c Unicode字符|d 十进制整数|还有很多比如o八进制|x十六进制...等等
print ( '{0:b}' .format(101)) # 1100101
print ( '{0:c}' .format(101)) # e
print ( '{0:d}' .format(666)) # 666
# 浮点数字类型
# e 科学计数(默认精度6位)
print ( '{0:e}' .format(31415926)) # 3.141593e+07
# f 定点记法(默认精度6位)
print ( '{0:f}' .format(3.1415926)) # 3.141593
|
以上例子可以说不太全面,只是大概举了几个常见的,除了e,f类型还有g通用类型,n number类型,对于日常使用的话并不常用。所以不一一列出。
5、其他补充:
花括号本事如需格式化输出,可以用外套2层花括号转义解决
1 2 | print ( '{{0}}' .format( 'abc' )) # {0}
print ( '{{{0}}}' .format( 'abc' )) # {abc}
|
一些另类格式化输出:
1 2 3 4 | from datetime import datetime
print ( '今天是:{0:%Y-%m %H:%M}' .format(datetime.now()))
# 结果:
今天是:2019-05 15:10
|
总结:
str.format()格式化输出方法可以说是%s的加强型,特别是在处理更复杂的格式化输出过程时候,可以更精确的进行达到输出目的,它集成的方法可以说比较繁杂,很多方法个人认为用处不大,仅仅是锦上添花的作用,个人认为只要掌握前面几个简单的位置参数、关键字参数、元组、字典的传参形式的格式化输出就可以了。后面的方法可以有,但是不建议进行强行记忆,因为精力有限,用时再打开翻翻也就明了。