溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python從菜鳥到高手(15):字符串格式化

發(fā)布時(shí)間:2020-07-30 16:41:44 來源:網(wǎng)絡(luò) 閱讀:1938 作者:androidguy 欄目:編程語言

1. 字符串格式化基礎(chǔ)

字符串格式化相當(dāng)于字符串模板。也就是說,如果一個(gè)字符串有一部分是固定的,而另一部分是動(dòng)態(tài)變化的,那么就可以將固定的部分做成模板,然后那些動(dòng)態(tài)變化的部分使用字符串格式化操作符(%) 替換。如一句問候語:“Hello 李寧”,其中“Hello”是固定的,但“李寧”可能變成任何一個(gè)人的名字,如“喬布斯”,所以在這個(gè)字符串中,“Hello”是固定的部分,而“李寧”是動(dòng)態(tài)變化的部分,因此,需要用“%”操作符替換“李寧”,這樣就形成了一個(gè)模板。
Hello %s

上面的代碼中,“%”后面的s是什么呢?其實(shí)字符串格式化操作符后面需要跟著動(dòng)態(tài)值的數(shù)據(jù)類型,以及更細(xì)節(jié)的格式(如對(duì)于浮點(diǎn)數(shù)來說,小數(shù)點(diǎn)后要保留幾位),這里的“%s”表示動(dòng)態(tài)部分要被替換成字符串類型的值。如果在字符串模板中有多個(gè)要被替換的部分,需要按順序用“%”表示,然后在格式化字符串時(shí),傳入的值也要符合這個(gè)順序。例5.2為我們演示了格式化字符串的基本用法。

本例首先定義了一個(gè)字符串模板,然后傳入了兩個(gè)字符串類型的值來格式化字符串,最后將格式化后的字符串輸出。

#  定義字符串模板
formatStr = "Hello %s. Today is %s, Are there any activities today?"
#  初始化字符串格式化參數(shù)值,此處必須使用元組,不能使用列表
values = ('Mike', 'Wednesday')
#  格式化字符串
print(formatStr % values)

程序運(yùn)行結(jié)果如下圖所示。

Python從菜鳥到高手(15):字符串格式化

從上面的代碼可以看出,不僅在為字符串模板指定格式化參數(shù)時(shí)要使用百分號(hào)(%),在格式化字符串時(shí),也要像取模一樣使用“%”操作符。還有就是指定字符串格式化參數(shù)值要使用元組,在這里不能使用列表。

在上圖中,只是使用了字符串作為格式化參數(shù),但在實(shí)際的應(yīng)用中,可能會(huì)有其他類型的字符串格式化參數(shù)。如果遇到這種情況,可以使用str函數(shù)將這些數(shù)據(jù)類型的值轉(zhuǎn)換為字符串類型的值,然后再傳入字符串模板,這么做在大多數(shù)情況下是可行的,但如果要對(duì)格式化參數(shù)值有更進(jìn)一步的要求,光使用str函數(shù)就做不到了,這就要使用能表示這些數(shù)據(jù)類型的格式化參數(shù),如“%f”表示浮點(diǎn)類型的格式化參數(shù)。

在下面代碼的字符串模板中包含了字符串、整數(shù)和浮點(diǎn)數(shù)類型的模板。

# 在這個(gè)字符串模板中,包含了浮點(diǎn)數(shù)和整數(shù)類型的格式化參數(shù)
formatStr1 = "PI是圓周率,他的值是%.4f(保留小數(shù)點(diǎn)后%d位)"
#  導(dǎo)入math模塊中的pi變量
from math import pi
#  定義與formatStr1對(duì)應(yīng)的格式化參數(shù)值
values1 = (pi, 4)
#  格式化字符串,運(yùn)行結(jié)果:PI是圓周率,他的值是3.1416(保留小數(shù)點(diǎn)后4位)
print(formatStr1 % values1)
#  在這個(gè)字符串模板中,包含了整數(shù)和字符串類型的格式化參數(shù)
formatStr2 = "這件事的成功率是%d%%, 如果有%s參與的話,成功率會(huì)提升至%d%%"
values2 = (56, "John",70)
#  運(yùn)行結(jié)果:這件事的成功率是56%, 如果有John參與的話,成功率會(huì)提升至70%
print(formatStr2 % values2)
values3 = (66,"Mike")
#  由于指定的參數(shù)值的數(shù)量和格式化參數(shù)的數(shù)量不匹配,所以會(huì)拋出異常
print(formatStr2 % values3)

