天天看點

第3.11節 Python強大的字元串格式化新功能:format字元串格式化的格式控制

                                            第3.11節 format字元串格式化的格式控制

一、    引言

上節介紹了四種format進行字元串格式化的方法,但都隻介紹了真實值與格式符的位置映射關系,而沒有介紹諸如寬度、對齊方式、精度控制等控制每個真實值顯示格式的内容。本節就介紹怎麼進行字元串格式化的格式控制,這種格式控制的要素在format格式化中稱為“格式說明符”。

在前面章節介紹了“格式符”(也稱為“替換字段”、“轉換說明符”),格式說明符是格式符的一個子串,專門用于控制輸出格式。

二、    格式符内容

在format字元串格式化中,“格式符”中大括号(大括号就是占位符)及其内的内容組成如下:

格式符:{[字段名][!轉換标志][: 格式說明符]}

1.    字段名:索引或辨別符,可以是數字(即索引)、變量、變量.屬性、變量[索引]、變量[鍵值],指出要設定哪個真實值并使用結果來替換該字段。請見案例部分;

2.    轉換标志:跟在歎号後面的單個字元。目前支援的字元包括r(表示repr)、s(表示str)和a(表示ascii)。如果你指定了轉換标志,将不使用對象本身的格式設定機制,而是使用指定的函數将對象轉換為字元串,再做進一步的格式設定。上述三個标志(s、r和a)指定分别使用str、repr和ascii進行轉換。關于這三種類型,老猿沒有深入研究,我們來以:s='20190301 班 小明 同學,小名:小明,總分:597.5'這個字元串來進行測試:

1)    ascii(s)輸出:帶雙引号的編碼串

"'20190301 \\u73ed \\u5c0f\\u660e \\u540c\\u5b66,\\u5c0f\\u540d\\uff1a\\u5c0f\\u660e\\uff0c\\u603b\\u5206:597.5'"

2)    repr(s)輸出:在原輸入前加了雙引号

"'20190301 班 小明 同學,小名:小明,總分:597.5'"

3)    str(s):與s值一樣。

函數str通常建立外觀普通的字元串版本(沒有對輸入字元串做任何處理)。函數repr嘗試建立給定值的Python表示(這裡是一個字元串字面量,老猿暫時沒有了解這句話,可能是字元串内容在Python中的記憶體存儲?)。函數ascii建立隻包含ASCII字元的表示(老猿了解就是把不是ascii碼的字元轉換成雙位元組編碼展示)。

3.    格式說明符:跟在冒号後面的微型格式指定語言表達式。格式說明符讓我們能夠詳細地指定最終的格式,包括格式類型(如字元串、浮點數或十六進制數),字段寬度和數的精度,如何顯示符号和千位分隔符,以及各種對齊和填充方式。

文法:[[填充符]對齊方式][符号][#][0][寬度][分組選項][.精度][類型]

1)    所有格式說明符字段都是可選項;

2)    填充符:可以是任何字元,将在顯示内容寬度比設定寬度短時用填充符補齊;

3)    對齊方式:“<”符号表示左對齊、“>”表示右對齊,“^”表示居中對齊,“=”用于帶符号的數字對齊時,在符号和數字之間補充填充符,當沒有指定填充符時,使用預設填充符(空格),但如果數字的寬度前有0時,0将替換預設填充符。

關于使用等号對數字對齊的舉例:

'{:=+9}'.format(12345)  #結果為:'+   12345'

'{:=+09}'.format(12345) #結果為:'+00012345'

'{:*=+09}'.format(12345) #結果為:'+***12345'

4)    符号:僅用于數字,“+”表示在數字前加正号和負号,“-”表示隻有負數加負号,這是預設的方式,空格表示在正數前加一個空格,負數前加一個減号

5)    #:表示在轉換成字元串時使用“替代形式”。此選項僅對integer、float、complex和decimal類型有效。對于整數,使用二進制、八進制或十六進制輸出時,此選項會将字首“0b”、“0o”或“0x”分别添加到輸出值。對于浮點數、複數和小數,替換形式會導緻轉換結果(即使後面沒有數字)始終包含小數點字元。此外,對于“g”和“g”轉換,尾随零不會從結果中移除。

6)    0:當沒有指定填充符時,如果數字的寬度前有“0”時,“0”将替換預設填充符;

7)    寬度:資料輸出占用的寬度,當實際輸出大于該寬度時按實際寬度輸出,此時對齊方式和填充符不起作用;

