1. 程式人生 > >Python格式化字串知多少

Python格式化字串知多少

字串格式化相當於字串模板。也就是說,如果一個字串有一部分是固定的,而另一部分是動態變化的,那麼就可以將固定的部分做成模板,然後那些動態變化的部分使用字串格式化操作符(%) 替換。如一句問候語:“Hello 李寧”,其中“Hello”是固定的,但“李寧”可能變成任何一個人的名字,如“喬布斯”,所以在這個字串中,“Hello”是固定的部分,而“李寧”是動態變化的部分,因此,需要用“%”操作符替換“李寧”,這樣就形成了一個模板。   Hello %s   上面的程式碼中,“%”後面的s是什麼呢?其實字串格式化操作符後面需要跟著動態值的資料型別,以及更細節的格式(如對於浮點數來說,小數點後要保留幾位),這裡的“%s”表示動態部分要被替換成字串型別的值。如果在字串模板中有多個要被替換的部分,需要按順序用“%”表示,然後在格式化字串時,傳入的值也要符合這個順序。下面的程式碼演示了格式化字串的基本用法。
formatStr = "Hello %s. Today is %s, Are there any activities today?"
#  初始化字串格式化引數值,此處必須使用元組,不能使用列表
values = ('Mike', 'Wednesday')
#  格式化字串
print(formatStr % values)
執行結果如下圖所示:

  

從上面的程式碼可以看出,不僅在為字串模板指定格式化引數時要使用百分號(%),在格式化字串時,也要像取模一樣使用“%”操作符。還有就是指定字串格式化引數值要使用元組,在這裡不能使用列表。 1. 模板字串   在string模組中提供了一個用於格式化字串的Template類,該類的功能是用同一個值替換所有相同的格式化引數。Template類的格式化引數用美元符號($)開頭,後面跟著格式化引數名稱,相當於變數名。在格式化時,需要使用Template類的substitute方法,該方法用於指定格式化引數對應的值。
from string import Template
template = Template("$s $s $s ")
template.substitute(s = "Hello")
在上面的程式碼中,通過Template類的構造方法傳入了一個格式化字串,在這個格式化字串中包含了3個“$s”,然後呼叫了substitute方法格式化這個字串,該方法指定了s引數值為“Hello”,最後的替換結果是“Hello Hello Hello”,也就是說,在格式化字串中,有多少個“$s”,就替換多少個“$s”。下面的程式碼完整地演示瞭如何使用Template類格式化字串。
# 引用string模組中的Template類
from string import Template
template1 = Template("$s是我最喜歡的程式語言, $s非常容易學習,而且功能強大")
# 指定格式化引數s的值是Python
print(template1.substitute(s='Python'))
# 當格式化引數是一個字串的一部分時,為了和字串的其他部分割槽分開,
# 需要用一對大括號將格式化引數變數括起來
template2 = Template("${s}stitute")
print(template2.substitute(s='sub'))
 
template3 = Template("$dollar$$相當於多少$pounds")
# 替換兩個格式化引數變數
print(template3.substitute(dollar=20,pounds='英磅'))
 
template4 = Template("$dollar$$相當於多少$pounds")
data = {}
data['dollar'] = 100
data['pounds'] = '英磅'
# 使用字典指定格式化引數值
print(template4.substitute(data))
執行結果如下圖所示:   2. 字串的format方法   字串本身也有一個format方法用於格式化當前的字串。這個format方法和前面講的格式化操作符(%)不太一樣。字串格式化引數並不是用百分號(%)表示,而是用一對大括號({}),而且支援按順序指定格式化引數值和關鍵字格式化引數。例如,下面的程式碼通過format方法按順序為格式化字串指定了引數值。  
print("{} {} {}".format(1,2,3)) # 執行結果:1 2 3
  我們可以看到,上面的程式碼在字串中指定了3對空的大括號,這代表3個格式化引數,不需要指定資料型別,可以向其傳遞Python語言支援的任何值。通過format方法傳入3個值(1,2,3),這3個值會按順序替換格式化字串中的3對空的大括號。 命名格式化引數是指在一對大括號中指定一個名稱,然後呼叫format方法時也要指定這個名稱。
