【Python】Python字符串格式化问题:%、format()与f-strings
目? ?錄
一、字符串格式化方法概覽
二、format() 常用格式化
? ? 1、通過位置
? ? 2、通過關鍵字參數
? ? 3、通過對象屬性
? ??4、通過下標
? ??5、格式限定符
?? ??? ?1)字符的填充與對齊
? ??? ??2)數字精度與類型f處理
? ?? ???3)進制轉換
? ??? ??4)千位分隔符
? ??6、列表字典拆分
三、format() 底層語法
一、字符串格式化方法概覽
方法 1 --------? 過去的格式化方法,代碼中還能經常見到
在 python 2.6 之前,利用 百分號 % 表示占位符,進行格式化
方法 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,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、通過下標
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() 底層語法
上面講解了常見的用戶,該函數的通用的底層其實非常復雜和通用的,有非常多的參數,且都是可選參數,導致學習起來非常困難,有興趣的可以仔細研究,format() 方法的語法格式如下:
str.format(args)
str ? ?: 用于指定字符串的顯示樣式
args: 用于指定要進行格式轉換的項,如果有多項,之間有逗號進行分割
學習 format() 方法的難點,在于搞清楚 str 顯示樣式的書寫格式。在創建顯示樣式模板時,需要使用 {} 和 : 來指定占位符,其完整的語法格式為:
{ [index][ : [ [fill] align] [sign] [#] [width] [.precision] [type] ] }
格式中用 [] 括起來的參數都是可選參數,即可以使用,也可以不使用。
各個參數的含義如下:
index:指定:后邊設置的格式要作用到 args 中第幾個數據,數據的索引值從 0 開始。如果省略此選項,則會根據 args 中數據的先后順序自動分配。
fill:指定空白處填充的字符。注意,當填充字符為逗號(,)且作用于整數或浮點數時,該整數(或浮點數)會以逗號分隔的形式輸出,例如(1000000會輸出 1,000,000)。
align:指定數據的對齊方式,具體的對齊方式如表 1 所示。
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? ···往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯溫州大學《機器學習課程》視頻 本站qq群851320808,加入微信群請掃碼:總結
以上是生活随笔為你收集整理的【Python】Python字符串格式化问题:%、format()与f-strings的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 钉钉密聊安不安全 钉钉密聊别人能看到吗
- 下一篇: websocket python爬虫_p