你所不知道的Python | 字符串格式化的演進之路

字符串格式化對於每一個語言來講都是一個很是基礎和經常使用的功能,學習Python的同窗大概都知道能夠用%語法來格式化字符串。然而爲了讓咱們更方便的使用這個經常使用功能,語言自己也在對字符串格式化方法進行迭代。python

Python 2.6之前:%操做符

在Python 2.6出現以前,字符串迭代只有一種方法,就是%(也是取模)操做符,%操做符支持unicode和str類型的Python字符串,效果和C語言中的sprintf()方法類似,下面是一個使用%格式化字符串的例子:數組

print("I'm %s. I'm %d year old" % ('Tom', 27))
複製代碼

%符號前面使用一個字符串做爲模板,模板中有標記格式的佔位符號,%後面是一個tuple或者dict,用來傳遞須要格式化的值。佔位符控制着顯示的格式,下面列表展現了佔位符的種類:bash

佔位符 內容
%d 十進制整數
%i 十進制整數
%o 八進制整數
%u 無符號整數
%x 無符號十六進制(小寫)
%X 無符號十六進制(大寫)
%e 浮點型(科學記數法,小寫)
%E 浮點型(科學記數法,大寫)
%f 浮點數
%F 浮點數
%g 浮點型,若是小數位數超過4位,使用科學記數法表示(小寫)
%G 浮點型,若是小數位數超過4位,使用科學記數法表示(大寫)
%c 單個字符
%r 字符串(調用repr()方法生成)
%s 字符串(調用str()方法生成)

除了對數據類型的指定,%操做符還支持更復雜的格式控制:函數

%[數據名稱][對齊標誌][寬度].[精度]類型
複製代碼
名稱 內容
數據名稱 數據名稱用於字典賦值,若是%符號後面傳遞的數組就不須要填寫了
對齊標誌 有+、-、0、‘ ’四種,+表示顯示正負數符號,-表示左對齊,空格表示在左側填充一個空格,0表示用0填充
寬度 表示格式化後的字符串長度,位數不足用0或空格補齊
精度 小數點後的位數
類型 數據類型(參考佔位符種類)

例如print('%053f' % '12.34')會輸出0012.340性能

Python 2.6:format函數

到Python2.6時,出現了一種新的字符串格式化方式,str.format()函數,相比於%操做符,format函數使用{}和:代替了%,威力更增強大,在映射關係方面,format函數支持位置映射、關鍵字映射、對象屬性映射、下標映射等多種方式,不只參數能夠不按順序,也能夠不用參數或者一個參數使用屢次,下面經過幾個例子來講明。學習

'{1} {0}'.format('abc', 123# 能夠不按順序進行位置映射,輸出'123 abc'

'{} {}'.format('abc', 123# 能夠不指定參數名稱,輸出'abc 123'

'{1} {0} {1}'.format('abc', 123# 參數可使用屢次,輸出'123 abc 123'

'{name} {age}'.format(name='tom', age=27# 能夠按關鍵字映射,輸出'tom 27'

'{person.name} {person.age}'.format(person=person)  # 能夠按對象屬性映射,輸出'tom 27'

'{0[1]} {0[0]}'.format(lst)  # 經過下標映射
複製代碼

能夠看到,format函數比%操做符使用起來更加方便,不須要記住太多各類佔位符表明的意義,代碼可讀性也更高。在複雜格式控制方面,format函數也提供了更增強大的控制方式:測試

[[填充字符]對齊方式][符號標誌][#][寬度][,][.精度][類型]
複製代碼

例如:spa

'{:S^+#016,.2f}'.format(1234)  # 輸出'SSS+1,234.00SSSS'
複製代碼

咱們以上面的代碼爲例,經過表格說明一下format格式控制參數:code

類型 說明 示例說明
填充字符 不填時默認用空格填充 S表示用S填充
對齊方式 ^表示居中對齊、<表示左對齊、>表示右對齊 ^表示居中對齊,左右位數不足部分會用填充字符填充
符號標誌 +表示有符號(正數前顯示+,負數前顯示-),空格表示整數前加一個空格以和負數對齊 +表示正數前顯示空格
# 表示是否在二進制、八進制、十六進制前顯示0b、0o、0x等符號 #表示顯示進制符號,因爲是十進制,因此不顯示
寬度 表示輸出字符串的寬度 16表示字符串寬度爲16,不足部分會補齊
, 表示使用,做爲千位分隔符 ,表示使用千位分隔符
精度 表示小數點後數字位數 .2表示精度爲2爲
類型 s表示字符串類型,c表示字符類型,b\o\d分別表示二八十進制,x\X表示小寫和大寫十六進制,e\E表示小寫和大寫的科學記數法,f表示浮點型 f表示浮點型數字

能夠看到format函數在%基礎上豐富了格式控制種類,而且使輸出更容易。orm

Python 3.6:f-string

很多使用過ES6的小夥伴會知道其中的模板字符串,採用直接在字符串中內嵌變量的方式進行字符串格式化操做,Python在3.6版本中也爲咱們帶來了相似的功能:Formatted String Literals(字面量格式化字符串),簡稱f-string。

f-string就是以f''開頭的字符串,相似u''和b'',字符串內容和format方法中的格式同樣,可是能夠直接將變量帶入到字符串中,可讀性進一步增長,例如:

amount = 1234
f'請轉帳給我{amount:,.2f}元'  # '請轉帳給我1,234.00元'
複製代碼

同時,f-string的性能是比%和format都有提高的,咱們作一個簡單的測試,分別使用%操做符、format和f-string將下面語句執行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.'
複製代碼

用時結果以下:

總結

若是你的項目使用的Python版本已經提高到3.6,f-string格式化是首選方式,不只在保持功能強大的同時語義上更容易理解,並且性能也有較大的提高。若是項目尚未提高到3.6或者使用的2.7,更建議使用format,雖然性能上沒有優點,可是語義上仍是比%操做符更加便於理解的,功能也更增強大。

歡迎關注個人公衆號【Python私房菜】

相關文章
相關標籤/搜索