字符串format()方法格式化指定的值,并將其插入字符串的占位符內(nèi)。
占位符使用大括號 {} 定義。請在下面的“占位符”部分中了解有關(guān)占位符的更多信息。
format() 方法返回格式化的字符串。
format()方法的語法為:
template.format(p0, p1, ..., k0=v0, k1=v1, ...)
在這里,p0, p1,...分別是位置參數(shù)和k0, k1,...具有值的關(guān)鍵字參數(shù)v0, v1,...。
并且,template是格式代碼與參數(shù)占位符的混合。
format()方法采用任意數(shù)量的參數(shù)。但是,分為兩種類型的參數(shù):
位置參數(shù) -可以使用花括號{index}中的參數(shù)索引訪問的參數(shù)列表
關(guān)鍵字參數(shù) -鍵=值類型的參數(shù)列表,可以使用花括號{key}中的參數(shù)鍵來訪問
format()方法返回格式化的字符串。
format()讀取傳遞給它的參數(shù)的類型,并根據(jù)字符串中定義的格式代碼對其進(jìn)行格式化。
在這里,參數(shù)0是字符串“ Adam”,參數(shù)1是浮點數(shù)230.2346。
注意: 在Python中,參數(shù)列表從0開始。
該字符串"Hello {0}, your balance is {1:9.3f}"是模板字符串。這包含用于格式化的格式代碼。
花括號只是要放置的參數(shù)的占位符。在上面的實例中,{0}是“Adam”的占位符,{1:9.3f}是230.2346的占位符。
由于模板字符串引用format()參數(shù)如{0}和{1},因此這些參數(shù)是位置參數(shù)。它們也可以在沒有數(shù)字的情況下被引用,因為{}和Python在內(nèi)部將它們轉(zhuǎn)換為數(shù)字。
在內(nèi)部,
由于"Adam"是第0 個參數(shù),因此將其放在{0}的位置。由于{0}不包含任何其他格式代碼,因此它不執(zhí)行任何其他操作。
然而,第一個參數(shù)230.2346不是這樣的。在這里,{1:9.3f}將230.2346放在它的位置上,并執(zhí)行9.3f操作。
f指定格式正在處理浮點數(shù)。如果未正確指定,它將發(fā)出錯誤。
“.”之前的部分。(9)指定數(shù)字(230.2346)可以采用的最小寬度/填充。在這種情況下,230.2346至少被分配9個位置,包括“.”。
如果未指定對齊選項,則將其對齊到其余空格的右側(cè)。(對于字符串,它向左對齊。)
“.”之后的部分。(3)將小數(shù)部分(2346)截斷為給定的數(shù)字。在這種情況下,3346后將截斷2346。
剩余數(shù)字(46)會四舍五入,輸出235。
我們從上面使用了相同的示例來展示關(guān)鍵字和位置參數(shù)之間的區(qū)別。
在這里,我們不僅使用參數(shù),還使用了鍵值作為參數(shù)。即name="Adam"和blc=230.2346。
由于這些參數(shù)是由它們的鍵作為{name}和{blc:9.3f}引用的,因此它們被稱為關(guān)鍵字或命名參數(shù)。
在內(nèi)部,
占位符{name}替換為name的值-“ Adam”。 由于它不包含任何其他格式代碼,因此放置了“ Adam”。
對于參數(shù)blc = 230.2346,占位符{blc:9.3f}將替換為值230.2346。但是在替換它之前,像前面的示例一樣,它對其執(zhí)行9.3f操作。
輸出230.235。小數(shù)部分在3位后被截斷,其余數(shù)字四舍五入。同樣,總寬度分配為9,在左側(cè)留兩個空格。
format()方法允許使用簡單的占位符進(jìn)行格式化。
# 默認(rèn)參數(shù) print("Hello {}, your balance is {}.".format("Adam", 230.2346)) # 位置參數(shù) print("Hello {0}, your balance is {1}.".format("Adam", 230.2346)) # 關(guān)鍵詞參數(shù) print("Hello {name}, your balance is {blc}.".format(name="Adam", blc=230.2346)) # 混合參數(shù) print("Hello {0}, your balance is {blc}.".format("Adam", blc=230.2346))
運(yùn)行該程序時,所有輸出將相同:
Hello Adam, your balance is 230.2346. Hello Adam, your balance is 230.2346. Hello Adam, your balance is 230.2346. Hello Adam, your balance is 230.2346.
注意:對于混合參數(shù),關(guān)鍵字參數(shù)必須始終跟隨位置參數(shù)。
您可以使用下面給出的格式說明符設(shè)置數(shù)字格式:
類型 | 含義 |
---|---|
d | 小數(shù)整數(shù) |
c | 對應(yīng)的Unicode字符 |
b | 二進(jìn)制格式 |
o | 八進(jìn)制格式 |
x | 十六進(jìn)制格式(小寫) |
X | 十六進(jìn)制格式(大寫) |
n | 與“ d”相同。除了使用數(shù)字分隔符的當(dāng)前語言環(huán)境設(shè)置 |
e | 指數(shù)表示法。(小寫字母e) |
E | 指數(shù)符號(大寫E) |
f | 顯示定點編號(默認(rèn)值:6) |
F | 與“ f”相同。除了將“ inf”顯示為“ INF”和“ nan”顯示為“ NAN” |
g | 通用格式。將數(shù)字四舍五入為p個有效數(shù)字。(默認(rèn)精度:6) |
G | 與“ g”相同。如果數(shù)量很大,則除外切換到“ E”。 |
% | 百分比。乘以100并以%結(jié)尾。 |
# 整數(shù)參數(shù) print("數(shù)字:{:d}".format(123)) # 浮點參數(shù) print("浮點數(shù):{:f}".format(123.4567898)) # 八進(jìn)制,二進(jìn)制和十六進(jìn)制格式 print("bin: {0:b}, oct: {0:o}, hex: {0:x}".format(12))
當(dāng)您運(yùn)行該程序時,輸出將是:
數(shù)字: 123 浮點數(shù):123.456790 bin: 1100, oct: 14, hex: c
# 最小寬度的整數(shù) print("{:5d}".format(12)) # 寬度對于比填充更長的數(shù)字不起作用 print("{:2d}".format(1234)) # 浮點數(shù)的填充 print("{:8.3f}".format(12.2346)) # 最小寬度為0的整數(shù) print("{:05d}".format(12)) # 填充用0填充的浮點數(shù) print("{:08.3f}".format(12.2346))
當(dāng)您運(yùn)行該程序時,輸出將是:
121234 12.235000120012.235
這里,
在第一個語句中,{:5d}采用整數(shù)參數(shù)并指定最小寬度5。由于未指定對齊方式,因此它向右對齊。
在第二個語句中,您可以看到寬度(2)小于數(shù)字(1234),因此它不需要在左邊留任何空格,也不會截斷該數(shù)字。
與整數(shù)不同,浮點數(shù)具有整數(shù)和小數(shù)部分。 并且,定義為該數(shù)字的最小寬度是整個包括“.”的兩個部分。
在第三條語句中,{:8.3f}將小數(shù)部分截斷為3位,四舍五入最后兩位數(shù)字。而且,該數(shù)字現(xiàn)在為12.235,整個寬度為8,在左側(cè)保留2個位置。
如果要用零填充其余位置,請在格式說明符之前放置零。它適用于整數(shù)和浮點數(shù):{:05d}和{:08.3f}。
# 顯示+號 print("{:+f} {:+f}".format(12.23, -12.23)) # 僅顯示-號 print("{:-f} {:-f}".format(12.23, -12.23)) # 顯示+號的空格 print("{: f} {: f}".format(12.23, -12.23))
當(dāng)您運(yùn)行該程序時,輸出將是:
+12.230000 -12.230000 12.230000 -12.230000 12.230000 -12.230000
將數(shù)字指定一定的寬度時,運(yùn)算符<,和用于對齊。^>=
類型 | 含義 |
---|---|
< | 左對齊剩余空間 |
^ | 中心對齊剩余空間 |
> | 與剩余空間右對齊 |
= | 將帶符號(+)(-)強(qiáng)制到最左邊 |
# 右對齊的整數(shù) print("{:5d}".format(12)) # 具有中心對齊的浮點數(shù) print("{:^10.3f}".format(12.2346)) # 整數(shù)左對齊,用0填充 print("{:<05d}".format(12)) # 中心對齊的浮點數(shù) print("{:=8.3f}".format(-12.2346))
當(dāng)您運(yùn)行該程序時,輸出將是:
12 12.235 12000- 12.235
注意:對于第三個示例,左對齊用零填充整數(shù)可能會導(dǎo)致問題,該示例返回12000而不是12。
作為數(shù)字,可以使用format()以類似的方式格式化字符串。
# 左對齊的字符串填充 print("{:5}".format("cat")) # 右對齊的字符串填充 print("{:>5}".format("cat")) #中心對齊的字符串填充 print("{:^5}".format("cat")) # 中心對齊的字符串填充 # 和 '*' 填充字符 print("{:*^5}".format("cat"))
當(dāng)您運(yùn)行該程序時,輸出將是:
cat cat cat *cat*
# 將字符串截斷為3個字母 print("{:.3}".format("caterpillar")) # 將字符串截斷為3個字母 # 和 填充 print("{:5.3}".format("caterpillar")) # 將字符串截斷為3個字母, # 填充和中心對齊 print("{:^5.3}".format("caterpillar"))
當(dāng)您運(yùn)行該程序時,輸出將是:
catcat cat
Python內(nèi)部getattr()以“ .age”形式用于類成員。并且,它使用__getitem__()查找“[index]”形式的字典成員。
# define Person class class Person: age = 23 name = "Adam" # 格式化age print("{p.name}'年齡是 : {p.age}".format(p=Person()))
當(dāng)您運(yùn)行該程序時,輸出將是:
Adam's 年齡是 : 23
在這里,Person對象作為關(guān)鍵字參數(shù)p傳遞。
在模板字符串中,分別使用.name和.age訪問Person的name和age。
# 定義Person字典 person = {'age': 23, 'name': 'Adam'} # 格式化age print("{p[name]}'s age is: {p[age]}".format(p=person))
當(dāng)您運(yùn)行該程序時,輸出將是:
Adam's age is: 23
與class類似,person字典作為關(guān)鍵字參數(shù)p傳遞。
在模板字符串中,分別使用[name]和[age]訪問人員的name和age。
有一種更簡單的方法可以使用Python格式化字典str.format(**mapping)。
# 定義Person字典 person = {'age': 23, 'name': 'Adam'} # 格式化age print("{name}'s age is: {age}".format(**person))
** 是格式參數(shù)(最小字段寬度)。
您還可以動態(tài)傳遞格式代碼,例如精度,對齊,填充字符作為位置或關(guān)鍵字參數(shù)。
# 動態(tài)字符串格式模板 string = "{:{fill}{align}{width}}" # 將格式代碼作為參數(shù)傳遞 print(string.format('cat', fill='*', align='^', width=5)) # 動態(tài)浮點格式模板 num = "{:{align}{width}.{precision}f}" # 將格式代碼作為參數(shù)傳遞 print(num.format(123.236, align='<', width=8, precision=2))
運(yùn)行該程序時,輸出為:
**cat**123.24
這里,
在第一個示例中," cat"是要格式化的位置參數(shù)。同樣,fill='*',align='^'和width=5是關(guān)鍵字參數(shù)。
在模板字符串中,這些關(guān)鍵字參數(shù)不是作為要打印的普通字符串而是作為實際格式代碼檢索的fill, align 和 width。
參數(shù)將替換相應(yīng)的已命名占位符,并且字符串“ cat”將相應(yīng)地設(shè)置格式。
同樣,在第二個示例中,123.236是位置參數(shù),并且align,width和precision作為格式代碼傳遞到模板字符串。
format()還支持特定于類型的格式設(shè)置選項,例如日期時間格式和復(fù)數(shù)格式。
format()內(nèi)部調(diào)用__format__()從datetime,而format()訪問復(fù)數(shù)的屬性。
您可以輕松地重寫任何對象的__format __()方法以進(jìn)行自定義格式設(shè)置。
import datetime # 日期時間格式 date = datetime.datetime.now() print("當(dāng)前時間: {:%Y/%m/%d %H:%M:%S}".format(date)) # 復(fù)數(shù)格式 complexNumber = 1+2j print("Real part: {0.real} and Imaginary part: {0.imag}".format(complexNumber)) # 自定義 __format__()方法 class Person: def __format__(self, format): if(format == 'age'): return '23' return 'None' print("Adam's 年齡是: {:age}".format(Person()))
運(yùn)行該程序時,輸出為:
當(dāng)前時間: 2020/04/17 14:33:02 Real part: 1.0 and Imaginary part: 2.0 Adam's 年齡是: 23
這里,
對于datetime:
當(dāng)前日期時間作為位置參數(shù)傳遞給format()方法。
并且,在內(nèi)部使用__format __()方法,format()可訪問年,月,日,時,分和秒。
對于復(fù)數(shù):
1 + 2j在內(nèi)部轉(zhuǎn)換為ComplexNumber對象。
然后訪問其屬性real和imag,數(shù)字被格式化。
重寫__format __():
與datetime一樣,您可以重寫自己的__format __()方法以進(jìn)行自定義格式設(shè)置,當(dāng)以{:age}訪問時,該格式將返回年齡
您也可以使用對象 __str__() 和 __repr__() 功能,通過使用format()的簡寫表示法。
像__format __()一樣,您可以輕松重寫對象的__str __()和__repr_()方法。
# __str__() 和 __repr__() 簡寫為 !r 和 !s print("Quotes: {0!r}, Without Quotes: {0!s}".format("cat")) # __str__() 和 __repr__() 實現(xiàn)類 class Person: def __str__(self): return "STR" def __repr__(self): return "REPR" print("repr: {p!r}, str: {p!s}".format(p=Person()))
運(yùn)行該程序時,輸出為:
Quotes: 'cat', Without Quotes: cat repr: REPR, str: STR