程序的運(yùn)行結(jié)果如下圖所示。

Python從菜鳥到高手(15):字符串格式化

在上面的代碼中,為格式化字符串指定了不同數(shù)據(jù)類型的格式化參數(shù)。如果要在格式化字符串中顯示百分號(hào)(%),就要使用兩個(gè)百分號(hào)(%%)表示。當(dāng)傳入的參數(shù)值的數(shù)量與格式化參數(shù)的數(shù)量不匹配時(shí),就會(huì)拋出異常。

模板字符串

在string模塊中提供了一個(gè)用于格式化字符串的Template類,該類的功能是用同一個(gè)值替換所有相同的格式化參數(shù)。Template類的格式化參數(shù)用美元符號(hào)($)開頭,后面跟著格式化參數(shù)名稱,相當(dāng)于變量名。在格式化時(shí),需要使用Template類的substitute方法,該方法用于指定格式化參數(shù)對(duì)應(yīng)的值。

from string import Template
template = Template("$s  $s  $s ")
template.substitute(s = "Hello")       # 這種參數(shù)被稱為關(guān)鍵字參數(shù),會(huì)在后面的章節(jié)詳細(xì)介紹

在上面的代碼中,通過Template類的構(gòu)造方法傳入了一個(gè)格式化字符串,在這個(gè)格式化字符串中包含了3個(gè)“$s”,然后調(diào)用了substitute方法格式化這個(gè)字符串,該方法指定了s參數(shù)值為“Hello”,最后的替換結(jié)果是“Hello Hello Hello”,也就是說,在格式化字符串中,有多少個(gè)“$s”,就替換多少個(gè)“$s”。substitute方法還可以通過字典(見下一章)設(shè)置格式化參數(shù)的值。例5.4完整地演示了如何使用Template類格式化字符串。

使用Template格式化字符串,當(dāng)格式化參數(shù)是一個(gè)字符串的一部分時(shí),需要用一對(duì)大括號(hào)({})將格式化參數(shù)變量括起來。

# 引用string模塊中的Template類
from string import Template
template1 = Template("$s是我最喜歡的編程語言, $s非常容易學(xué)習(xí),而且功能強(qiáng)大")
# 指定格式化參數(shù)s的值是Python
print(template1.substitute(s='Python'))
# 當(dāng)格式化參數(shù)是一個(gè)字符串的一部分時(shí),為了和字符串的其他部分區(qū)分開,
# 需要用一對(duì)大括號(hào)將格式化參數(shù)變量括起來
template2 = Template("${s}stitute")
print(template2.substitute(s='sub'))

template3 = Template("$dollar$$相當(dāng)于多少$pounds")
# 替換兩個(gè)格式化參數(shù)變量
print(template3.substitute(dollar=20,pounds='英磅'))

template4 = Template("$dollar$$相當(dāng)于多少$pounds")
data = {}
data['dollar'] = 100
data['pounds'] = '英磅'
# 使用字典指定格式化參數(shù)值
print(template4.substitute(data))

程序運(yùn)行結(jié)果如下圖所示。

Python從菜鳥到高手(15):字符串格式化

字符串的format方法

字符串本身也有一個(gè)format方法用于格式化當(dāng)前的字符串。這個(gè)format方法和前面講的格式化操作符(%)不太一樣。字符串格式化參數(shù)并不是用百分號(hào)(%)表示,而是用一對(duì)大括號(hào)({}),而且支持按順序指定格式化參數(shù)值和關(guān)鍵字格式化參數(shù)。例如,下面的代碼通過format方法按順序?yàn)楦袷交址付藚?shù)值。

print("{}  {}  {}".format(1,2,3))   # 運(yùn)行結(jié)果:1  2  3

我們可以看到,上面的代碼在字符串中指定了3對(duì)空的大括號(hào),這代表3個(gè)格式化參數(shù),不需要指定數(shù)據(jù)類型,可以向其傳遞Python語言支持的任何值。通過format方法傳入3個(gè)值(1,2,3),這3個(gè)值會(huì)按順序替換格式化字符串中的3對(duì)空的大括號(hào)。

命名格式化參數(shù)是指在一對(duì)大括號(hào)中指定一個(gè)名稱,然后調(diào)用format方法時(shí)也要指定這個(gè)名稱。

