Python字符串格式化问题:%、format()与f-strings
共 6755字,需浏览 14分钟
·
2021-07-14 19:25
目 录
一、字符串格式化方法概览
二、format() 常用格式化
1、通过位置
2、通过关键字参数
3、通过对象属性
4、通过下标
5、格式限定符
1)字符的填充与对齐
2)数字精度与类型f处理
3)进制转换
4)千位分隔符
6、列表字典拆分
三、format() 底层语法
一、字符串格式化方法概览
方法 1 -------- 过去的格式化方法,代码中还能经常见到
在 python 2.6 之前,利用 百分号 % 表示占位符,进行格式化
name='小伍哥'
'Hello,%s'%name
Hello,小伍哥
方法 2 -------- 现阶段使用最多的方法
Python2.6 引入,它通过 {} 和 : 来代替%表示占位符,性能比 % 更强大,字符串的 format 方法
name='小伍哥'
'Hello,{}'.format(name)
'Hello,小伍哥'
方法 3 -------- 推荐使用的方法
为了进一步简化格式化方法,Eric Smith 在2015年提交了 PEP 498 -- Literal String Interpolation 提案。Python 3.6 引入了新的字符串格式化方式 f-strings,字符串开头加上一个字母 f ,与其它格式化方式相比,不仅简洁明了,可读性更好,更不容易出错,而且运行效率也更高
name='小伍哥'
f'Hello,{name}'
'Hello,小伍哥'
Python中常见的格式化的方法主要有三种,本文讲解目前最常用的format格式化方式,后期讲进行对比讲解。
二、format() 常用格式化
1、通过位置
'{0},{1}'.format('小伍哥',18)
'小伍哥,18'
'{},{}'.format('小伍哥',18)
'小伍哥,18'
'{1},{0},{1}'.format('小伍哥',18)
'18,小伍哥,18'
'{0}{1}{2}{3}{4}'.format('上','海','自','来','水')
'上海自来水'
'{0}{1}{2}{3}{4}{3}{2}{1}{0}'.format('上','海','自','来','水')
'上海自来水来自海上'
字符串的format函数可以接受不限个参数,位置可以不按顺序,可以不用或者用多次,不过2.6不能为空{},2.7才可以。foramt会把参数按位置顺序来填充到字符串中,第一个参数是0,然后1……
也可以不输入数字,这样也会按顺序来填充同一个参数可以填充多次,这个是format比%先进的地方
2、通过关键字参数
'{name},{age}'.format(age=18,name='小伍哥')
'小伍哥,18'
3、通过对象属性
class Person:
def __init__(self,name,age):
self.name,self.age = name,age
def __str__(self):
return 'This guy is {self.name},is {self.age} old'.format(self=self)
print(Person('小伍哥',18))
This guy is 小伍哥,is 18 old
c = 3-5j
print(('The complex number {0} is formed from the real part {0.real} and the imaginary part {0.imag}.').format(c))
The complex number (3-5j) is formed from the real part 3.0 and the imaginary part -5.0
4、通过下标
p=['小伍哥',18]
'{0[0]},{0[1]}'.format(p)
'小伍哥,18'
coord = (3, 5)
print('X: {0[0]}; Y: {0[1]}'.format(coord))
X: 3; Y: 5
有了这些便捷的“映射”方式,我们就有了偷懒利器。基本的python知识告诉我们,list和tuple可以通过“打散”成普通参数给函数,而dict可以打散成关键字参数给函数(通过和*)。所以可以轻松的传个list/tuple/dict给format函数。非常灵活。
5、格式限定符
它有着丰富的的“格式限定符”(语法是{} 中带: 号)
1)字符的填充与对齐
填充常跟对齐一起使用
^ < >分别是居中、左对齐、右对齐,后面带宽度
: 号后面带填充的字符,只能是一个字符,不指定的话默认是用空格填充
'{:>8}'.format('18')
' 18'
'{:0>8}'.format('18')
'00000018'
'{:*>8}'.format('18')
'******18'
注:字符串模块内置函数中也存在对齐的函数 str.center(),str.ljust(),str.rjust(),str.zfill()
'shuai'.center(10,'*')#居中对齐
'**shuai***'
'shuai'.ljust(10,'*')#左对齐
'shuai*****'
'18'.zfill(10)#右对齐
'0000000018'
2)数字精度与类型f处理
精度常跟类型f一起使用
'{:.2f}'.format(321.33345)
'321.33'
'π is {:.2f}'.format(3.1415926)
π is 3.14
'π is %.2f'% 3.1415926
π is 3.14
'{0:.4f}+{1:.4f}'.format(321.33345,325.33345)
'321.3335+325.3335'
"{:.2%}".format(0.00234)
'0.23%'
其中.2表示长度为2的精度,f表示float类型。
数字 | 格式 | 输出 | 描述 |
3.1415926 | {:.2f} | 3.14 | 保留小数点后两位 |
3.1415926 | {:+.2f} | +3.14 | 带符号保留小数点后两位 |
-1 | {:+.2f} | -1.00 | 带符号保留小数点后两位 |
2.71828 | {:.0f} | 3 | 不带小数 |
5 | {:0>2d} | 05 | 数字补零 (填充左边, 宽度为2) |
5 | {:x<4d} | 5xxx | 数字补x (填充右边, 宽度为4) |
10 | {:x<4d} | 10xx | 数字补x (填充右边, 宽度为4) |
1000000 | {:,} | 1,000,000 | 以逗号分隔的数字格式 |
0.25 | {:.2%} | 25.00% | 百分比格式 |
1000000000 | {:.2e} | 1.00e+09 | 指数记法 |
13 | {:>10d} | 13 | 右对齐 (默认, 宽度为10) |
13 | {:<10d} | 13 | 左对齐 (宽度为10) |
13 | {:^10d} | 13 | 中间对齐 (宽度为10) |
3)进制转换
主要就是进制了,b、d、o、x分别是二进制、十进制、八进制、十六进制。
'{:b}'.format(17)
'10001'
'{:d}'.format(17)
'17'
'{:o}'.format(17)
'21'
'{:x}'.format(17)
'11'
b: 输出整数的二进制方式
c: 输出整数对应的 Unicode 字符;
d: 输出整数的十进制方式;
o: 输出整数的八进制方式;
x: 输出整数的小写十六进制方式;
X: 输出整数的大写十六进制方式;
数字 | 格式 | 输出 | 描述 |
11 | '{:b}'.format(11) | 1011 | 进制转换 |
11 | '{:d}'.format(11) | 11 | 进制转换 |
11 | '{:o}'.format(11) | 13 | 进制转换 |
11 | '{:x}'.format(11) | b | 进制转换 |
11 | '{:#x}'.format(11) | 0xb | 进制转换 |
11 | '{:#X}'.format(11) | 0XB | 进制转换 |
4)千位分隔符
用,号还能用来做金额的千位分隔符。
'{:,}'.format(1234567890)
'1,234,567,890'
6、列表字典拆分
在format格式化时,可使用* 或者 ** 进行对list、tuple拆分。
foods = ['fish', 'beef', 'fruit']
s = 'i like eat {} and {} and {}'.format(*foods)
# i like eat fish and beef and fruit
print(s)
foods = ['fish', 'beef', 'fruit']
s = 'i like eat {2} and {0} and {1}'.format(*foods)
# i like eat fruit and fish and beef
print(s)
dict_temp = {'name': 'Lily', 'age': 18}
字典需要用 ** 进行拆分
s = 'My name is {name}, i am {age} years old'.format(**dict_temp)
print(s) # My name
kwargs = {'name': 'egon', 'age': 18}
print('我的名字是 {name}, 我的年龄是 {age}.'.format(**kwargs)) # 使用**进行解包
三、format() 底层语法
align | 含义 |
< | 数据左对齐。 |
> | 数据右对齐。 |
= | 数据右对齐,同时将符号放置在填充内容的最左侧,该选项只对数字类型有效。 |
^ | 数据居中,此选项需和 width 参数一起使用。 |
sign:指定有无符号数,此参数的值以及对应的含义如下表所示。
sign参数 | 含义 |
+ | 正数前加正号,负数前加负号。 |
- | 正数前不加正号,负数前加负号。 |
空格 | 正数前加空格,负数前加负号。 |
# | 对于二进制数、八进制数和十六进制数,使用此参数,各进制数前会分别显示 0b、0o、0x前缀;反之则不显示前缀。 |
width:指定输出数据时所占的宽度。
precision:指定保留的小数位数。
type:指定输出数据的具体类型,如下表所示。
type类型值 | 含义 |
s | 对字符串类型格式化。 |
d | 十进制整数。 |
c | 将十进制整数自动转换成对应的 Unicode 字符。 |
e 或者 E | 转换成科学计数法后,再格式化输出。 |
g 或 G | 自动在 e 和 f(或 E 和 F)中切换。 |
b | 将十进制数自动转换成二进制表示,再格式化输出。 |
o | 将十进制数自动转换成八进制表示,再格式化输出。 |
x 或者 X | 将十进制数自动转换成十六进制表示,再格式化输出。 |
f 或者 F | 转换为浮点数(默认小数点后保留 6 位),再格式化输出。 |
% | 显示百分比(默认显示小数点后 6 位)。 |
每个参数的取值范围
str ::= [[fill]align][sign][#][0][width][grouping_option][.precision][type]
fill ::= <any character>
align ::= "<" | ">" | "=" | "^"
sign ::= "+" | "-" | " "
width ::= 正整数
grouping_option ::= "_" | ","
precision ::= 正整数
type ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" |
"x" | "X" | "%"
··· END ··· 推荐阅读: 一、Number(数字) 全面掌握Python基础,这一篇就够了,建议收藏 Python基础之数字(Number)超级详解 Python随机模块22个函数详解 Python数学math模块55个函数详解 二、String(字符串) Python字符串的45个方法详解 Pandas向量化字符串操作 三、List(列表) 超级详解系列-Python列表全面解析 Python轻量级循环-列表推导式 四、Tuple(元组) Python的元组,没想象的那么简单 五、Set(集合) 全面理解Python集合,17个方法全解,看完就够了 六、Dictionary(字典) Python字典详解-超级完整版 七、内置函数 Python初学者必须吃透这69个内置函数! 八、正则模块 Python正则表达式入门到入魔 笔记 | 史上最全的正则表达式 八、系统操作 Python之shutil模块11个常用函数详解 Python之OS模块39个常用函数详解 九、进阶模块 【万字长文详解】Python库collections,让你击败99%的Pythoner 高手如何在Python中使用collections模块 ↓扫描关注本号↓