字符串格式化至關於字符串模板。也就是說,若是一個字符串有一部分是固定的,而另外一部分是動態變化的,那麼就能夠將固定的部分作成模板,而後那些動態變化的部分使用字符串格式化操做符(%) 替換。如一句問候語:「Hello 李寧」,其中「Hello」是固定的,但「李寧」可能變成任何一我的的名字,如「喬布斯」,因此在這個字符串中,「Hello」是固定的部分,而「李寧」是動態變化的部分,所以,須要用「%」操做符替換「李寧」,這樣就造成了一個模板。
Hello %s編程
上面的代碼中,「%」後面的s是什麼呢?其實字符串格式化操做符後面須要跟着動態值的數據類型,以及更細節的格式(如對於浮點數來講,小數點後要保留幾位),這裏的「%s」表示動態部分要被替換成字符串類型的值。若是在字符串模板中有多個要被替換的部分,須要按順序用「%」表示,而後在格式化字符串時,傳入的值也要符合這個順序。例5.2爲咱們演示了格式化字符串的基本用法。編程語言
本例首先定義了一個字符串模板,而後傳入了兩個字符串類型的值來格式化字符串,最後將格式化後的字符串輸出。ide
# 定義字符串模板 formatStr = "Hello %s. Today is %s, Are there any activities today?" # 初始化字符串格式化參數值,此處必須使用元組,不能使用列表 values = ('Mike', 'Wednesday') # 格式化字符串 print(formatStr % values)
程序運行結果以下圖所示。函數
從上面的代碼能夠看出,不只在爲字符串模板指定格式化參數時要使用百分號(%),在格式化字符串時,也要像取模同樣使用「%」操做符。還有就是指定字符串格式化參數值要使用元組,在這裏不能使用列表。學習
在上圖中,只是使用了字符串做爲格式化參數,但在實際的應用中,可能會有其餘類型的字符串格式化參數。若是遇到這種狀況,可使用str函數將這些數據類型的值轉換爲字符串類型的值,而後再傳入字符串模板,這麼作在大多數狀況下是可行的,但若是要對格式化參數值有更進一步的要求,光使用str函數就作不到了,這就要使用能表示這些數據類型的格式化參數,如「%f」表示浮點類型的格式化參數。code
在下面代碼的字符串模板中包含了字符串、整數和浮點數類型的模板。orm
# 在這個字符串模板中,包含了浮點數和整數類型的格式化參數 formatStr1 = "PI是圓周率,他的值是%.4f(保留小數點後%d位)" # 導入math模塊中的pi變量 from math import pi # 定義與formatStr1對應的格式化參數值 values1 = (pi, 4) # 格式化字符串,運行結果:PI是圓周率,他的值是3.1416(保留小數點後4位) print(formatStr1 % values1) # 在這個字符串模板中,包含了整數和字符串類型的格式化參數 formatStr2 = "這件事的成功率是%d%%, 若是有%s參與的話,成功率會提高至%d%%" values2 = (56, "John",70) # 運行結果:這件事的成功率是56%, 若是有John參與的話,成功率會提高至70% print(formatStr2 % values2) values3 = (66,"Mike") # 因爲指定的參數值的數量和格式化參數的數量不匹配,因此會拋出異常 print(formatStr2 % values3)
程序的運行結果以下圖所示。blog
在上面的代碼中,爲格式化字符串指定了不一樣數據類型的格式化參數。若是要在格式化字符串中顯示百分號(%),就要使用兩個百分號(%%)表示。當傳入的參數值的數量與格式化參數的數量不匹配時,就會拋出異常。字符串
在string模塊中提供了一個用於格式化字符串的Template類,該類的功能是用同一個值替換全部相同的格式化參數。Template類的格式化參數用美圓符號($)開頭,後面跟着格式化參數名稱,至關於變量名。在格式化時,須要使用Template類的substitute方法,該方法用於指定格式化參數對應的值。string
from string import Template template = Template("$s $s $s ") template.substitute(s = "Hello") # 這種參數被稱爲關鍵字參數,會在後面的章節詳細介紹
在上面的代碼中,經過Template類的構造方法傳入了一個格式化字符串,在這個格式化字符串中包含了3個「$s」,而後調用了substitute方法格式化這個字符串,該方法指定了s參數值爲「Hello」,最後的替換結果是「Hello Hello Hello」,也就是說,在格式化字符串中,有多少個「$s」,就替換多少個「$s」。substitute方法還能夠經過字典(見下一章)設置格式化參數的值。例5.4完整地演示瞭如何使用Template類格式化字符串。
使用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))
程序運行結果以下圖所示。
字符串自己也有一個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方法參數值的一部分。哇,接連拋出了這麼多功能,可能不少讀者有點目不暇接了,彆着急,例5.5會爲咱們演示format方法的一些經常使用使用方式。
本例分別使用一對大括號「{}」、命名格式化參數和順序格式化參數3中方式格式化字符串。
# 包含了2個空的大括號,format方法須要按順序指定格式化參數值 s1 = "Today is {}, the temperature is {} degrees." # format方法的第1個參數值對應s1的第1對大括號,第2個參數值對應s1的第2對大括號 # 運行結果:Today is Saturday, the temperature is 24 degrees. print(s1.format("Saturday", 24)) # 包含了2個命名格式化參數,一個是{week},另外一個是{degree} s2 = "Today is {week}, the temperature is {degree} degrees." # format方法的第1個參數指定了{degree}的值,第2個參數指定了{week}的值, # 能夠將degree和week調換,s2.format(week ="Sunday", degree = 22) # 運行結果:Today is Sunday, the temperature is 22 degrees. print(s2.format(degree = 22, week ="Sunday")) # 混合了順序格式化參數和關鍵字格式化參數兩種方式 s3 = "Today is {week}, {},the {} temperature is {degree} degrees." # format方法的參數,前面應該是按順序傳遞的格式化參數值,後面是關鍵字格式化參數值,順序不能調換 # 這樣作是錯誤的:s3.format(degree = 22, "aaaaa", 12345, week ="Sunday") # 運行結果:Today is Sunday, aaaaa,the 12345 temperature is 22 degrees. print(s3.format("aaaaa", 12345, degree = 22, week ="Sunday")) # 爲順序格式化參數指定了從format方法獲取參數值的順序,{1}表示從format方法的第2個參數取值 # {0}表示從format方法的第1個參數取值 s4 = "Today is {week}, {1},the {0} temperature is {degree} degrees." # 運行結果:Today is Sunday, 12345,the aaaaa temperature is 22 degrees. print(s4.format("aaaaa", 12345, degree = 22, week ="Sunday")) # 定義了一個列表 fullname = ["Bill", "Gates"] # {name[1]}取fullname列表中的第2個值(Gates) # format方法經過關鍵字參數,爲name名字指定了fullname列表。運行結果:Mr Gates print("Mr {name[1]}".format(name = fullname)) # 導入math模塊 import math # 訪問math模塊中的「__name__」變量來獲取模塊的名字,訪問math模塊中的pi變量獲取PI的值 s5 = "The {mod.__name__} module defines the value {mod.pi} for PI" # format方法爲mod關鍵字參數指定了math模塊 # 運行結果:The math module defines the value 3.141592653589793 for PI print(s5.format(mod = math))
程序運行結果以下圖所示。