Python中str.format()詳解
1. str.format 的引入
在 Python 中,我們可以使用 + 來(lái)連接字符串,在簡(jiǎn)單情況下這種方式能夠很好的工作。但是當(dāng)我們需要進(jìn)行復(fù)雜的字符串連接時(shí),如果依然使用 + 來(lái)完成,不僅會(huì)使代碼變得晦澀難懂,還會(huì)讓代碼變得難以維護(hù),此時(shí)這種方式就顯得力不從心了。
例如,我們想打印這樣一條記錄:
User:John has completed Action:payment at Time:13:30:00
如果使用加號(hào)實(shí)現(xiàn),會(huì)是下面這種形式:
print "User:" + user_name + " has completed Action:" + \ action_name + " at Time:" + current_time
如果以后回過(guò)頭來(lái)閱讀這段代碼,我們很難直觀看出它的輸出格式,且修改起來(lái)也相對(duì)麻煩。
我們可以換用 % 來(lái)實(shí)現(xiàn):
print "User:%s has completed Action:%s at Time:%s" % \ (user_name, action_name, current_time)
這回代碼變得清晰簡(jiǎn)潔多了。
不過(guò),Python 為我們提供了另一種簡(jiǎn)潔優(yōu)雅的實(shí)現(xiàn)方式,也是官方更加推薦的方式:使用 str.format() 來(lái)實(shí)現(xiàn)字符串的格式化:
print "User:{} has completed Action:{} at Time:{}".format( user_name, action_name, current_time)
str.format 既能夠用于簡(jiǎn)單的場(chǎng)景,也能夠勝任復(fù)雜的字符串替換,而無(wú)需繁瑣的字符串連接操作。Python 的內(nèi)置類型 str 和 unicode 均支持使用 str.format() 來(lái)格式化字符串。
我們接下來(lái)就詳細(xì)地討論 str.format() 的具體用法。
2. str.format 基本語(yǔ)法
格式化字符串使用花括號(hào) {} 來(lái)包圍替換字段,也就是待替換的字符串。而未被花括號(hào)包圍的字符會(huì)原封不動(dòng)地出現(xiàn)在結(jié)果中。
2.1. 使用位置索引
以下兩種寫法是等價(jià)的:
"Hello, {} and {}!".format("John", "Mary")
"Hello, {0} and {1}!".format("John", "Mary")
花括號(hào)內(nèi)部可以寫上目標(biāo)字符串的索引,也可以省略。如果省略,則按 format 括號(hào)里的目標(biāo)字符串順序依次替換。
2.2. 使用關(guān)鍵字索引
除了通過(guò)位置來(lái)指定目標(biāo)字符串,我們還可以通過(guò)關(guān)鍵字來(lái)指定它。
例如:
"Hello, {boy} and {girl}!".format(boy="John", girl="Mary")
使用關(guān)鍵字索引的好處是,我們無(wú)需關(guān)心參數(shù)的位置,且字符串的最終結(jié)果能夠一目了然。在以后的代碼維護(hù)中,我們能夠快速地修改對(duì)應(yīng)的參數(shù),而不用對(duì)照字符串挨個(gè)去尋找相應(yīng)的參數(shù)。
注意:如果字符串本身含有花括號(hào),則需要將其重復(fù)兩次來(lái)轉(zhuǎn)義。例如,字符串本身含有 {,為了讓 Python 知道這是一個(gè)普通字符,而不是用于包圍替換字段的花括號(hào),我們只需將它改寫成 {{ 即可。
3. str.format 高級(jí)語(yǔ)法
str.format 非常強(qiáng)大,足以完成日常工作中遇到的格式化輸出。熟練掌握該方法,能夠?yàn)橐院蟮淖址幚泶蚝没A(chǔ),還能節(jié)省不少時(shí)間。
3.1. 訪問(wèn)參數(shù)的屬性或元素
在使用 str.format 來(lái)格式化字符串時(shí),我們通常將目標(biāo)字符串作為參數(shù)傳遞給 format 方法。實(shí)際上,我們還可以在格式化字符串中訪問(wèn)參數(shù)的某個(gè)屬性或某個(gè)元素:
"My car is {0.color}.".format(black_car)
"The first student is {student[0]}.".format(student=stu_list)
"John is {d[john]} years old.".format(d=age_dict)
3.2. 參數(shù)輸出轉(zhuǎn)換
參數(shù)的字符串輸出,默認(rèn)是由其自身的 __format__ 方法來(lái)實(shí)現(xiàn)的。也就是說(shuō),Python 使用參數(shù)的 __format__ 輸出來(lái)取代替換字段。如果我們想調(diào)用 str() 或 repr() 來(lái)轉(zhuǎn)換參數(shù),可以通過(guò)添加 轉(zhuǎn)換標(biāo)志 來(lái)實(shí)現(xiàn):
# call str() on argument "It's a {0!s}." #call repr() on argument "We can get info from {name!r}."
4. str.format 一般形式
格式化字符串的一般形式如下:
"... {field_name!conversion:format_spec} ..."
從上面的代碼可以看到,格式化字符串可分為 field_name、conversion、format_spec 三部分,分別對(duì)應(yīng)替換字段名稱(索引)、轉(zhuǎn)換標(biāo)志、格式描述。其中,字段名稱是必選的,而后兩者是可選的。轉(zhuǎn)換標(biāo)志緊跟在英文感嘆號(hào)后面,而格式描述緊跟在英文冒號(hào)后面。
前面已經(jīng)提到過(guò),字段名稱既可是位置索引,也可是關(guān)鍵字索引。字段名稱后面可以通過(guò)點(diǎn)來(lái)訪問(wèn)屬性,或通過(guò)方括號(hào)來(lái)訪問(wèn)元素。
在這里,我們重點(diǎn)看一下格式描述(format_spec)這一項(xiàng)。
格式描述中含有6個(gè)選項(xiàng),分別是 fill、align、sign、width、precision、type。 它們的位置關(guān)系如下:
[[fill]align][sign][#][0][width][,][.precision][type]
fill
可以是任意字符,默認(rèn)為空格。
align
僅當(dāng)指定最小寬度時(shí)有效。
< 左對(duì)齊(默認(rèn)選項(xiàng))
> 右對(duì)齊
= 僅對(duì)數(shù)字有效;將填充字符放到符號(hào)與數(shù)字間,例如 +0001234
^ 居中對(duì)齊
sign
僅對(duì)數(shù)字有效
+ 所有數(shù)字均帶有符號(hào)
- 僅負(fù)數(shù)帶有符號(hào)(默認(rèn)選項(xiàng))
即空格;正數(shù)前面帶空格,負(fù)數(shù)前面帶符號(hào)
'#'
只對(duì)整數(shù)有效
自動(dòng)在二進(jìn)制、八進(jìn)制、十六進(jìn)制數(shù)值前添加對(duì)應(yīng)的 0b、0o、 0x。
','
自動(dòng)在每三個(gè)數(shù)字之間添加 , 分隔符。
width
十進(jìn)制數(shù)字,定義最小寬度。如果未指定,則由內(nèi)容的寬度來(lái)決定。
如果沒(méi)有指定對(duì)齊方式(align),那么可以在 width 前面添加一個(gè)0來(lái)實(shí)現(xiàn)自動(dòng)填充0,等價(jià)于 fill 設(shè)為 0 并且 align 設(shè)為 =。
precision
用于確定浮點(diǎn)數(shù)的精度,或字符串的最大長(zhǎng)度。不可用于整型數(shù)值。
type
確定參數(shù)類型,默認(rèn)為 s ,即字符串。
整數(shù)輸出類型:
b:以二進(jìn)制格式輸出
c:將整數(shù)轉(zhuǎn)換成對(duì)應(yīng)的 unicode 字符
d:以十進(jìn)制輸出(默認(rèn)選項(xiàng))
o:以八進(jìn)制輸出
x:以十六進(jìn)制小寫輸出
X:以十六進(jìn)制大寫輸出
n:與 d 相同,但使用當(dāng)前環(huán)境的分隔符來(lái)分隔每3位數(shù)字
十進(jìn)制浮點(diǎn)數(shù)輸出類型:
e:指數(shù)標(biāo)記;使用科學(xué)計(jì)數(shù)法輸出,用e來(lái)表示指數(shù)部分,默認(rèn) precision 為6
E:與 e 相同,但使用大寫 E 來(lái)表示指數(shù)部分
f:以定點(diǎn)形式輸出數(shù)值,默認(rèn) precision 為6
F:與 f 相同
g:通用格式;對(duì)于給定的 precision p >= 1,取數(shù)值的p位有效數(shù)字,并以定點(diǎn)或科學(xué)計(jì)數(shù)法輸出(默認(rèn)選項(xiàng))
G:通用格式;與 g 相同,當(dāng)數(shù)值過(guò)大時(shí)使用 E 來(lái)表示指數(shù)部分
n:與 g 相同,但使用當(dāng)前環(huán)境的分隔符來(lái)分隔每3位數(shù)字
%:百分比標(biāo)記;使用百分比的形式輸出數(shù)值,同時(shí)設(shè)定 f 標(biāo)記
相關(guān)文章
python實(shí)現(xiàn)文件快照加密保護(hù)的方法
這篇文章主要介紹了python實(shí)現(xiàn)文件快照加密保護(hù)的方法,涉及Python文件加密的技巧,可有效防止文件被篡改,需要的朋友可以參考下2015-06-06python使用xmlrpclib模塊實(shí)現(xiàn)對(duì)百度google的ping功能
這篇文章主要介紹了python使用xmlrpclib模塊實(shí)現(xiàn)對(duì)百度google的ping功能,實(shí)例分析了xmlrpclib模塊的相關(guān)技巧,需要的朋友可以參考下2015-06-06Python內(nèi)置的HTTP協(xié)議服務(wù)器SimpleHTTPServer使用指南
這篇文章主要介紹了Python內(nèi)置的HTTP協(xié)議服務(wù)器SimpleHTTPServer使用指南,SimpleHTTPServer本身的功能十分簡(jiǎn)單,文中介紹了需要的朋友可以參考下2016-03-03pytorch geometric的GNN、GCN的節(jié)點(diǎn)分類方式
這篇文章主要介紹了pytorch geometric的GNN、GCN的節(jié)點(diǎn)分類方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12對(duì)Python實(shí)現(xiàn)累加函數(shù)的方法詳解
今天小編就為大家分享一篇對(duì)Python實(shí)現(xiàn)累加函數(shù)的方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01python+mysql實(shí)現(xiàn)教務(wù)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python+mysql實(shí)現(xiàn)教務(wù)管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02python自動(dòng)發(fā)微信監(jiān)控報(bào)警
這篇文章主要為大家詳細(xì)介紹了python自動(dòng)發(fā)微信監(jiān)控報(bào)警,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09基于Python+Pyqt5開(kāi)發(fā)一個(gè)應(yīng)用程序
今天給大家?guī)?lái)的是關(guān)于Python的相關(guān)知識(shí),文章圍繞著Python+Pyqt5開(kāi)發(fā)一個(gè)應(yīng)用程序展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06