print("{a}    {c}".format(a = 1,c = 2,b = 3))   # 運(yùn)行結(jié)果:1  3  2

上面的代碼在3對(duì)大括號(hào)中分別添加了“a”、“b”、“c”。通過format方法指定了這3個(gè)關(guān)鍵字參數(shù)的值。我們可以看到,并沒有按順序指定關(guān)鍵字參數(shù)的值。這也是使用關(guān)鍵字參數(shù)的好處,只要名字正確,fomat參數(shù)的順序可以任意指定。當(dāng)然,順序方式和關(guān)鍵字參數(shù)方式可以混合使用,而且還可以指定順序方式中格式化參數(shù)從format方法提取參數(shù)值的順序,甚至可以取format方法參數(shù)值的一部分。哇,接連拋出了這么多功能,可能很多讀者有點(diǎn)應(yīng)接不暇了,別著急,例5.5會(huì)為我們演示format方法的一些常用使用方式。

本例分別使用一對(duì)大括號(hào)“{}”、命名格式化參數(shù)和順序格式化參數(shù)3中方式格式化字符串。

# 包含了2個(gè)空的大括號(hào),format方法需要按順序指定格式化參數(shù)值
s1 = "Today is {}, the temperature is {} degrees."
# format方法的第1個(gè)參數(shù)值對(duì)應(yīng)s1的第1對(duì)大括號(hào),第2個(gè)參數(shù)值對(duì)應(yīng)s1的第2對(duì)大括號(hào)
# 運(yùn)行結(jié)果:Today is Saturday, the temperature is 24 degrees.
print(s1.format("Saturday", 24))

#  包含了2個(gè)命名格式化參數(shù),一個(gè)是{week},另一個(gè)是{degree}
s2 = "Today is {week}, the temperature is {degree} degrees."
#  format方法的第1個(gè)參數(shù)指定了{(lán)degree}的值,第2個(gè)參數(shù)指定了{(lán)week}的值,
#  可以將degree和week調(diào)換,s2.format(week ="Sunday", degree = 22)
#  運(yùn)行結(jié)果:Today is Sunday, the temperature is 22 degrees.
print(s2.format(degree = 22, week ="Sunday"))

# 混合了順序格式化參數(shù)和關(guān)鍵字格式化參數(shù)兩種方式
s3 = "Today is {week}, {},the {} temperature is {degree} degrees."
#  format方法的參數(shù),前面應(yīng)該是按順序傳遞的格式化參數(shù)值,后面是關(guān)鍵字格式化參數(shù)值,順序不能調(diào)換
#  這樣做是錯(cuò)誤的:s3.format(degree = 22, "aaaaa", 12345, week ="Sunday")
#  運(yùn)行結(jié)果:Today is Sunday, aaaaa,the 12345 temperature is 22 degrees.
print(s3.format("aaaaa", 12345, degree = 22, week ="Sunday"))

#  為順序格式化參數(shù)指定了從format方法獲取參數(shù)值的順序,{1}表示從format方法的第2個(gè)參數(shù)取值
#  {0}表示從format方法的第1個(gè)參數(shù)取值
s4 = "Today is {week}, {1},the {0} temperature is {degree} degrees."
# 運(yùn)行結(jié)果:Today is Sunday, 12345,the aaaaa temperature is 22 degrees.
print(s4.format("aaaaa", 12345, degree = 22, week ="Sunday"))

#  定義了一個(gè)列表
fullname = ["Bill", "Gates"]
# {name[1]}取fullname列表中的第2個(gè)值(Gates)
# format方法通過關(guān)鍵字參數(shù),為name名字指定了fullname列表。運(yùn)行結(jié)果:Mr Gates
print("Mr {name[1]}".format(name = fullname))
# 導(dǎo)入math模塊
import math
# 訪問math模塊中的“__name__”變量來獲取模塊的名字,訪問math模塊中的pi變量獲取PI的值
s5 = "The {mod.__name__} module defines the value {mod.pi} for PI"
# format方法為mod關(guān)鍵字參數(shù)指定了math模塊
# 運(yùn)行結(jié)果:The math module defines the value 3.141592653589793 for PI
print(s5.format(mod = math))

程序運(yùn)行結(jié)果如下圖所示。

Python從菜鳥到高手(15):字符串格式化

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI