【Python】Python字符串格式化问题:%、format()与f-strings
目? ?錄
一、字符串格式化方法概覽
二、format() 常用格式化
? ? 1、通過位置
? ? 2、通過關(guān)鍵字參數(shù)
? ? 3、通過對象屬性
? ??4、通過下標(biāo)
? ??5、格式限定符
?? ??? ?1)字符的填充與對齊
? ??? ??2)數(shù)字精度與類型f處理
? ?? ???3)進(jìn)制轉(zhuǎn)換
? ??? ??4)千位分隔符
? ??6、列表字典拆分
三、format() 底層語法
一、字符串格式化方法概覽
方法 1 --------? 過去的格式化方法,代碼中還能經(jīng)常見到
在 python 2.6 之前,利用 百分號 % 表示占位符,進(jìn)行格式化
方法 2?--------? 現(xiàn)階段使用最多的方法
Python2.6 引入,它通過 {} 和 : 來代替%表示占位符,性能比 % 更強(qiáng)大,字符串的 format 方法
name='小伍哥' 'Hello,{}'.format(name) 'Hello,小伍哥'方法 3?--------?推薦使用的方法
為了進(jìn)一步簡化格式化方法,Eric Smith 在2015年提交了 PEP 498 -- Literal String Interpolation 提案。Python 3.6 引入了新的字符串格式化方式 f-strings,字符串開頭加上一個字母 f ,與其它格式化方式相比,不僅簡潔明了,可讀性更好,更不容易出錯,而且運(yùn)行效率也更高
name='小伍哥' f'Hello,{name}' 'Hello,小伍哥'?
Python中常見的格式化的方法主要有三種,本文講解目前最常用的format格式化方式,后期講進(jìn)行對比講解。
?
二、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比%先進(jìn)的地方
?
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-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.04、通過下標(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)字符的填充與對齊
填充常跟對齊一起使用
^ < >分別是居中、左對齊、右對齊,后面帶寬度
: 號后面帶填充的字符,只能是一個字符,不指定的話默認(rèn)是用空格填充
'{:>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ù)字補(bǔ)零 (填充左邊, 寬度為2) |
5 | {:x<4d} | 5xxx | 數(shù)字補(bǔ)x (填充右邊, 寬度為4) |
10 | {:x<4d} | 10xx | 數(shù)字補(bǔ)x (填充右邊, 寬度為4) |
1000000 | {:,} | 1,000,000 | 以逗號分隔的數(shù)字格式 |
0.25 | {:.2%} | 25.00% | 百分比格式 |
1000000000 | {:.2e} | 1.00e+09 | 指數(shù)記法 |
13 | {:>10d} | ????????13 | 右對齊 (默認(rèn), 寬度為10) |
13 | {:<10d} | 13 | 左對齊 (寬度為10) |
13 | {:^10d} | ????13 | 中間對齊 (寬度為10) |
?
3)進(jìn)制轉(zhuǎn)換
主要就是進(jìn)制了,b、d、o、x分別是二進(jìn)制、十進(jìn)制、八進(jìn)制、十六進(jìn)制。
'{:b}'.format(17) '10001' '{:d}'.format(17) '17' '{:o}'.format(17) '21' '{:x}'.format(17) '11'b: 輸出整數(shù)的二進(jìn)制方式
c: 輸出整數(shù)對應(yīng)的 Unicode 字符;
d: 輸出整數(shù)的十進(jìn)制方式;
o: 輸出整數(shù)的八進(jìn)制方式;
x: 輸出整數(shù)的小寫十六進(jìn)制方式;
X: 輸出整數(shù)的大寫十六進(jìn)制方式;
?
數(shù)字 | 格式 | 輸出 | 描述 |
11 | '{:b}'.format(11) | 1011 | 進(jìn)制轉(zhuǎn)換 |
11 | '{:d}'.format(11) | 11 | 進(jìn)制轉(zhuǎn)換 |
11 | '{:o}'.format(11) | 13 | 進(jìn)制轉(zhuǎn)換 |
11 | '{:x}'.format(11) | b | 進(jìn)制轉(zhuǎn)換 |
11 | '{:#x}'.format(11) | 0xb | 進(jìn)制轉(zhuǎn)換 |
11 | '{:#X}'.format(11) | 0XB | 進(jìn)制轉(zhuǎn)換 |
?
4)千位分隔符
用,號還能用來做金額的千位分隔符。
'{:,}'.format(1234567890) '1,234,567,890'?
6、列表字典拆分
在format格式化時,可使用*?或者?**?進(jìn)行對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} 字典需要用 ** 進(jìn)行拆分 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)) # 使用**進(jìn)行解包三、format() 底層語法
上面講解了常見的用戶,該函數(shù)的通用的底層其實非常復(fù)雜和通用的,有非常多的參數(shù),且都是可選參數(shù),導(dǎo)致學(xué)習(xí)起來非常困難,有興趣的可以仔細(xì)研究,format() 方法的語法格式如下:
str.format(args)
str ? ?: 用于指定字符串的顯示樣式
args: 用于指定要進(jìn)行格式轉(zhuǎn)換的項,如果有多項,之間有逗號進(jìn)行分割
學(xué)習(xí) format() 方法的難點,在于搞清楚 str 顯示樣式的書寫格式。在創(chuàng)建顯示樣式模板時,需要使用 {} 和 : 來指定占位符,其完整的語法格式為:
{ [index][ : [ [fill] align] [sign] [#] [width] [.precision] [type] ] }
格式中用 [] 括起來的參數(shù)都是可選參數(shù),即可以使用,也可以不使用。
各個參數(shù)的含義如下:
index:指定:后邊設(shè)置的格式要作用到 args 中第幾個數(shù)據(jù),數(shù)據(jù)的索引值從 0 開始。如果省略此選項,則會根據(jù) args 中數(shù)據(jù)的先后順序自動分配。
fill:指定空白處填充的字符。注意,當(dāng)填充字符為逗號(,)且作用于整數(shù)或浮點數(shù)時,該整數(shù)(或浮點數(shù))會以逗號分隔的形式輸出,例如(1000000會輸出 1,000,000)。
align:指定數(shù)據(jù)的對齊方式,具體的對齊方式如表 1 所示。
align | 含義 |
< | 數(shù)據(jù)左對齊。 |
> | 數(shù)據(jù)右對齊。 |
= | 數(shù)據(jù)右對齊,同時將符號放置在填充內(nèi)容的最左側(cè),該選項只對數(shù)字類型有效。 |
^ | 數(shù)據(jù)居中,此選項需和 width 參數(shù)一起使用。 |
sign:指定有無符號數(shù),此參數(shù)的值以及對應(yīng)的含義如下表所示。
sign參數(shù) | 含義 |
+ | 正數(shù)前加正號,負(fù)數(shù)前加負(fù)號。 |
- | 正數(shù)前不加正號,負(fù)數(shù)前加負(fù)號。 |
空格 | 正數(shù)前加空格,負(fù)數(shù)前加負(fù)號。 |
# | 對于二進(jìn)制數(shù)、八進(jìn)制數(shù)和十六進(jìn)制數(shù),使用此參數(shù),各進(jìn)制數(shù)前會分別顯示 0b、0o、0x前綴;反之則不顯示前綴。 |
width:指定輸出數(shù)據(jù)時所占的寬度。
precision:指定保留的小數(shù)位數(shù)。
type:指定輸出數(shù)據(jù)的具體類型,如下表所示。
type類型值 | 含義 |
s | 對字符串類型格式化。 |
d | 十進(jìn)制整數(shù)。 |
c | 將十進(jìn)制整數(shù)自動轉(zhuǎn)換成對應(yīng)的 Unicode 字符。 |
e 或者 E? | 轉(zhuǎn)換成科學(xué)計數(shù)法后,再格式化輸出。 |
g 或 G | 自動在 e 和 f(或 E 和 F)中切換。 |
b | 將十進(jìn)制數(shù)自動轉(zhuǎn)換成二進(jìn)制表示,再格式化輸出。 |
o | 將十進(jìn)制數(shù)自動轉(zhuǎn)換成八進(jìn)制表示,再格式化輸出。 |
x 或者 X | 將十進(jìn)制數(shù)自動轉(zhuǎn)換成十六進(jìn)制表示,再格式化輸出。 |
f 或者 F | 轉(zhuǎn)換為浮點數(shù)(默認(rèn)小數(shù)點后保留 6 位),再格式化輸出。 |
% | 顯示百分比(默認(rèn)顯示小數(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? ···往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機(jī)器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印機(jī)器學(xué)習(xí)在線手冊深度學(xué)習(xí)筆記專輯《統(tǒng)計學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專輯 AI基礎(chǔ)下載機(jī)器學(xué)習(xí)的數(shù)學(xué)基礎(chǔ)專輯溫州大學(xué)《機(jī)器學(xué)習(xí)課程》視頻 本站qq群851320808,加入微信群請掃碼:總結(jié)
以上是生活随笔為你收集整理的【Python】Python字符串格式化问题:%、format()与f-strings的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 钉钉密聊安不安全 钉钉密聊别人能看到吗
- 下一篇: Win11系统如何调节字体大小