Python中format_map(mapping)函數(shù)的作用與str.format(**mapping)類似,不過,format_map()函數(shù)中的mapping可以直接使用詞典,而不必再加“**”來解析詞典,在"{}"占位符中可以直接使用鍵名稱,不必使用詞典的變量來訪問。
Python中的format_map()函數(shù)是在3.2版中新增的函數(shù),讀者在使用該函數(shù)時(shí)要注意所使用的Python版本。
關(guān)于Python中format()函數(shù)的使用方法,讀者可以參見以下三篇文章:
(1)Python中使用format()函數(shù)格式化字符串
(2)Python中使用format()函數(shù)對(duì)數(shù)字進(jìn)行格式化
(3)Python中format()函數(shù)中的對(duì)齊與寬度問題
str.format_map(mapping)
str是包含占位符"{}"字符串對(duì)象,mapping是一個(gè)詞典對(duì)象。
該函數(shù)執(zhí)行完后,將會(huì)返回一個(gè)新字符串,新字符串中把str中所有的keys(鍵)用其對(duì)應(yīng)的value(值)來替換。
下面建立一個(gè)詞典,并用詞典作為format_map()函數(shù)的參數(shù),來觀察該函數(shù)的具體使用方法:
dict1 = {"site_name":"武林網(wǎng)VEVB","site_url":"VeVb.com",
"subscription":"優(yōu)雅的代碼"}
str_source = "{site_name}的網(wǎng)址是:{site_url},公眾號(hào)是:{subscription}"
str_result = str_source.format_map(dict1)
print(str_result)
輸出結(jié)果:
武林網(wǎng)VEVB的網(wǎng)址是:VeVb.com,公眾號(hào)是:優(yōu)雅的代碼
在Python 3.8.2中的輸出形式截圖如下:
如果詞典中提供的鍵值對(duì)比實(shí)際需要的多會(huì)是是什么情況呢,下面通過一個(gè)例子來說明這種情況:
dict2 = {"lang1":"Java","lang2":"C#","lang3":"Python"}
print("我當(dāng)前在學(xué){lang2}和{lang3}".format_map(dict2))
輸出結(jié)果如下:
我當(dāng)前在學(xué)C#和Python
從實(shí)際情況看,詞典中的鍵值對(duì)多于使用情況并不影響實(shí)際的輸出,也不會(huì)產(chǎn)生任何異常,其在詞典中搜索鍵名并把對(duì)應(yīng)的值替換鍵名處的值即可,不會(huì)產(chǎn)生任何問題。
如果詞典中未包含使用的鍵會(huì)怎么樣呢?下面這個(gè)例子將告訴你這種情況下的輸出信息:
dict3 = {"lang1":"Java","lang2":"C#","lang3":"Python"}
print("我喜歡{lang4}".format_map(dict3))
輸出結(jié)果如下:
Traceback (most recent call last):
File "D:/PY/format_map.py", line 2, in <module>
print("我喜歡{lang4}".format_map(dict3))
KeyError: 'lang4'
從輸出結(jié)果可以看出,程序產(chǎn)生 KeyError 異常,即詞典dict3中并不包含鍵"lang4"。
也就是說,在正常情況下,詞典中若未定義某個(gè)鍵,而在格式字符串中使用了將會(huì)引發(fā)程序異常。
為了較好地解決上面這個(gè)問題,可以定義一個(gè)類和__missing__函數(shù)來處理:
class DealMissingValue(dict):
def __missing__(self, key):
return None
dict4 ={"lang1":"Java","lang2":"C#","lang3":"Python"}
print("我喜歡{lang4}".format_map(DealMissingValue(dict4)))
輸出結(jié)果
我喜歡None
可以看出,在使用__missing__函數(shù)處理后,可以在未找到對(duì)應(yīng)的鍵值時(shí),按照函數(shù)的返回值,將以None來替代。
在使用詞典作為映射關(guān)系來格式化字符串時(shí),format_map函數(shù)是非常有用的,它不像format()函數(shù)那樣建立詞典的副本來進(jìn)行操作,從某種程度上來講,在使用詞典作為參數(shù)時(shí),其效率要比format()函數(shù)高。
新聞熱點(diǎn)
疑難解答