8)    分組選項:用于數字,“,”選項表示使用逗号作為千位分隔符。“_”選項表示對浮點類型和整型表示類型“d”的千位分隔符使用下劃線。對于整數表示類型“B”、“O”、“X”和“x”,下劃線将每4位插入一次。對于其他類型,指定此選項是錯誤的;

9)    精度:精度對于格式為“f”和“F”的浮點值,表示小數點後應顯示多少位數,對于格式為“g”或“G”的浮點值,小數點前後應顯示多少位數。對于非數字類型,字段訓示最大字段大小——換句話說,字元串的精度小于字元串長度時,直接截取前面長度。整數值不允許精度。注意精度前要帶點。

10)    類型:說明真實值的類型

類型           含義

b          将整數表示為二進制數

c          将整數解讀為Unicode碼點

d          将整數視為十進制數進行處理,這是整數預設使用的說明符

e          使用科學表示法來表示小數(用e來表示指數)

E          與e相同,但使用E來表示指數

f          将小數表示為定點數

F          與f相同,但對于特殊值(nan和inf),使用大寫表示

g          自動在定點表示法和科學表示法之間選擇。預設用于小數,在預設情況下至少有1位小數

G          與g相同,但使用大寫來表示指數和特殊值

n          與d相同,但插入随區域而異的數字分隔符

o          将整數表示為八進制數

s          保持字元串的格式不變,這是預設用于字元串的說明符

x          将整數表示為十六進制數并使用小寫字母

X          與x相同,但使用大寫字母

%          将數表示為百分比值(乘以100,按說明符f設定格式,再在後面加上%)

None           當沒有指定類型時,字元串按s方式,數字按d方式,浮點數按g方式

三、    格式符舉例

student={'name':'小明','class':'20190301','score':597.5}

1.    s1='{st[class]}班{st[name]:_>4}總分:{st[score]:0>+6.1f}'.format(st=student)

執行結果:s1= '20190301班__小明總分:+597.5'

2.    s2='{st[class]}班{st[name]!r:_>4}總分:{st[score]:0>+6.1f}'.format(st=student)

指定名字轉換标記為r,執行結果:s2="20190301班'小明'總分:+597.5"

3.    s3=f"{ student ['classno']}班{ student ['name']:_>4}總分:{ student ['score']:0>+6.1f}"

執行結果:'20190301班__小明總分:+597.5',注意這裡的字典鍵值加了單引号。

4.    '{:*>+#10_}'.format(123456)   #結果為'**+123_456'

5.    '{:*>+#10_b}'.format(123456) #結果為'+0b1_1110_0010_0100_0000'

6.    '{:*>+#10_o}'.format(123456) #結果為'+0o36_1100

7.    '{:*>+#10_x}'.format(123456) #結果為'*+0x1_e240'

以上例子就不補充解釋了,大家對照前面的說明自己分析一下。

本節詳細介紹了格式化字元串中的格式符的組成及每部分的含義,并舉例進行說明,内容比較多,不容易記住,請大家先了解,具體格式實際使用時進行資料速查就可以了。最後補充介紹一下子產品string中幾個與字元串相關的常量和一個函數:

string.digits:包含數字0~9的字元串。

string.ascii_letters:包含所有ASCII字母(大寫和小寫)的字元串。

string.ascii_lowercase:包含所有小寫ASCII字母的字元串。

string.printable:包含所有可列印的ASCII字元的字元串。

string.punctuation:包含所有ASCII标點字元的字元串。

string.ascii_uppercase:包含所有大寫ASCII字母的字元串。雖然說的是ASCII字元,但值實際上是未解碼的Unicode字元串。

string.capwords(s[, sep]) 使用split根據sep拆分s,将每項的首字母大寫,再以SPLIT為分隔符将它們合并起來,如:

string.capwords(s,'/')

'/Usr/Var/Tempdirectory'

到本節為止,字元串的内容共介紹了六節内容,基本上字元串相關的内容就全介紹完了,希望大家好好了解。

截止到本節,Python的資料類型基礎知識就介紹完了。這陣子老猿是每天至少寫一篇部落格,都是基于前期學習的知識基礎上整理出來的内容,後後面準備介紹的生成器、疊代器、清單解析等内容部分還在深入研究和總結,後面更新将放慢節奏,但至少保證每周一節内容的更新,同時個人認為後面這些内容屬于資料類型進階的内容,将新開一章進行介紹。