URLhttps://learnscript.net/zh-hant/python/data-types/text-types/printf/
    複製連結移至說明  範例

    Python 舊式 printf 風格的字串格式化使用說明

    閱讀 7:27·字數 2237·發佈 
    Youtube 頻道
    訂閱 375

    由於使用 Python 舊式 printf 風格進行字串格式化可能導致一些問題,因此,建議使用str型別的format方法,你可以檢視如何格式化 Python 字串?format,format_map 方法,Formatter 類別介紹一節來了解更多資訊。

    舊式 printf 風格的字串格式化

    Python 舊式的 printf 風格字串格式化,可以完成與str型別的format方法類似的效果,其語法格式如下。

    format % values

    format 值

    format是需要進行格式化的字串,字串中包含數個以%開頭的轉換符,這些轉換符將被values提供的值代替。

    values 值

    values是一個元組或字典物件,元組中的元素或字典中的鍵值組將代替字串中的轉換符。如果在format對應的字串中,僅包含一個轉換符,那麽values可以是其他型別的物件。

    如果values是元組,那麽該元組中的元素將依次取代字串中的轉換符,此時元組所包含的元素的個數需要與字串中的轉換符的個數相同,否則會引發例外狀況TypeError: not enough arguments for format stringTypeError: not all arguments converted during string formatting。如果values是字典,那麽該字典所包含的鍵值組應能夠取代字串中所有的轉換符,否則將引發例外狀況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'

    舊式 printf 風格中的轉換符

    在使用舊式 printf 風格對字串進行格式化時,以%開頭的轉換符將被取代為其他內容,轉換符的格式如下。

    %[(key)][sign][width][.precision]type[length]

    key 值

    values是一個字典時,key為字典某個鍵值組的鍵,該鍵值組的值將取代轉換符。

    sign 值

    如果sign包含0,那麽在擁有剩余空間的情況下,將自動為數值新增字元0。如果sign包含--會使0失效),那麽將在可用的空間內進行左對齊。如果sign包含 (空格),那麽將在正數前新增一個 (空格)。如果sign+-會使 失效),那麽將在數值前新增正號+或負號-。如果sign包含#,那麽將為整數顯示相關前綴,比如0o(八進位),0x0X(十六進位),或者強製為浮點數顯示小數點。

    width 值

    width表示轉換符占用的最小空間(長度),如果忽略他,則轉換符的空間由其對應的值來決定。如果width被設定為*,那麽values需要是一個元組,且元組接下來的元素表示轉換符占用的最小空間,而不是轉換符對應的值。

    precision 值

    precision表示轉換符的精確度(數值超出精確度時將被拾入),當typefFeE時,精確度是指小數點後的位數(將自動補0)。當typegG時,精確度是指小數點前後的所有位數(不會自動補0)。如果轉換符對應的值是字串,那麽字串的長度會被精確度限製。如果precision被設定為*,那麽values需要是一個元組,且元組接下來的元素表示轉換符的精確度,而不是轉換符對應的值。

    type 值

    type用於設定數值或字串的具體呈現方式。

    length 值

    length可以被設定為hlL,但不會產生任何實際效果。

    '%+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'

    為數值和字串設定具體呈現方式

    在使用舊式 printf 風格對字串進行格式化時,通過指定轉換符中的type,可以為轉換符對應的數值或字串設定具體的呈現方式,其具體的取值如下。

    d(等價於已取代的u),i表示將數值顯示為十進位格式,o表示將數值顯示為八進位格式,x表示將數值顯示為十六進位格式,其中字母為小寫,X同樣表示將數值顯示為十六進位格式,但字母為大寫。

    e表示將數值顯示為科學計數法,此時轉換符中的precision表示小數點後的位數,如果未指定precision,則精確度預設為6Ee類似,但會采用大寫字母。

    f表示將數值顯示為固定點數,此時轉換符中的precision表示小數點後的位數,如果未指定precision,則精確度預設為6Ff類似,但會采用大寫字母。

    g表示根據轉換符中的precision(精確度為0會被視為1)和數值的值來選擇是否使用科學計數法顯示數值,數值末尾無意義的0和小數點會被省略(除非使用#),如果未指定precision,則精確度預設為6Gg類似,但會采用大寫字母。

    c表示將數值轉換為對應的 Unicode 字元。

    %表示將轉換符顯示為%自身,而不是取代為某個值。

    s表示會呼叫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%'

    格式化 bytes 或 bytearray 物件表示的位元組串

    Python 舊式 printf 風格,除了可以格式化字串,還可以格式化bytesbytearray物件表示的位元組串,他們僅在轉換符的type的取值中存在一些差異,具體如下。

    b(等價於已取代的s)表示將values提供的值轉換為位元組串,該值需要是一個bytesbytearray物件,或遵守緩沖協定的物件,或擁有__bytes__方法的物件。

    ar表示將使用運算式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\'")

    在下面的範例中,我們定義了一個用於格式化的類別Data,該類別定義了方法__bytes__,使其可用於%b表示的格式化。

    custom.py
    # 一個用於格式化的類別
    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