Python中format()函數的作用是對字符串執行格式化操作。
format()函數的語法形式如下所示:
str.format(*args, **kwargs)
str是待格式化的字符串,一般這個字符串中應包含一對英文半角的花括號{ },用于指定位置索引、參數名或其它格式符,花括號處的內容將被替換成位置索引或參數名及其它格式符指定的值,這些值來自format()函數的參數指定的值序列。
args參數用于給定值序列,用于替換str中{}里位置索引處的值。
kwargs參數以關鍵字參數(即keyargs = value)的形式給出格式字符串中的值。
下面先給出一個簡單的例子來看看該函數的基本使用方法:
weburl = "http://www.companysz.com"
webname = "武林網VEVB"
webinfo = "{0}的網址是:{1}".format(webname, weburl)
print(webinfo)
輸出結果如下:
武林網VEVB的網址是:http://www.companysz.com
在Python3.8.2中的代碼及輸出情況如下圖所示:
在 這個例子中,{0}和{1}分別用來指定參數列表中的webname和weburl來替換{0}和{1}處的內容,這從輸出結果也可以看出來。
下面從字符串和參數等角度分別給出若干例子來探討format()函數在實際中使用的情形。
print("今天的值日生是{0}".format("王濤"))
print("今天的一對新人是{0}和{1}".format("韓梅梅","李明"))
print("我們學習的編程語言有:{}、{}".format("Python","Java"))
print("請{1},{2},{0}來辦公室一趟".format("A","B","C"))
輸出結果如下:
今天的值日生是王濤
今天的一對新人是韓梅梅和李明
我們學習的編程語言有:Python、Java
請B,C,A來辦公室一趟
從上面的例子可以看出,在指定索引的替換串中,替換位置的值將按照索引使用參數對應的值來完成替換。
如果在替換字符串中未指定索引值,其按照{}出現的順序來編索引,即按照0,1,...,n來編索引。
替換字符串中的索引沒有先后順序之分,如上面最后一個例子就演示了這一點。
參數的個數可以多于替換字符串中需要的值,但在未提供索引時,參數給定的值個數不能少于需替換的位置數量。
下面這個例子可以得出正確結果:
print("我正在學習{1}".format("Java", "Python", "C#"))
輸出結果為:
我正在學習Python
但下面這種情況不允許
print("我學習的語言有{},{}和{}".format("Java", "Python"))
由于沒給定索引,默認其編號分別為0,1 和 2,而參數在兩個的情況下最大編號為1,這就超出了索引范圍而引發IndexError錯誤:
Traceback (most recent call last):
File "D:/01Lesson/PY/pythonformat.py", line 12, in <module>
print("我學習的語言有{},{}和{}".format("Java", "Python"))
IndexError: Replacement index 2 out of range for positional args tuple
當然下面這種指定索引的情況是可以的
print("我一直在學習{0},{0} ......".format("Python"))
輸出結果:
我一直在學習Python,Python ......
在format()函數中也可以使用關鍵詞參數來格式化字符串。即在format()函數的參數列表中,使用給參數賦值的方法來定義值列表,并在格式化字符串中使用參數名來傳遞值。其形式為:
"{var1}{var2}...".format(var1 = value1, var2 = value2, ...)
下面給出一個具體的例子:
formatedstr = "{webname}的網址是:{weburl}".format(webname = '武林網VEVB',
weburl = 'http://www.companysz.com')
print(formatedstr)
輸出結果如下:
武林網VEVB的網址是:http://www.companysz.com
在Python中,可以把字典數據作為參數傳遞給format()函數,用于格式化字符串,其形式如下:
"{key}".format(**dict)
將被格式化的字符串{}中的key即是字典中的key,format函數將會把dict中key對應的值替代{}位置中的內容。
dict即使字典變量或字典數據。
為了使用key對應的值來替代key對應的值,函數在執行時需要解包字典中的數據,Python中的"**"操作符就是用來解包字典中的數據的。
換句話說:**就是把字典型數據解析成關鍵字型參數,如字典{"arg1":"v1", "arg2":"v2"}作為參數傳遞給format函數的話,其將該字典解析為:arg1="v1",arg2="v2"這樣的關鍵字參數。
下面舉一個例子來說明其具體用法:
dict1 = {"lang1":"Python", "lang2":"Java", "lang3":"R"}
popularlang = "我喜歡{lang1}和{lang3}".format(**dict1)
print(popularlang)
輸出結果如下:
我喜歡Python和R
上面的函數調用相當于:
popularlang = "我喜歡{lang1}和{lang3}".format(lang1 = "Python", lang2 = "Java", lang3 = "R")
元組或列表型數據也可以作為format()函數的參數,其語法格式如下:
"{index1}{index2}...".format(*tupleorlist)
上面語法中index1和index2表示引用元組或列表的位置索引,即使用元組或列表中該位置處的值來替換{}處的內容。
tupleorlist即是傳遞的元組或列表數據或變量。
“*”操作符用于解包元組或列表中的數據,也就是說*在這里把元組或列表這樣的序列數據解析成位置參數。
下面舉例子說明:
#元組作為參數
t1 = ("Python", "Java", "SPSS")
print("我正在學習{0}和{2}".format(*t1))
print("小明正在學習{2}和{0}".format(*t1))
#列表作為參數
list1 = ["HTML", "CSS", "JavaScript"]
print("{0}非常簡單".format(*list1))
print("{2},{1}和{0}都很簡單。".format(*list1))
輸出結果如下:
我正在學習Python和SPSS
小明正在學習SPSS和Python
HTML非常簡單
JavaScript,CSS和HTML都很簡單。
上面使用*調用的元組參數相當于:
print("我正在學習{0}和{2}".format("Python", "Java", "SPSS"))
對于元組或列表這種序列值也可以使用下面的格式實現字符串的格式化:
#元組
t1 = ("Python", "Java", "SPSS")
print("我在學習{0[0]}和{0[2]}".format(t1))
#列表
list1 = ["Python", "Java", "SPSS"]
list2 = ["HTML", "CSS", "JavaScript"]
print("我在學習{0[1]}和{1[2]}".format(list1, list2))
#混用
list1 = ["Python", "Java", "SPSS"]
print("我學過{0[2]},{1}和{2}".format(list1,"C++", "sqlite"))
輸出結果如下:
我在學習Python和SPSS
我在學習Java和JavaScript
我學過SPSS,C++和sqlite
上面格式化字符串中使用了兩個索引,因為format()函數允許傳遞多個參數,當參數為多個且為序列值時,第一個索引用于指定參數所在的位置索引,第2個用于指定序列值中的元素位置,上面用三個例子來演示了使用方法來揭示其中的奧秘,讀者可以自己分析一下。
對象類型也可以作為format函數的參數,使用成員運算符“.”來訪問對象中的數據。
###對象作為參數
#首先定義一個類
class Student:
sid = ''
sname = ''
age = 20
def __init__(self, sid):
self.sid = sid
#定義一個類的對象
stu1 = Student("001")
stu1.sname = "王濤"
stu1.age = 22
print("{0.sname}的學號是{0.sid},年齡是{0.age}".format(stu1))
print("{stu.sname}的學號是{stu.sid},年齡是{stu.age}".format(stu = stu1))
上面的程序輸出結果如下:
王濤的學號是001,年齡是22
王濤的學號是001,年齡是22
上面程序中給出了兩種引用對象中屬性的方法:第一種使用0表示參數的位置索引,第二種使用了關鍵字參數的形式。
被格式化字符串{}中的內容為空時,則按照其出現的順序默認使用0,1,2...來表明其引用的參數索引,并用參數對應的值來替換;
被格式化字符串{}中為數值索引時,將使用參數列表中對應位置的值來替換;
被格式化字符串{}中為關鍵字名稱時,則使用參數列表中對應的關鍵字名稱的值來替換;
函數參數為元組、列表等這樣的值時,在函數調用時,其參數要使用str.format(*t)這種格式;
函數參數為詞典這樣的值時,在函數調用時,其參數要使用str.format(**dict)這種格式。
這篇文章僅介紹了被格式化字符串和參數之間的對應問題,沒有涉及到字符串的其他格式,如輸出數字的格式,字符串對齊等格式,本站將在今后的文章中作進一步的介紹。
新聞熱點
疑難解答