print("{a}  {b}  {c}".format(a = 1,c = 2,b = 3))   # 執行結果:1  3  2
上面的程式碼在3對大括號中分別添加了“a”、“b”、“c”。通過format方法指定了這3個關鍵字引數的值。我們可以看到,並沒有按順序指定關鍵字引數的值。這也是使用關鍵字引數的好處,只要名字正確,fomat引數的順序可以任意指定。當然,順序方式和關鍵字引數方式可以混合使用,而且還可以指定順序方式中格式化引數從format方法提取引數值的順序,甚至可以取format方法引數值的一部分。   3. 更進一步控制字串格式化引數 format方法的功能遠不止這些,在一對大括號中新增一些字串格式化型別符,可以對格式化字串進行更多的控制。例如,下面的程式碼會將一個字串型別的格式化引數值按原樣輸出、通過repr函式輸出,以及輸出其Unicode編碼。
print("{first!s} {first!r} {first!a}".format(first = "中"))
執行這行程式碼,會輸出如下的結果。   中 '中' '\u4e2d'   除此之外,format方法還支援很多其他的控制符,例如,可以將整數按浮點數輸出,也可以將十進位制數按二進位制、八進位制、十六進位制格式輸出。下面的程式碼為我們演示瞭如何使用這些控制符格式化字串。
# 執行結果:原樣輸出:中  呼叫repr函式:'中'  輸出Unicode編碼:'\u4e2d'
print("原樣輸出:{first!s}  呼叫repr函式:{first!r}  輸出Unicode編碼:{first!a}".format(first = "中"))
#  將21按浮點數輸出,執行結果:整數:21  浮點數:21.000000
print("整數:{num}  浮點數:{num:f}".format(num = 21))
#  將56按十進位制、二進位制、八進位制和十六進位制格式輸出
#  執行結果:十進位制:56  二進位制:111000  八進位制:70  十六進位制:38
print("十進位制:{num}  二進位制:{num:b}  八進位制:{num:o}  十六進位制:{num:x}".format(num = 56))
#  將533按科學計數法格式輸出,執行結果:科學計數法:5.330000e+02
print("科學計數法:{num:e}".format(num = 533))
#  將0.56按百分比格式輸出,執行結果:百分比:56.000000%
print("百分比:{num:%}".format(num = 0.56))
執行結果如下圖所示。   4. 欄位寬度、精度和千位分隔符   在前面講到使用format方法可以讓待格式化的值左側或右側補空格,不過這種填空格的效果看上去並不美觀,而且一般的使用者也分不清前面或後面到底有多少個空格。所以最合適的方式就是在值的前面或後面補0。例如,如果寫一本書,章節超過了10章,為了讓每一章的序號長度都一樣,可以使用01、02、03、…、11、12這樣的格式。對於10以後的章節,按原樣輸出即可。不過對於10以下的章節,就需要在數字前面補一個0了。要實現這個功能,就需要使用{chapter:02.0f}來格式化章節序號。其中chapter是格式化引數,第一個0表示如果位數不足;前面要補0,2表示整數部分是2位數字;第2個0表示小數部分被忽略;f表示以浮點數形式格式化chapter指定的值。
#  執行結果:第04章
print("第{chapter:02.0f}章".format(chapter = 4));
  如果想用format方法控制值的左、中、右對齊,可以分別使用“<”,“^”和“>”。
# 讓1、2、3分別以左對齊、中對齊和右對齊方式顯示
print('{:<10.2f}\n{:^10.2f}\n{:>10.2f}'.format(1,2,3))
  不管是哪種方式對齊(左、中、右),在很多情況下,值的總長度要比指定寬度小,在預設情況下,不足的位要補空格,但我們也可以通過在“<”、“^”和“>”前面加符號,讓這些不足的位用這些符號替代空格補齊。
# “井號”在寬度為20的區域內中心對齊,並左右兩側新增若干個井號(#),兩側各新增8個井號
#  執行結果:######## 井號 ########
print("{:#^20}".format(" 井號 "))
  對於需要在前面顯示負號的數值,如-3、-5。可以通過在等號(=)前面加上字元,以便在負號和數值之間加上特殊符號。
# 在5.43和負號(-)之間顯示“^”,執行結果:-^^^^^5.43
print("{0:^=10.2f}".format(-5.43))
  最後讓我們來討論一下進位制轉換。如果將10進位制分別轉換為二進位制、八進位制和十六進位制的數,需要分別使用“b”、“o”和“x”型別符。如下面的程式碼將43轉換為二進位制的數。
#  執行結果:101011
print("{:b}".format(43))
  5. f字串   在新版的Python中,提供了一種f字串。也就是在字串之前加一個f,這樣在字串中就可以直接使用外部變量了,只不過變數要使用一對大括號括起來。程式碼如下:
name = 'Bill'
age = 30
 
print(f'姓名:{name}, 年齡:{age}')
  要獲得Python格式化字串的完整原始碼,可以關注”極客起源“公眾號,並輸入777412來獲得相關資源。