Python中str.format()方法的具體使用
1. 術(shù)語說明
- str.format() 方法通過字符串中的花括號(hào) {} 來識(shí)別替換字段 replacement field,從而完成字符串的格式化。
- 替換字段 由字段名 field name 和轉(zhuǎn)換字段 conversion field 以及格式說明符 format specifier 組成,即一般形式為 {字段名!轉(zhuǎn)換字段:格式說明符}。
- 字段名分為簡單字段名 simple field name 和復(fù)合字段名 compound field name。
- 而轉(zhuǎn)換字段和格式說明符都是可選的。
2. 簡單字段名
2.1 簡單字段名的說明
簡單字段名有三種寫法:
- 省略不寫 {}
- 數(shù)字 {十進(jìn)制非負(fù)整數(shù)}
- 變量名 {合法的Python標(biāo)識(shí)符}
2.2 省略字段名
花括號(hào)內(nèi)省略字段名,傳遞位置參數(shù)。
- 替換字段形式: {}
- 注意:花括號(hào)個(gè)數(shù)可以少于位置參數(shù)的個(gè)數(shù),反之不然。
# 省略字段名傳遞位置參數(shù) print('我叫{},今年{}歲。'.format('小明', 18)) """ 我叫小明,今年18歲。 """ # 花括號(hào)個(gè)數(shù)可以少于位置參數(shù)的個(gè)數(shù) print('我愛吃{}和{}。'.format('香蕉', '蘋果', '大鴨梨')) """ 我愛吃香蕉和蘋果。 """ # 花括號(hào)個(gè)數(shù)多于位置參數(shù)的個(gè)數(shù)則會(huì)報(bào)錯(cuò) # print('我還吃{}和{}。'.format('西紅柿')) """ IndexError: tuple index out of range """
2.3 數(shù)字形式的簡單字段名
可以通過數(shù)字形式的簡單字段名傳遞位置參數(shù)。
- 數(shù)字必須是大于等于 0 的整數(shù)。
- 帶數(shù)字的替換字段可以重復(fù)使用。
- 數(shù)字形式的簡單字段名相當(dāng)于把 format 中的所有位置參數(shù)整體當(dāng)作一個(gè)元組,通過字段名中的數(shù)字進(jìn)行取值。
- 即 {0} 等價(jià)于 tuple[0],所以花括號(hào)內(nèi)的數(shù)字不能越界。
# 通過數(shù)字形式的簡單字段名傳遞位置參數(shù) print('身高{0},家住{1}。'.format(1.8, '銅鑼灣')) """ 身高1.8,家住銅鑼灣 """ # 數(shù)字形式的簡單字段名可以重復(fù)使用。 print('我愛{0}。\n她今年{1}。\n{0}也愛我。'.format('阿香', 17)) """ 我愛阿香。 她今年17。 阿香也愛我。 """ # 體會(huì)把所有位置參數(shù)整體當(dāng)成元組來取值 print('阿香愛吃{1}、{3}和{0}。'.format( '榴蓮', '臭豆腐', '皮蛋', '鯡魚罐頭', '螺獅粉')) """ 阿香愛吃臭豆腐、鯡魚罐頭和榴蓮。 """ # 嘗試一下越界錯(cuò)誤 # print('{1}'.format('錯(cuò)誤用法')) """ IndexError: tuple index out of range """
2.4 變量名形式的簡單字段名
使用變量名形式的簡單字段名傳遞關(guān)鍵字參數(shù)。
關(guān)鍵字參數(shù)的位置可以隨意調(diào)換。
# 使用變量名形式的簡單字段名傳遞關(guān)鍵字參數(shù) print('我大哥是{name},今年{age}歲。'.format(name='阿飛', age=20)) """ 我大哥是阿飛,今年20歲。 """ # 關(guān)鍵字參數(shù)的順序可以隨意調(diào)換 print('我大哥是{name},今年{age}歲。'.format(age=20, name='阿飛')) """ 我大哥是阿飛,今年20歲。 """
2.5 簡單字段名的混合使用
- 混合使用數(shù)字形式和變量名形式的字段名,可以同時(shí)傳遞位置參數(shù)和關(guān)鍵字參數(shù)。
- 關(guān)鍵字參數(shù)必須位于位置參數(shù)之后。
- 混合使用時(shí)可以省略數(shù)字。
- 省略字段名 {} 不能和數(shù)字形式的字段名 {非負(fù)整數(shù)} 同時(shí)使用。
# 混合使用數(shù)字形式和變量名形式的字段名 # 可以同時(shí)傳遞位置參數(shù)和關(guān)鍵字參數(shù) print('這是一個(gè)關(guān)于{0}、{1}和{girl}的故事。'.format( '小明', '阿飛', girl='阿香')) """ 這是一個(gè)關(guān)于小明、阿飛和阿香的故事。 """ # 但是關(guān)鍵字參數(shù)必須位于位置參數(shù)之后 # print('這是一個(gè)關(guān)于{0}、{1}和{girl}的故事。'.format( # '小明', girl='阿香' , '阿飛')) """ SyntaxError: positional argument follows keyword argument """ # 數(shù)字也可以省略 print('這是一個(gè)關(guān)于{}、{}和{girl}的故事。'.format( '小明', '阿飛', girl='阿香')) # 但是省略字段名不能和數(shù)字形式的字段名同時(shí)出現(xiàn) # print('這是一個(gè)關(guān)于{}、{1}和{girl}的故事。'.format( # '小明', '阿飛', girl='阿香')) """ ValueError: cannot switch from automatic field numbering to manual field specification """
2.6 使用元組和字典傳參
str.format() 方法還可以使用 *元組 和 **字典 的形式傳參,兩者可以混合使用。
位置參數(shù)、關(guān)鍵字參數(shù)、*元組 和 **字典 也可以同時(shí)使用,但是要注意,位置參數(shù)要在關(guān)鍵字參數(shù)前面,*元組 要在 **字典 前面。
# 使用元組傳參 infos = '鋼鐵俠', 66, '小辣椒' print('我是{},身價(jià){}億。'.format(*infos)) """ 我是鋼鐵俠,身家66億。 """ print('我是{2},身價(jià){1}億。'.format(*infos)) """ 我是小辣椒,身家66億。 """ # 使用字典傳參 venom = {'name': '毒液', 'weakness': '火'} print('我是{name},我怕{weakness}。'.format(**venom)) """ 我是毒液,我怕火。 """ # 同時(shí)使用元組和字典傳參 hulk = '綠巨人', '拳頭' captain = {'name': '美國隊(duì)長', 'weapon': '盾'} print('我是{}, 我怕{weapon}。'.format(*hulk, **captain)) print('我是{name}, 我怕{1}。'.format(*hulk, **captain)) """ 我是綠巨人, 我怕盾。 我是美國隊(duì)長, 我怕拳頭。 """ # 同時(shí)使用位置參數(shù)、元組、關(guān)鍵字參數(shù)、字典傳參 # 注意: # 位置參數(shù)要在關(guān)鍵字參數(shù)前面 # *元組要在**字典前面 tup = '鷹眼', dic = {'weapon': '箭'} text = '我是{1},我怕{weakness}。我是{0},我用{weapon}。' text = text.format( *tup, '黑寡婦', weakness='男人', **dic) print(text) """ 我是黑寡婦,我怕男人。我是鷹眼,我用箭。 """
3. 復(fù)合字段名
3.1 復(fù)合字段名的說明
同時(shí)使用了數(shù)字和變量名兩種形式的字段名就是復(fù)合字段名。
復(fù)合字段名支持兩種操作符:
- [] 方括號(hào)
- . 點(diǎn)號(hào)
3.2 . 點(diǎn)號(hào)的使用
傳遞位置參數(shù)
- 替換字段形式:{數(shù)字.屬性名}
- 只有一個(gè)替換字段的時(shí)候可以省略數(shù)字
# 復(fù)合字段名中使用點(diǎn)號(hào)傳遞對(duì)象屬性 class Person: def __init__(self, name, addr): self.name = name self.addr = addr p = Person('辣妹子', '重慶') # 點(diǎn)號(hào)用法:傳遞位置參數(shù) print('我是{0.name},家在{0.addr}。'.format(p)) """ 我是辣妹子,家在重慶。 """ # 當(dāng)只有一個(gè)替換字段的時(shí)候可以省略數(shù)字 print('{.name}辣!'.format(p)) """ 辣妹子辣! """ # 試試傳遞文件對(duì)象的屬性 f = open('out.txt', 'w') print('文件名為:{.name}'.format(f)) f.close() """ 文件名為:out.txt """
傳遞關(guān)鍵字參數(shù)
替換字段形式:{關(guān)鍵字參數(shù)名.屬性名}
# 點(diǎn)號(hào)用法:傳遞關(guān)鍵字參數(shù) print('我是{girl.name},家在{girl.addr}。'.format(girl=p)) # 和上一句等價(jià) print('我是{p.name},家在{p.addr}。'.format(p=p)) """ 我是辣妹子,家在重慶。 我是辣妹子,家在重慶。 """
3.3 [] 方括號(hào)的使用
傳遞位置參數(shù)
- 用列表傳遞位置參數(shù)
- 用元組傳遞位置參數(shù)
- 用字典傳遞位置參數(shù)
# 方括號(hào)用法:用列表傳遞位置參數(shù) infos = ['阿星', 9527] food = ['霸王花', '爆米花'] print('我叫{0[0]},警號(hào){0[1]},愛吃{1[0]}。'.format( infos, food)) """ 我叫阿星,警號(hào)9527,愛吃霸王花。 """ # 方括號(hào)用法:用元組傳遞位置參數(shù) food = ('僵尸', '腦子') print('我叫{0[0]},年齡{1},愛吃{0[1]}。'.format( food, 66)) """ 我叫僵尸,年齡66,愛吃腦子。 """ # 方括號(hào)用法:用字典傳遞位置參數(shù) dic = dict(name='阿星', pid=9527) print('我是{[name]}!'.format( dic)) # 多個(gè)替換字段,不能省略數(shù)字 print('我是{0[name]},警號(hào){0[pid]}。'.format( dic)) """ 我是阿星! 我是阿星,警號(hào)9527。 """
傳遞關(guān)鍵字參數(shù)
- 用列表傳遞關(guān)鍵字參數(shù)
- 用元組傳遞關(guān)鍵字參數(shù)
- 用字典傳遞關(guān)鍵字參數(shù)
# 方括號(hào)用法:傳遞關(guān)鍵字參數(shù) names = ['皮卡丘'] dic = {'name': '妙蛙花'} skills = ('十萬伏特', '飛葉快刀') text = '我是{names[0]},我會(huì){skills[0]}。我是{dic[name]},我會(huì){skills[1]}。' text = text.format(names=names, skills=skills, dic=dic) print(text) """ 我是皮卡丘,我會(huì)十萬伏特。我是妙蛙花,我會(huì)飛葉快刀。 """
4. 轉(zhuǎn)換字段
轉(zhuǎn)換字段 conversion field 的取值有三種,前面要加 !:
- s:傳遞參數(shù)之前先對(duì)參數(shù)調(diào)用 str()
- r:傳遞參數(shù)之前先對(duì)參數(shù)調(diào)用 repr()
- a:傳遞參數(shù)之前先對(duì)參數(shù)調(diào)用 ascii()
ascii() 函數(shù)類似 repr() 函數(shù),返回一個(gè)可以表示對(duì)象的字符串。
但是對(duì)于非 ASCII 字符,使用 \x,\u 或者 \U 轉(zhuǎn)義。
# 轉(zhuǎn)換字段 print('I am {!s}!'.format('Bruce Lee 李小龍')) print('I am {!r}!'.format('Bruce Lee 李小龍')) print('I am {!a}!'.format('Bruce Lee 李小龍')) """ I am Bruce Lee 李小龍! I am 'Bruce Lee 李小龍'! I am 'Bruce Lee \u674e\u5c0f\u9f99'! """
5. 格式說明符
在替換字段中,格式說明符前面有一個(gè)冒號(hào) : :
{字段名!轉(zhuǎn)換字段:格式說明符}
其中格式說明符本身可以是一個(gè)字段名,比如:
print('{0:{1}}'.format(3.14159, '.4f')) """ 3.1416 """
5.1 標(biāo)準(zhǔn)格式說明符的格式
如果不通過重寫 __format__ 方法來進(jìn)行自定義的話,標(biāo)準(zhǔn)格式說明符的形式如下。其中方括號(hào)是可選的。
[[fill]align][sign][#][0][width][grouping_option][.precision][type]
中文形式可以寫作:
[[填充]對(duì)齊方式][正負(fù)號(hào)][#][0][寬度][分組選項(xiàng)][.精度][類型碼]
5.2 填充與對(duì)齊方式
填充:
- 只能是一個(gè)字符
- 不指定默認(rèn)用空格填充
- 如果指定填充字符,則必須要同時(shí)指定對(duì)齊方式
對(duì)齊方式的取值:
- <:左對(duì)齊
- >:右對(duì)齊
- ^:居中
- =:在正負(fù)號(hào)(如果有的話)和數(shù)字之間填充,該對(duì)齊選項(xiàng)僅對(duì)數(shù)字類型有效。它可以輸出類似 +0000120 這樣的字符串。
注意:
如果不給定最小寬度 width,對(duì)齊方式毫無意義。
5.3 正負(fù)號(hào)
- 正負(fù)號(hào)選項(xiàng)僅對(duì)數(shù)字類型生效
- 取值有三種:
- + 正數(shù)前面添加正號(hào),負(fù)數(shù)前面添加負(fù)號(hào)
- - 僅在負(fù)數(shù)前面添加負(fù)號(hào)(默認(rèn)行為)
- 空格:正數(shù)前面需要添加一個(gè)空格,以便與負(fù)數(shù)對(duì)齊
# 正負(fù)號(hào) print('{:哈=+8.2f}'.format(3.14159)) print('{:哈=+8.2f}'.format(-3.14159)) print('{:哈=+8.2f}'.format(0)) print('{:哈=+8.2f}'.format(-0)) """ +哈哈哈3.14 -哈哈哈3.14 +哈哈哈0.00 +哈哈哈0.00 """
5.4 # 號(hào)
# 號(hào):
- 給u二進(jìn)制數(shù)加上 0b 前綴
- 給八進(jìn)制數(shù)加上 0o 前綴
- 給十六進(jìn)制數(shù)加上 0x 前綴
5.5 最小寬度
最小寬度 width:
- 如果不指定,最小字段寬度由內(nèi)容決定,與內(nèi)容相等
- 如果最小寬度前面有一個(gè)前導(dǎo) 0,意味著用 0 填充
- 這等價(jià)于指定了 0= 的填充和對(duì)齊方式
5.6 分組選項(xiàng)
分組選項(xiàng) grouping_option 的取值有兩種:
逗號(hào) ,:使用逗號(hào)對(duì)數(shù)字以千為單位進(jìn)行分隔。n 類型的數(shù)字可以使用本地化的分隔符。
n類型在本機(jī)無法使用分組選項(xiàng) ,
原因可能是中文沒有數(shù)字分隔符
# n 類型使用本地化的分組選項(xiàng) , # 此項(xiàng)報(bào)錯(cuò),我懷疑是因?yàn)橹形臎]有數(shù)字的分隔符 # print('數(shù)字:{0:,n}'.format(6666)) """ ValueError: Cannot specify ',' with 'n'. """ # 使用 d 類型確實(shí)是可以的 print('數(shù)字:{0:,d}'.format(6666)) """ 數(shù)字:6,666 """
下劃線 _:使用下劃線對(duì)浮點(diǎn)數(shù)和 d 類型的整數(shù)以千為單位進(jìn)行分隔。對(duì)于 b、o、x 和 X 類型,每四位插入一個(gè)下劃線,其他類型都會(huì)報(bào)錯(cuò)。
# 分組選項(xiàng) _ 作用于 b 類型 print('數(shù)字:{0:_b}'.format(0b100111011)) """ 數(shù)字:1_0011_1011 """ # 分組選項(xiàng) _ 作用于 o 類型 print('數(shù)字:{0:_o}'.format(0o426754316)) """ 數(shù)字:4_2675_4316 """ # 分組選項(xiàng) _ 作用于 x 類型 print('數(shù)字:{0:_x}'.format(0x2a846e98d)) """ 數(shù)字:2_a846_e98d """ # 分組選項(xiàng) _ 作用于 X 類型 print('數(shù)字:{0:_X}'.format(0X2a846e98d)) """ 數(shù)字:2_A846_E98D """ # 分組選項(xiàng) _ 作用于其他類型(比如 n 類型) # print('字符串:{0:_n}'.format(1234567)) """ ValueError: Cannot specify ',' with 'n'. """
5.7 精度
精度:
- 精度指定了小數(shù)點(diǎn)后面要展示多少位小數(shù)
- 對(duì)于非數(shù)字類型,精度指定了最大字段寬度
- 整數(shù)類型不能指定精度
# 對(duì)于非數(shù)字類型,精度指定最大字段寬度 print('{0:.3}'.format('哇哈哈哈哈哈')) """ 哇哈哈 """ # 整數(shù)類型不能指定精度 print('{:.3d}'.format(666)) """ ValueError: Precision not allowed in integer format specifier """
5.8 類型碼
類型碼可以分為三大類:
- 字符串類型
- 整數(shù)類型
- 浮點(diǎn)數(shù)類型
5.8.1 字符串類型
s 字符串類型。這是字符串的默認(rèn)類型,可以省略。
None 不指定類型。同 s 類型。
# s 類型 print('{0:s}'.format('略略略')) # s 類型可以省略 print('{0:}'.format('略略略')) """ 略略略 略略略 """
5.8.2 整數(shù)類型
b 二進(jìn)制。
# b 類型:二進(jìn)制 print('{0:b}'.format(3)) """ 11 """
c 字符。把整數(shù)轉(zhuǎn)換為相應(yīng)的 Unicode 字符,然后再打印。
# c 類型:把整數(shù)轉(zhuǎn)換成 unicode 字符 print('{:c}'.format(97)) """ a """
d 十進(jìn)制整數(shù)。
# d 類型:十進(jìn)制整數(shù) print('{:d}'.format(666)) """ 666 """
o 八進(jìn)制數(shù)。
# o 類型:八進(jìn)制數(shù) print('{:o}'.format(10)) """ 12 """
x 十六進(jìn)制數(shù),a 到 f 小寫。
# x 類型:十六進(jìn)制數(shù),a到f小寫 print('{:x}'.format(15)) """ f """
X 十六進(jìn)制數(shù),A 到 F 大寫。
# X 類型:十六進(jìn)制數(shù),A到F大寫 print('{:X}'.format(15)) """ F """
n 數(shù)字 number 類型,與 d 相同,只不過它會(huì)使用本地化的數(shù)字分隔符。
經(jīng)試驗(yàn),在本機(jī)為 n 類型指定任何分組選項(xiàng)(, 和 _)都會(huì)報(bào)錯(cuò)。ValueError: Cannot specify ',' with 'n'.
# n 類型:與d相同,會(huì)插入本地化的分隔符 print('{:n}'.format(66666)) # 經(jīng)試驗(yàn),本機(jī)無法為 n 指定任何分組選項(xiàng)(,_) # print('{:,n}'.format(66666)) """ ValueError: Cannot specify ',' with 'n'. """ # print('{:_n}'.format(66666)) """ ValueError: Cannot specify ',' with 'n'. """
None 不指定類型,與 d 相同。
5.8.3 浮點(diǎn)數(shù)類型
e 科學(xué)記數(shù)法,用 e 來表示指數(shù)。默認(rèn)精度為 6 位
# e 類型:科學(xué)記數(shù)法 # 默認(rèn)精度為 6 位 print('{:e}'.format(1234567.1234567)) """ 1.234567e+06 """
E 與 e 相同,但是使用大寫的 E 表示指數(shù)。
# E 類型:與 e 相同,用大寫 E 表示指數(shù) # 默認(rèn)精度為 6 位 print('{:E}'.format(1234567.1234567)) # 修改精度為 10 位 print('{:.10E}'.format(1234567.1234567)) """ 1.234567E+06 1.2345671235E+06 """
f 定點(diǎn)記法,默認(rèn)精度為 6。
# f 類型 # 默認(rèn)精度為 6 位 print('{:f}'.format(1234567.1234567)) """ 1234567.123457 """
F 定點(diǎn)記法,同 f,但是會(huì)把 nan 轉(zhuǎn)換成 NAN,把 inf 轉(zhuǎn)換成 INF
# F 類型 nan = float('nan') inf = float('inf') print('{:F}\n{:F}'.format(nan, inf)) """ NAN INF """
g 通用 general 格式。自動(dòng)轉(zhuǎn)換到 e 或者 f 格式,具體的轉(zhuǎn)換規(guī)則在此省略。正無窮、負(fù)無窮、正零、負(fù)零和非數(shù)字分別顯示為 inf,-inf,0,-0,nan。指定精度為 0 時(shí)等價(jià)于精度為 1。默認(rèn)精度為 6 位。
# g 類型 print('{:g}'.format(1234567.1234567)) print('{:g}'.format(1234.1234)) """ 1.23457e+06 1234.12 """
G 通用 general 格式。自動(dòng)轉(zhuǎn)換到 E 或者 F 格式,轉(zhuǎn)換規(guī)則同上,相應(yīng)表示方式換成大寫。
# g 類型 print('{:g}'.format(1234567.1234567)) print('{:g}'.format(1234.1234)) """ 1.23457e+06 1234.12 """
n 數(shù)字 number 類型。跟 g 一樣,只不過用本地化的分隔符來分隔數(shù)字。
# n 類型 print('{:n}'.format(1234567.1234567)) print('{:n}'.format(1234.1234)) """ 1.23457E+06 1234.12 """ # 經(jīng)試驗(yàn),本機(jī)指定分組選項(xiàng)會(huì)報(bào)錯(cuò) # print('{:,n}'.format(1234.1234)) """ ValueError: Cannot specify ',' with 'n'. """ # print('{:_n}'.format(1234.1234)) """ ValueError: Cannot specify ',' with 'n'. """
% 百分號(hào)類型。會(huì)將數(shù)字乘以 100,然后以 f 定點(diǎn) fixed-point 格式顯示,最后加上一個(gè)百分號(hào) %。
# % 類型 print('{:%}'.format(1)) """ 100.000000% """
None 不指定類型。輸出效果類似調(diào)用 str() 函數(shù)。
6. 補(bǔ)充說明
輸出花括號(hào)需要用花括號(hào)本身來轉(zhuǎn)義
# 打印花括號(hào)需要使用花括號(hào)轉(zhuǎn)義 print('{{{}}}'.format('張無忌')) """ {張無忌} """
對(duì)象可以自定義格式說明符來替換標(biāo)準(zhǔn)格式說明符,比如 datetime 類。
from datetime import datetime print("Today is: {0:%a %b %d %H:%M:%S %Y}".format(datetime.now())) """ 今天是:Thu Nov 15 13:05:09 2018 """
參考資料
Format String Syntax
PEP 3101 – Advanced String Formatting
Python format 格式化函數(shù)
Python之format詳解
Python高級(jí)編程
到此這篇關(guān)于Python中str.format()方法的具體使用的文章就介紹到這了,更多相關(guān)Python str.format()內(nèi)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。