Python(8)--字串格式化
字串:
所有標準序列操作(索引、切片、乘法、成員資格檢查、長度、最小值和最大值)都適用於字串,但別忘了字串是不可變的,因此所有的元素賦值和切片賦值都是非法的。
字串格式化:format方法
每個值都被插入字串中,用來替用花括號括起來的替換欄位
替換欄位由下面的部分組成:
欄位名:索引或者識別符號,指出要設定哪個值的格式,並使用結果來替換該欄位;還可以指定值的特殊部分,如列表內的元素
轉換標誌:跟在感嘆號後面的單個字元。支援的字元包括:r(表示repr)、s(表示str)、a(表示ascii)。如果指定了轉換標誌,就不會用物件本身的格式,而是用指定函式將物件轉換成字串,然後進行格式設定
格式說明符:跟早冒號後面的表示式。讓我們能詳細的指定最終的格式,包括:格式型別、欄位寬度、數的精度、如何顯示符號、千位分隔符、各種對齊和填充方式
替換欄位名:
向format提供要設定格式的未命名引數,並在格式字串中使用,會按順序將欄位和引數配對
可以給引數指定名稱,該引數會對應在格式字元中的欄位
>>> "{foo}{}{bar}{}".format(1, 3, bar="a", foo=5) '51a3'
可以通過索引來指定要在哪個欄位中使用相應的未命名引數,這樣就可以不按順序使用未命名引數
>>> "{foo}{1}{bar}{0}".format(1, 3, bar="a", foo=5) '53a1'
可以使用提供值中的一部分部分
>>> f = ["hello", "world"] >>> "hi {foo[1]}".format(foo=f) 'hi world'
可以使用句點來使用匯入模組中的方法、屬性、變數、函式(__name__獲取指定模組的名稱)
>>> import math >>> tmp = "The {mod.__name__} module defines the value {mod.pi} for π" >>> tmp.format( mod=math) 'The math module defines the value 3.141592653589793 for π'
基本轉換:
使用轉換標誌設定值的格式
>>> print("{pi!s} {pi!r} {pi!a}".format(pi="π")) π 'π' '\u03c0' # s:str,將值建立為人易讀的普通字串 # r:repr,將值建立成給定的Python表示式 # a:ascii,建立ascii字元的表示
將要轉換的值視為哪種型別,比如一個整數,但是要作為小數處理,就在冒號後面加上:f。要當做二進位制處理就加上:b
>>> "This number is {num}".format(num=33) 'This number is 33' >>> "This number is {num:f}".format(num=33) 'This number is 33.000000' >>> "This number is {num:b}".format(num=33) 'This number is 100001'
在冒號(格式說明符)後面使用型別說明符,型別說明符有:
b # 將整數表示為二進位制數 c # 將整數解讀為Unicode碼點 d #將整數視為十進位制數進行處理,這是整數預設使用的說明符 e # 使用科學計數法來表示小數(e表示指數) E # 與e相同,但是使用E來表示指數 f # 將小數表示為定點小數 F # 與f相同,但是對於特殊值(nan和inf),使用大寫表示 g #自動在定點表示和科學計數表示之間做出選擇;這是預設用於小數的說明符,預設情況下至少有一位小數 G #與g相同,但使用大寫來表示指數和特殊值 n # 與g相同,但插入隨區域而異的數字分隔符 o # 將整數表示為八進位制數 s # 保持字串的格式不變,預設用於字串的說明符 x # 將整數表示為十六進位制數並使用小寫字母 X # 與x相同,但使用大寫字母 % # 將數表示為百分比值(乘以100,按說明符f設定格式,再在後面加上%)
寬度:
寬度使用整數指定
>>> "{num:10}".format(num=3) ' 3' >>> "{name:10}".format(name="bone") 'bone ' # 可見數字是右對齊進行空位填充,字串是左對齊進行填充
精度:
設定浮點數格式預設保留6位小數,要更改序要設定精度
精度使用整數指定,要在整數前面加上句點號:.
>>> "This number is {num:.2f}".format(num=33.345678) 'This number is 33.35' # 可以同時指定寬度和精度 >>> "This number is {num:10.2f}".format(num=33.345678) 'This number is 33.35'
千位分隔符:
使用逗號新增
>>> "number is {:,}".format(10**100) 'number is 10,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000'
同時指定其他格式設定時,逗號要放在表示寬度和表示精度的句點之間
"number is {:12.2f}".format(99999999) 'number is 99999999.00' >>> "number is {:12,.2f}".format(99999999) 'number is 99,999,999.00'
對齊和填充:
字串和數字預設的對齊方式不同,若要修改對齊方式,可以在指定寬度和精度的數前面新增一個標誌
# 左對齊:< # 右對齊:> # 居中:^ >>> print("{0:<10.2f}\n{0:>10.2f}\n{0:^10.2f}".format(3.1415926)) 3.14 3.14 3.14
可以指定填充字元來替代預設的空格
>>> "{:#^16}".format("go") '#######go#######'
等於號:=;用來將填充的字元放在符號和數字之間
>>> "{:=16.2f}".format(-3.1415) '- 3.14' >>> "{:#=16.2f}".format(-3.1415) '-###########3.14'
給正數加上說明符,放在對齊說明符後面
# 預設設定,符號是:- >>> print("{0:.2}\n{1:.2}".format(3.1415, -3.1415)) 3.1 -3.1 >>> print("{0:-.2}\n{1:-.2}".format(3.1415, -3.1415)) 3.1 -3.1 # 改為+號 >>> print("{0:+.2}\n{1:+.2}".format(3.1415, -3.1415)) +3.1 -3.1 # 指定為空格 >>> print("{0: .2}\n{1: .2}".format(3.1415, -3.1415)) 3.1 -3.1
井號:#;將其放在符號說明符和寬度之間,將處罰一種轉換方式,隨型別而異
# 對於二進位制、八進位制、十六進位制會加字首 >>> "{:b}".format(42) '101010' >>> "{:#b}".format(42) '0b101010' # 對於十進位制,必須包含小數點(g型別保留小數點後的0) >>> "{:g}".format(42) '42' >>> "{:#g}".format(42) '42.0000'