摘要:然而為了讓我們更方便的使用這個常用功能,語言本身也在對字符串格式化方法進(jìn)行迭代。不少使用過的小伙伴會知道其中的模板字符串,采用直接在字符串中內(nèi)嵌變量的方式進(jìn)行字符串格式化操作,在版本中也為我們帶來了類似的功能字面量格式化字符串,簡稱。
字符串格式化對于每個語言來說都是一個非常基礎(chǔ)和常用的功能,學(xué)習(xí)Python的同學(xué)大概都知道可以用%語法來格式化字符串。然而為了讓我們更方便的使用這個常用功能,語言本身也在對字符串格式化方法進(jìn)行迭代。
Python 2.6以前:%操作符在Python 2.6出現(xiàn)之前,字符串迭代只有一種方法,就是%(也是取模)操作符,%操作符支持unicode和str類型的Python字符串,效果和C語言中的sprintf()方法相似,下面是一個使用%格式化字符串的例子:
print("I"m %s. I"m %d year old" % ("Tom", 27))
%符號前面使用一個字符串作為模板,模板中有標(biāo)記格式的占位符號,%后面是一個tuple或者dict,用來傳遞需要格式化的值。占位符控制著顯示的格式,下面列表展示了占位符的種類:
占位符 | 內(nèi)容 |
---|---|
%d | 十進(jìn)制整數(shù) |
%i | 十進(jìn)制整數(shù) |
%o | 八進(jìn)制整數(shù) |
%u | 無符號整數(shù) |
%x | 無符號十六進(jìn)制(小寫) |
%X | 無符號十六進(jìn)制(大寫) |
%e | 浮點型(科學(xué)記數(shù)法,小寫) |
%E | 浮點型(科學(xué)記數(shù)法,大寫) |
%f | 浮點數(shù) |
%F | 浮點數(shù) |
%g | 浮點型,如果小數(shù)位數(shù)超過4位,使用科學(xué)記數(shù)法表示(小寫) |
%G | 浮點型,如果小數(shù)位數(shù)超過4位,使用科學(xué)記數(shù)法表示(大寫) |
%c | 單個字符 |
%r | 字符串(調(diào)用repr()方法生成) |
%s | 字符串(調(diào)用str()方法生成) |
除了對數(shù)據(jù)類型的指定,%操作符還支持更復(fù)雜的格式控制:
%[數(shù)據(jù)名稱][對齊標(biāo)志][寬度].[精度]類型
名稱 | 內(nèi)容 |
---|---|
數(shù)據(jù)名稱 | 數(shù)據(jù)名稱用于字典賦值,如果%符號后面?zhèn)鬟f的數(shù)組就不需要填寫了 |
對齊標(biāo)志 | 有+、-、0、‘ ’四種,+表示顯示正負(fù)數(shù)符號,-表示左對齊,空格表示在左側(cè)填充一個空格,0表示用0填充 |
寬度 | 表示格式化后的字符串長度,位數(shù)不足用0或空格補(bǔ)齊 |
精度 | 小數(shù)點后的位數(shù) |
類型 | 數(shù)據(jù)類型(參考占位符種類) |
例如print("%053f" % "12.34")會輸出0012.340
Python 2.6:format函數(shù)到Python2.6時,出現(xiàn)了一種新的字符串格式化方式,str.format()函數(shù),相比于%操作符,format函數(shù)使用{}和:代替了%,威力更加強(qiáng)大,在映射關(guān)系方面,format函數(shù)支持位置映射、關(guān)鍵字映射、對象屬性映射、下標(biāo)映射等多種方式,不僅參數(shù)可以不按順序,也可以不用參數(shù)或者一個參數(shù)使用多次,下面通過幾個例子來說明。
"{1} {0}".format("abc", 123)? # 可以不按順序進(jìn)行位置映射,輸出"123 abc" "{} {}".format("abc", 123)? # 可以不指定參數(shù)名稱,輸出"abc 123" "{1} {0} {1}".format("abc", 123)? # 參數(shù)可以使用多次,輸出"123 abc 123" "{name} {age}".format(name="tom", age=27)? # 可以按關(guān)鍵字映射,輸出"tom 27" "{person.name} {person.age}".format(person=person)? # 可以按對象屬性映射,輸出"tom 27" "{0[1]} {0[0]}".format(lst)? # 通過下標(biāo)映射
可以看到,format函數(shù)比%操作符使用起來更加方便,不需要記住太多各種占位符代表的意義,代碼可讀性也更高。在復(fù)雜格式控制方面,format函數(shù)也提供了更加強(qiáng)大的控制方式:
[[填充字符]對齊方式][符號標(biāo)志][#][寬度][,][.精度][類型]
例如:
"{:S^+#016,.2f}".format(1234)? # 輸出"SSS+1,234.00SSSS"
我們以上面的代碼為例,通過表格說明一下format格式控制參數(shù):
類型 | 說明 | 示例說明 |
---|---|---|
填充字符 | 不填時默認(rèn)用空格填充 | S表示用S填充 |
對齊方式 | ^表示居中對齊、<表示左對齊、>表示右對齊 | ^表示居中對齊,左右位數(shù)不足部分會用填充字符填充 |
符號標(biāo)志 | +表示有符號(正數(shù)前顯示+,負(fù)數(shù)前顯示-),空格表示整數(shù)前加一個空格以和負(fù)數(shù)對齊 | +表示正數(shù)前顯示空格 |
# | 表示是否在二進(jìn)制、八進(jìn)制、十六進(jìn)制前顯示0b、0o、0x等符號 | #表示顯示進(jìn)制符號,由于是十進(jìn)制,所以不顯示 |
寬度 | 表示輸出字符串的寬度 | 16表示字符串寬度為16,不足部分會補(bǔ)齊 |
, | 表示使用,作為千位分隔符 | ,表示使用千位分隔符 |
精度 | 表示小數(shù)點后數(shù)字位數(shù) | .2表示精度為2為 |
類型 | s表示字符串類型,c表示字符類型,bod分別表示二八十進(jìn)制,xX表示小寫和大寫十六進(jìn)制,eE表示小寫和大寫的科學(xué)記數(shù)法,f表示浮點型 | f表示浮點型數(shù)字 |
可以看到format函數(shù)在%基礎(chǔ)上豐富了格式控制種類,并且使輸出更容易。
Python 3.6:f-string不少使用過ES6的小伙伴會知道其中的模板字符串,采用直接在字符串中內(nèi)嵌變量的方式進(jìn)行字符串格式化操作,Python在3.6版本中也為我們帶來了類似的功能:Formatted String Literals(字面量格式化字符串),簡稱f-string。
f-string就是以f""開頭的字符串,類似u""和b"",字符串內(nèi)容和format方法中的格式一樣,但是可以直接將變量帶入到字符串中,可讀性進(jìn)一步增加,例如:
amount = 1234 f"請轉(zhuǎn)賬給我{amount:,.2f}元"? #?"請轉(zhuǎn)賬給我1,234.00元"
同時,f-string的性能是比%和format都有提升的,我們做一個簡單的測試,分別使用%操作符、format和f-string將下面語句執(zhí)行10000次:
"My name is %s and i"m %s years old." % (name, age) "My name is {} and i"m {} years old.".format(name, age) f"My name is {name} and i"m {age} years old."
用時結(jié)果如下:
總結(jié)如果你的項目使用的Python版本已經(jīng)提升到3.6,f-string格式化是首選方式,不僅在保持功能強(qiáng)大的同時語義上更容易理解,而且性能也有較大的提升。如果項目還沒有提升到3.6或者使用的2.7,更建議使用format,雖然性能上沒有優(yōu)勢,但是語義上還是比%操作符更加便于理解的,功能也更加強(qiáng)大。
歡迎關(guān)注我的公眾號【Python私房菜】文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/41856.html
摘要:有一點需要注意的是,默認(rèn)參數(shù)需要設(shè)置在必選參數(shù)后面,并且默認(rèn)參數(shù)既可以通過位置調(diào)用,也可以通過關(guān)鍵字調(diào)用。通過位置指定參數(shù)通過位置指定參數(shù)報錯,默認(rèn)參數(shù)必須在必選參數(shù)后面參數(shù)默認(rèn)值既支持關(guān)鍵字參數(shù),也支持僅限關(guān)鍵字參數(shù)。 showImg(https://segmentfault.com/img/bVbdxcE?w=1224&h=618); 函數(shù)參數(shù)處理機(jī)制是Python中一個非常重要的...
摘要:私房菜輸出私房菜方法使用方法方法是中出現(xiàn)的一種代替操作符的字符串格式化方法,同樣可以用來連接字符串。私房菜方法使用方法字符串有一個內(nèi)置方法,其參數(shù)是一個序列類型,例如數(shù)組或者元組等。 showImg(https://segmentfault.com/img/bVbcR8e?w=578&h=375); 字符串連接,就是將2個或以上的字符串合并成一個,看上去連接字符串是一個非常基礎(chǔ)的小問題...
摘要:用函數(shù)式編程對進(jìn)行斷舍離當(dāng)從業(yè)的老司機(jī)學(xué)會函數(shù)式編程時,他扔掉了的特性,也不用面向?qū)ο罅耍詈蟀l(fā)現(xiàn)了真愛啊作用域和閉包作用域和閉包在里非常重要。旨在幫助非函數(shù)式編程的同學(xué),能快速切入到函數(shù)式編程的理念。 1、用函數(shù)式編程對JavaScript進(jìn)行斷舍離 當(dāng)從業(yè)20的JavaScript老司機(jī)學(xué)會函數(shù)式編程時,他扔掉了90%的特性,也不用面向?qū)ο罅耍詈蟀l(fā)現(xiàn)了真愛啊!!! https:/...
摘要:用函數(shù)式編程對進(jìn)行斷舍離當(dāng)從業(yè)的老司機(jī)學(xué)會函數(shù)式編程時,他扔掉了的特性,也不用面向?qū)ο罅耍詈蟀l(fā)現(xiàn)了真愛啊作用域和閉包作用域和閉包在里非常重要。旨在幫助非函數(shù)式編程的同學(xué),能快速切入到函數(shù)式編程的理念。 1、用函數(shù)式編程對JavaScript進(jìn)行斷舍離 當(dāng)從業(yè)20的JavaScript老司機(jī)學(xué)會函數(shù)式編程時,他扔掉了90%的特性,也不用面向?qū)ο罅耍詈蟀l(fā)現(xiàn)了真愛啊!!! https:/...
摘要:用函數(shù)式編程對進(jìn)行斷舍離當(dāng)從業(yè)的老司機(jī)學(xué)會函數(shù)式編程時,他扔掉了的特性,也不用面向?qū)ο罅耍詈蟀l(fā)現(xiàn)了真愛啊作用域和閉包作用域和閉包在里非常重要。旨在幫助非函數(shù)式編程的同學(xué),能快速切入到函數(shù)式編程的理念。 1、用函數(shù)式編程對JavaScript進(jìn)行斷舍離 當(dāng)從業(yè)20的JavaScript老司機(jī)學(xué)會函數(shù)式編程時,他扔掉了90%的特性,也不用面向?qū)ο罅耍詈蟀l(fā)現(xiàn)了真愛啊!!! https:/...
閱讀 2082·2021-11-24 09:39
閱讀 1536·2021-10-11 10:59
閱讀 2489·2021-09-24 10:28
閱讀 3367·2021-09-08 09:45
閱讀 1263·2021-09-07 10:06
閱讀 1657·2019-08-30 15:53
閱讀 2056·2019-08-30 15:53
閱讀 1411·2019-08-30 15:53