Python格式化字符串知多少
字符串格式化相當于字符串模板。也就是說,如果一個字符串有一部分是固定的,而另一部分是動態(tài)變化的,那么就可以將固定的部分做成模板,然后那些動態(tài)變化的部分使用字符串格式化操作符(%) 替換。
如一句問候語:“Hello 李寧”,其中“Hello”是固定的,但“李寧”可能變成任何一個人的名字,如“喬布斯”,所以在這個字符串中,“Hello”是固定的部分,而“李寧”是動態(tài)變化的部分,因此,需要用“%”操作符替換“李寧”,這樣就形成了一個模板。
Hello %s
上面的代碼中,“%”后面的s是什么呢?其實字符串格式化操作符后面需要跟著動態(tài)值的數(shù)據(jù)類型,以及更細節(jié)的格式(如對于浮點數(shù)來說,小數(shù)點后要保留幾位),這里的“%s”表示動態(tài)部分要被替換成字符串類型的值。
如果在字符串模板中有多個要被替換的部分,需要按順序用“%”表示,然后在格式化字符串時,傳入的值也要符合這個順序。下面的代碼演示了格式化字符串的基本用法。
formatStr = "Hello %s. Today is %s, Are there any activities today?" # 初始化字符串格式化參數(shù)值,此處必須使用元組,不能使用列表 values = ('Mike', 'Wednesday') # 格式化字符串 print(formatStr % values)運行結(jié)果如下圖所示:
從上面的代碼可以看出,不僅在為字符串模板指定格式化參數(shù)時要使用百分號(%),在格式化字符串時,也要像取模一樣使用“%”操作符。還有就是指定字符串格式化參數(shù)值要使用元組,在這里不能使用列表。
1. 模板字符串
在string模塊中提供了一個用于格式化字符串的Template類,該類的功能是用同一個值替換所有相同的格式化參數(shù)。Template類的格式化參數(shù)用美元符號($)開頭,后面跟著格式化參數(shù)名稱,相當于變量名。在格式化時,需要使用Template類的substitute方法,該方法用于指定格式化參數(shù)對應(yīng)的值。
''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學(xué)習(xí)交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學(xué)習(xí)教程和PDF電子書! ''' from string import Template template = Template("$s $s $s ") template.substitute(s = "Hello")在上面的代碼中,通過Template類的構(gòu)造方法傳入了一個格式化字符串,在這個格式化字符串中包含了3個“$s”,然后調(diào)用了substitute方法格式化這個字符串,該方法指定了s參數(shù)值為“Hello”,最后的替換結(jié)果是“Hello Hello Hello”,也就是說,在格式化字符串中,有多少個“$s”,就替換多少個“$s”。
下面的代碼完整地演示了如何使用Template類格式化字符串。
# 引用string模塊中的Template類 from string import Template template1 = Template("$s是我最喜歡的編程語言, $s非常容易學(xué)習(xí),而且功能強大") # 指定格式化參數(shù)s的值是Python print(template1.substitute(s='Python')) # 當格式化參數(shù)是一個字符串的一部分時,為了和字符串的其他部分區(qū)分開, # 需要用一對大括號將格式化參數(shù)變量括起來 template2 = Template("${s}stitute") print(template2.substitute(s='sub'))template3 = Template("$dollar$$相當于多少$pounds") # 替換兩個格式化參數(shù)變量 print(template3.substitute(dollar=20,pounds='英磅'))template4 = Template("$dollar$$相當于多少$pounds") data = {} data['dollar'] = 100 data['pounds'] = '英磅' # 使用字典指定格式化參數(shù)值 print(template4.substitute(data))運行結(jié)果如下圖所示:
2. 字符串的format方法
字符串本身也有一個format方法用于格式化當前的字符串。這個format方法和前面講的格式化操作符(%)不太一樣。字符串格式化參數(shù)并不是用百分號(%)表示,而是用一對大括號({}),而且支持按順序指定格式化參數(shù)值和關(guān)鍵字格式化參數(shù)。
例如,下面的代碼通過format方法按順序為格式化字符串指定了參數(shù)值。
print("{} {} {}".format(1,2,3)) # 運行結(jié)果:1 2 3我們可以看到,上面的代碼在字符串中指定了3對空的大括號,這代表3個格式化參數(shù),不需要指定數(shù)據(jù)類型,可以向其傳遞Python語言支持的任何值。通過format方法傳入3個值(1,2,3),這3個值會按順序替換格式化字符串中的3對空的大括號。
命名格式化參數(shù)是指在一對大括號中指定一個名稱,然后調(diào)用format方法時也要指定這個名稱。
print("{a} {b} {c}".format(a = 1,c = 2,b = 3)) # 運行結(jié)果:1 3 2上面的代碼在3對大括號中分別添加了“a”、“b”、“c”。通過format方法指定了這3個關(guān)鍵字參數(shù)的值。我們可以看到,并沒有按順序指定關(guān)鍵字參數(shù)的值。這也是使用關(guān)鍵字參數(shù)的好處,只要名字正確,fomat參數(shù)的順序可以任意指定。
當然,順序方式和關(guān)鍵字參數(shù)方式可以混合使用,而且還可以指定順序方式中格式化參數(shù)從format方法提取參數(shù)值的順序,甚至可以取format方法參數(shù)值的一部分。
3. 更進一步控制字符串格式化參數(shù)
format方法的功能遠不止這些,在一對大括號中添加一些字符串格式化類型符,可以對格式化字符串進行更多的控制。例如,下面的代碼會將一個字符串類型的格式化參數(shù)值按原樣輸出、通過repr函數(shù)輸出,以及輸出其Unicode編碼。
print("{first!s} {first!r} {first!a}".format(first = "中"))執(zhí)行這行代碼,會輸出如下的結(jié)果。
中 '中' '\u4e2d'除此之外,format方法還支持很多其他的控制符,例如,可以將整數(shù)按浮點數(shù)輸出,也可以將十進制數(shù)按二進制、八進制、十六進制格式輸出。下面的代碼為我們演示了如何使用這些控制符格式化字符串。
''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學(xué)習(xí)交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學(xué)習(xí)教程和PDF電子書! ''' # 運行結(jié)果:原樣輸出:中 調(diào)用repr函數(shù):'中' 輸出Unicode編碼:'\u4e2d' print("原樣輸出:{first!s} 調(diào)用repr函數(shù):{first!r} 輸出Unicode編碼:{first!a}".format(first = "中")) # 將21按浮點數(shù)輸出,運行結(jié)果:整數(shù):21 浮點數(shù):21.000000 print("整數(shù):{num} 浮點數(shù):{num:f}".format(num = 21)) # 將56按十進制、二進制、八進制和十六進制格式輸出 # 運行結(jié)果:十進制:56 二進制:111000 八進制:70 十六進制:38 print("十進制:{num} 二進制:{num:b} 八進制:{num:o} 十六進制:{num:x}".format(num = 56)) # 將533按科學(xué)計數(shù)法格式輸出,運行結(jié)果:科學(xué)計數(shù)法:5.330000e+02 print("科學(xué)計數(shù)法:{num:e}".format(num = 533)) # 將0.56按百分比格式輸出,運行結(jié)果:百分比:56.000000% print("百分比:{num:%}".format(num = 0.56))運行結(jié)果如下圖所示。
4. 字段寬度、精度和千位分隔符
在前面講到使用format方法可以讓待格式化的值左側(cè)或右側(cè)補空格,不過這種填空格的效果看上去并不美觀,而且一般的用戶也分不清前面或后面到底有多少個空格。所以最合適的方式就是在值的前面或后面補0。例如,如果寫一本書,章節(jié)超過了10章,為了讓每一章的序號長度都一樣,可以使用01、02、03、…、11、12這樣的格式。
對于10以后的章節(jié),按原樣輸出即可。不過對于10以下的章節(jié),就需要在數(shù)字前面補一個0了。要實現(xiàn)這個功能,就需要使用{chapter:02.0f}來格式化章節(jié)序號。其中chapter是格式化參數(shù),第一個0表示如果位數(shù)不足;前面要補0,2表示整數(shù)部分是2位數(shù)字;第2個0表示小數(shù)部分被忽略;f表示以浮點數(shù)形式格式化chapter指定的值。
# 運行結(jié)果:第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))不管是哪種方式對齊(左、中、右),在很多情況下,值的總長度要比指定寬度小,在默認情況下,不足的位要補空格,但我們也可以通過在“<”、“^”和“>”前面加符號,讓這些不足的位用這些符號替代空格補齊。
''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學(xué)習(xí)交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學(xué)習(xí)教程和PDF電子書! ''' # “井號”在寬度為20的區(qū)域內(nèi)中心對齊,并左右兩側(cè)添加若干個井號(#),兩側(cè)各添加8個井號 # 運行結(jié)果:######## 井號 ######## print("{:#^20}".format(" 井號 "))對于需要在前面顯示負號的數(shù)值,如-3、-5。可以通過在等號(=)前面加上字符,以便在負號和數(shù)值之間加上特殊符號。
# 在5.43和負號(-)之間顯示“^”,運行結(jié)果:-^^^^^5.43 print("{0:^=10.2f}".format(-5.43))最后讓我們來討論一下進制轉(zhuǎn)換。如果將10進制分別轉(zhuǎn)換為二進制、八進制和十六進制的數(shù),需要分別使用“b”、“o”和“x”類型符。如下面的代碼將43轉(zhuǎn)換為二進制的數(shù)。
# 運行結(jié)果:101011 print("{:b}".format(43))5. f字符串
在新版的Python中,提供了一種f字符串。也就是在字符串之前加一個f,這樣在字符串中就可以直接使用外部變量了,只不過變量要使用一對大括號括起來。代碼如下:
name = 'Bill' age = 30print(f'姓名:{name}, 年齡:{age}')總結(jié)
以上是生活随笔為你收集整理的Python格式化字符串知多少的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中常见的一些题目汇总
- 下一篇: 5分钟了解 Python 中的super