Python2.6+ 增加了str.format函數,用來代替原有的'%'操作符。它使用比'%'更加直覺、靈活。下面詳細介紹一下它的使用方法。
下面是使用'%'的例子:
格式很像C語言的printf是不是?由于'%'是一個操作符,隻能在左右兩邊各放一個參數,是以右邊多個值需要用元組或者字典來包括,不能元組字典一起用,缺乏靈活度。
同樣的例子用format方法改寫:
是不是很直覺?(當然,使用C語言的我也很喜歡前一種格式表達方式 :-) )
注意第一行的'\',如果一個語句要換行,必須在結尾加上反斜線轉義。
用'%'無法像這樣将元組和字典混用。其實這裡是命名參數,Python的一個特性。可以在定義數組的時候用*args, **kwargs文法展開集合和字典。需要注意,命名參數放在後面。
第二個語句表示format内置函數用來格式化單個值。
第三個語句表示了{}的轉義,因為{}在被格式化字元串裡是特殊字元,不能直接顯示。轉義方式是多嵌套一層。
'{0.name}' 相當于調用對象的屬性 open('out.txt', 'w').name
使用索引也是可以的。
obj[key] 相當于 obj.____getitem____('key')
寫過C語言的程式員應該清楚printf的複雜。format也定義了很多标準的說明符,用來解釋一個值的格式,然後插入字元串内。例如:
':'之後便是說明符了,上面例子中說明符隻有一個'8'(minimumwidth),它表示插入的值寬度至少為8。'Fred'隻有4,是以又加了4個空格。
說明符的詳細格式為:
[[fill]align][sign][#][0][minimumwidth][.precision][type]
(不比C的printf更簡潔啊!)
注意:'[]'表示該元素可選。是以,所有的格式說明符都是可選的!就像之前的例子,幾乎都沒有用這個(隻是為了例子更清晰)。實際上,這些是很有用的。
我們一個個來看:
[fill]align 表示排列方式。當minimumwidth設定的比插入的值大時,就有了留白,就像上一個例子中的'My name is Fred '。預設把留白放在了右邊,也就是說插入值預設是左對齊的。如果我們試試{0:>8},會發現結果變成了'My name is Fred'。
fill 表示用來填充留白的字元。隻有在align指定了的情況下fill才有用! align可以是下面的辨別:
< 左對齊,預設
> 右對齊
= 将留白放在align辨別後面,隻對數字有效。什麼意思呢?align下面會講到,顯示數字的正負号,同樣隻對數字有效。如果指定了'=',那麼就會把數字的正負号顯示在留白的前面。例如:format(-12, "0=8") # => '-0000012'注意這裡用的是格式化單個值的内置函數format。'0'是fill元素,用它來填充留白;'='就是該辨別了;'8'是指最小寬度為8,是以才有5個留白。那麼align呢?align其實就是說明正負号的顯示方式,這裡使用預設的'-',之後會講到。
^ 居中對齊
sign 數字元号,隻對數字有效。
+ 顯示加号和減号
- 不顯示加号,顯示減号。在不指定最小寬度的情況下負數總是比正數多占一個符号位置。預設
' ' (一個空格) 用一個留白代替加号
# 顯示數字的字首表示幾進制(0b, 0o, 0x)
0 用'0'填充留白。
minimumwidth 指定最小寬度,已經用過很多次了。
.precision 'precision'是一個十進制數字,表示顯示小數點後幾位。
type 值的類型:
e 科學計數法表示,小寫e
E 科學計數法表示,大寫E
f 顯示為定點數,預設小數點後六位
F 同f
g 自動選擇是否用科學記數法表示
G 同g
n 同g,使用本地表示方式
% 使用百分比表示
''(空) 同g
b 二進制
c 字元型,把數字轉成表示unicode的字元
d 十進制
o 八進制
x 十六進制,顯示小寫字母
X 十六進制,顯示大寫字母
n 與d行為相同,使用本地的數字表示方式
''(空,沒有空格) 與d相同
整型:
浮點數
每個對象可以重寫自己的格式化說明符,例如datatime類重寫了後可以這樣表示:
':'之後是格式說明符,之前還可以加預先轉換的辨別
!r 調用對象的_repr_方法來轉換成标準字元串
!s 調用對象的_str_方法來轉換成字元串
我們在格式化一個字元串時,首先格式化每個值,然後再插入字元串内。格式化值調用的就是format内置方法。format則是簡單地調用該值的_format_方法。
在object類内實作了_format方法,隻是将本身用str()轉換成字元串,然後将字元串傳入内置的format方法,實際上就是調用轉換為字元串後的format_方法。
int/float/str自身實作了_format_方法,前面已經介紹了它們各自的說明符。