【Python】Python字符串格式化問題:%、format()與f-strings
目 錄
一、字符串格式化方法概覽
二、format() 常用格式化
1、通過位置
2、通過關(guān)鍵字參數(shù)
3、通過對象屬性
4、通過下標(biāo)
5、格式限定符
1)字符的填充與對齊
2)數(shù)字精度與類型f處理
3)進制轉(zhuǎn)換
4)千位分隔符
6、列表字典拆分
三、format() 底層語法
一、字符串格式化方法概覽
方法 1 -------- 過去的格式化方法,代碼中還能經(jīng)常見到
在 python 2.6 之前,利用 百分號 % 表示占位符,進行格式化
name='小伍哥''Hello,%s'%nameHello,小伍哥
方法 2 -------- 現(xiàn)階段使用最多的方法
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函數(shù)可以接受不限個參數(shù),位置可以不按順序,可以不用或者用多次,不過2.6不能為空{(diào)},2.7才可以。foramt會把參數(shù)按位置順序來填充到字符串中,第一個參數(shù)是0,然后1……
也可以不輸入數(shù)字,這樣也會按順序來填充同一個參數(shù)可以填充多次,這個是format比%先進的地方
2、通過關(guān)鍵字參數(shù)
'{name},{age}'.format(age=18,name='小伍哥')'小伍哥,18'
3、通過對象屬性
class Person:def __init__(self,name,age):self.name,self.age = name,agedef __str__(self):return 'This guy is {self.name},is {self.age} old'.format(self=self)print(Person('小伍哥',18))This guy is 小伍哥,is 18 oldc = 3-5jprint(('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、通過下標(biāo)
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可以通過“打散”成普通參數(shù)給函數(shù),而dict可以打散成關(guān)鍵字參數(shù)給函數(shù)(通過和*)。所以可以輕松的傳個list/tuple/dict給format函數(shù)。非常靈活。
5、格式限定符
它有著豐富的的“格式限定符”(語法是{} 中帶: 號)
1)字符的填充與對齊
填充常跟對齊一起使用
^ < >分別是居中、左對齊、右對齊,后面帶寬度
: 號后面帶填充的字符,只能是一個字符,不指定的話默認是用空格填充
'{:>8}'.format('18')' 18''{:0>8}'.format('18')'00000018''{:*>8}'.format('18')'******18'
注:字符串模塊內(nèi)置函數(shù)中也存在對齊的函數(shù) str.center(),str.ljust(),str.rjust(),str.zfill()
'shuai'.center(10,'*')#居中對齊'**shuai***''shuai'.ljust(10,'*')#左對齊'shuai*****''18'.zfill(10)#右對齊'0000000018'
2)數(shù)字精度與類型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類型。
數(shù)字 | 格式 | 輸出 | 描述 |
3.1415926 | {:.2f} | 3.14 | 保留小數(shù)點后兩位 |
3.1415926 | {:+.2f} | +3.14 | 帶符號保留小數(shù)點后兩位 |
-1 | {:+.2f} | -1.00 | 帶符號保留小數(shù)點后兩位 |
2.71828 | {:.0f} | 3 | 不帶小數(shù) |
5 | {:0>2d} | 05 | 數(shù)字補零 (填充左邊, 寬度為2) |
5 | {:x<4d} | 5xxx | 數(shù)字補x (填充右邊, 寬度為4) |
10 | {:x<4d} | 10xx | 數(shù)字補x (填充右邊, 寬度為4) |
1000000 | {:,} | 1,000,000 | 以逗號分隔的數(shù)字格式 |
0.25 | {:.2%} | 25.00% | 百分比格式 |
1000000000 | {:.2e} | 1.00e+09 | 指數(shù)記法 |
13 | {:>10d} | 13 | 右對齊 (默認, 寬度為10) |
13 | {:<10d} | 13 | 左對齊 (寬度為10) |
13 | {:^10d} | 13 | 中間對齊 (寬度為10) |
3)進制轉(zhuǎn)換
主要就是進制了,b、d、o、x分別是二進制、十進制、八進制、十六進制。
'{:b}'.format(17)'10001''{:d}'.format(17)'17''{:o}'.format(17)'21''{:x}'.format(17)'11'
b: 輸出整數(shù)的二進制方式
c: 輸出整數(shù)對應(yīng)的 Unicode 字符;
d: 輸出整數(shù)的十進制方式;
o: 輸出整數(shù)的八進制方式;
x: 輸出整數(shù)的小寫十六進制方式;
X: 輸出整數(shù)的大寫十六進制方式;
數(shù)字 | 格式 | 輸出 | 描述 |
11 | '{:b}'.format(11) | 1011 | 進制轉(zhuǎn)換 |
11 | '{:d}'.format(11) | 11 | 進制轉(zhuǎn)換 |
11 | '{:o}'.format(11) | 13 | 進制轉(zhuǎn)換 |
11 | '{:x}'.format(11) | b | 進制轉(zhuǎn)換 |
11 | '{:#x}'.format(11) | 0xb | 進制轉(zhuǎn)換 |
11 | '{:#X}'.format(11) | 0XB | 進制轉(zhuǎn)換 |
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 fruitprint(s)foods = ['fish', 'beef', 'fruit']s = 'i like eat {2} and {0} and {1}'.format(*foods)# i like eat fruit and fish and beefprint(s)dict_temp = {'name': 'Lily', 'age': 18}
字典需要用 ** 進行拆分
s = 'My name is {name}, i am {age} years old'.format(**dict_temp)print(s) # My namekwargs = {'name': 'egon', 'age': 18}print('我的名字是 {name}, 我的年齡是 {age}.'.format(**kwargs)) # 使用**進行解包
三、format() 底層語法
align | 含義 |
< | 數(shù)據(jù)左對齊。 |
> | 數(shù)據(jù)右對齊。 |
= | 數(shù)據(jù)右對齊,同時將符號放置在填充內(nèi)容的最左側(cè),該選項只對數(shù)字類型有效。 |
^ | 數(shù)據(jù)居中,此選項需和 width 參數(shù)一起使用。 |
sign:指定有無符號數(shù),此參數(shù)的值以及對應(yīng)的含義如下表所示。
sign參數(shù) | 含義 |
+ | 正數(shù)前加正號,負數(shù)前加負號。 |
- | 正數(shù)前不加正號,負數(shù)前加負號。 |
空格 | 正數(shù)前加空格,負數(shù)前加負號。 |
# | 對于二進制數(shù)、八進制數(shù)和十六進制數(shù),使用此參數(shù),各進制數(shù)前會分別顯示 0b、0o、0x前綴;反之則不顯示前綴。 |
width:指定輸出數(shù)據(jù)時所占的寬度。
precision:指定保留的小數(shù)位數(shù)。
type:指定輸出數(shù)據(jù)的具體類型,如下表所示。
type類型值 | 含義 |
s | 對字符串類型格式化。 |
d | 十進制整數(shù)。 |
c | 將十進制整數(shù)自動轉(zhuǎn)換成對應(yīng)的 Unicode 字符。 |
e 或者 E | 轉(zhuǎn)換成科學(xué)計數(shù)法后,再格式化輸出。 |
g 或 G | 自動在 e 和 f(或 E 和 F)中切換。 |
b | 將十進制數(shù)自動轉(zhuǎn)換成二進制表示,再格式化輸出。 |
o | 將十進制數(shù)自動轉(zhuǎn)換成八進制表示,再格式化輸出。 |
x 或者 X | 將十進制數(shù)自動轉(zhuǎn)換成十六進制表示,再格式化輸出。 |
f 或者 F | 轉(zhuǎn)換為浮點數(shù)(默認小數(shù)點后保留 6 位),再格式化輸出。 |
% | 顯示百分比(默認顯示小數(shù)點后 6 位)。 |
每個參數(shù)的取值范圍
str ::= [[fill]align][sign][#][0][width][grouping_option][.precision][type]fill ::= <any character>align ::= "<" | ">" | "=" | "^"sign ::= "+" | "-" | " "width ::= 正整數(shù)grouping_option ::= "_" | ","precision ::= 正整數(shù)type ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" |"x" | "X" | "%"
··· END ··· 往期精彩回顧 本站qq群851320808,加入微信群請掃碼:
