Python 舊式 printf 風格字串格式化使用說明
由於使用 Python 舊式 printf 風格進行字串格式化可能導致一些問題,因此,建議使用str
型別的format
方法,你可以檢視如何格式化 Python 字串?format,format_map 方法,Formatter 類別介紹一節來了解更多資訊。
Python 舊式 printf 風格字串格式化
Python 舊式的 printf 風格字串格式化,可以完成與 Pythonstr
型別的format
方法類似的效果,其語法格式如下。
format % values
- format 值
format
是需要進行格式化的 Python 字串,字串中包含數個以%
開頭的轉換符,這些轉換符將被values
提供的值代替。- values 值
values
是一個 Python 元組或字典物件,元組中的元素或字典中的鍵值組將代替 Python 字串中的轉換符。如果在format
對應的字串中,僅包含一個轉換符,那麽values
可以是其他型別的物件。如果
values
是 Python 元組,那麽該元組中的元素將依次取代字串中的轉換符,此時元組所包含的元素的個數需要與字串中的轉換符的個數相同,否則會引發例外狀況TypeError: not enough arguments for format string
或TypeError: not all arguments converted during string formatting
。如果values
是 Python 字典,那麽該字典所包含的鍵值組應能夠取代字串中所有的轉換符,否則將引發例外狀況KeyError
。
'%f %s' % (1.23, 4.56)
'1.230000 4.56'
'%(name)s %(age)d' % {'name': 'Jack', 'age': 12, 'passed': True}
'Jack 12'
'%f' % 123
'123.000000'
Python 舊式 printf 風格字串格式化中的轉換符
在使用 Python 舊式 printf 風格對字串進行格式化時,以%
開頭的轉換符將被取代為其他內容,轉換符的格式如下。
%[(key)][sign][width][.precision]type[length]
- key 值
當
values
是一個 Python 字典時,key
為字典某個鍵值組的鍵,該鍵值組的值將取代轉換符。- sign 值
如果
sign
包含0
,那麽在擁有剩余空間的情況下,將自動為數值新增字元0
。如果sign
包含-
(-
會使0
失效),那麽將在可用的空間內進行左對齊。如果sign
包含sign
為+
(-
會使+
或負號-
。如果sign
包含#
,那麽將為整數顯示相關首碼,比如0o
(八進位),0x
或0X
(十六進位),或者強製為浮點數顯示小數點。- width 值
width
表示轉換符占用的最小空間(長度),如果忽略他,則轉換符的空間由其對應的值來決定。如果width
被設定為*
,那麽values
需要是一個 Python 元組,且元組接下來的元素表示轉換符占用的最小空間,而不是轉換符對應的值。- precision 值
precision
表示轉換符的有效位數(數值超出有效位數時將被拾入),當type
為f
,F
,e
或E
時,有效位數是指小數點後的位數(將自動補0
)。當type
為g
,G
時,有效位數是指小數點前後的所有位數(不會自動補0
)。如果轉換符對應的值是 Python 字串,那麽字串的長度會被有效位數限製。如果precision
被設定為*
,那麽values
需要是一個 Python 元組,且元組接下來的元素表示轉換符的有效位數,而不是轉換符對應的值。- type 值
type
用於設定數值或字串的具體呈現方式。- length 值
length
可以被設定為h
,l
或L
,但不會產生任何實際效果。
'%+010d' % 1
'+000000001'
'%-010g' % 1.2
'1.2 '
'%(num)+#x' % {'num': 12}
'+0xc'
'%(num) #o' % {'num': 12}
' 0o14'
'%*d' % (5, 1234)
' 1234'
'%*f' % (5, 1234.56789)
'1234.567890'
'%.5e' % 1.23456789
'1.23457e+00'
'%.5g' % 1.23456789
'1.2346'
'%.*f' % (5, 1.23456789)
'1.23457'
使用 Python 舊式 printf 風格為數值和字串設定具體呈現方式
在使用 Python 舊式 printf 風格對字串進行格式化時,通過指定轉換符中的type
,可以為轉換符對應的數值或字串設定具體的呈現方式,其具體的取值如下。
d
(等價於已取代的u
),i
表示將數值顯示為十進位格式,o
表示將數值顯示為八進位格式,x
表示將數值顯示為十六進位格式,其中字母為小寫,X
同樣表示將數值顯示為十六進位格式,但字母為大寫。
e
表示將數值顯示為科學運算質,此時轉換符中的precision
表示小數點後的位數,如果未指定precision
,則有效位數預設為6
。E
與e
類似,但會采用大寫字母。
f
表示將數值顯示為固定點數,此時轉換符中的precision
表示小數點後的位數,如果未指定precision
,則有效位數預設為6
。F
與f
類似,但會采用大寫字母。
g
表示根據轉換符中的precision
(有效位數為0
會被視為1
)和數值的值來選擇是否使用科學運算質顯示數值,數值末尾無意義的0
和小數點會被省略(除非使用#
),如果未指定precision
,則有效位數預設為6
。G
與g
類似,但會采用大寫字母。
c
表示將數值轉換為對應的 Unicode 字元。
%
表示將轉換符顯示為%
自身,而不是取代為某個值。
s
表示會呼叫 Python 的str
的建構子(建構函式)來格式化轉換符對應的值,r
會呼叫 Python 的repr
函式,a
會呼叫 Python 的ascii
函式。
'%d' % 123.456
'123'
'%e' % 1.2345678
'1.234568e+00'
'%.3f' % 1.2345678
'1.235'
'%.0g' % 12345678.9
'1e+07'
'%.3g' % 12345678.9
'1.23e+07'
'%.10g' % 12.0000000001
'12'
'%#.10g' % 12.0000000001
'12.00000000'
'%c' % 65
'A'
'%d%%' % 10
'10%'
使用 Python 舊式 printf 風格格式化 bytes 或 bytearray 物件表示的位元組串
Python 舊式 printf 風格,除了可以格式化 Python 字串,還可以格式化 Pythonbytes
或bytearray
物件表示的位元組串,他們僅在轉換符的type
的取值中存在一些差異,具體如下。
b
(等價於已取代的s
)表示將values
提供的值轉換為位元組串,該值需要是一個 Pythonbytes
或bytearray
物件,或遵守緩沖協定的物件,或擁有__bytes__
方法的物件。
a
或r
表示將使用運算式repr(obj).encode('ascii','backslashreplace')
來轉換values
提供的值。
b'%b' % bytearray(b'Jack')
b'Jack'
b'%b' % b'Jack'
b'Jack'
b'%a' % 'Jack,你好'
b"'Jack\\uff0c\\u4f60\\u597d'"
bytearray(b'%a') % b'Jack'
bytearray(b"b\'Jack\'")
在下面的範例中,我們定義了一個用於格式化的 Python 類別Data
,該類別定義了方法__bytes__
,使其可用於%b
表示的格式化。
# 一個用於格式化的類別
class Data:
# 定義了 __bytes__ 方法
def __bytes__(self):
return bytes(b'__bytes__')
print(b'%b' % Data())
b'__bytes__'
程式碼
src/zh-hant/data_types/text_types/printf·codebeatme/python·GitHub