Python 字串的格式化

Yusheng發表於2016-04-18

相信很多人在格式化字串的時候都用"%s" % v的語法,PEP 3101 提出一種更先進的格式化方法 str.format() 併成為 Python 3 的標準用來替換舊的 %s 格式化語法,CPython 從 2.6 開始已經實現了這一方法(其它直譯器未考證)。

format()

新的 format() 方法其實更像是一個簡略版的模板引起(Template Engine),功能非常豐富,官方文件對其語法的描述如下:

我將其準換成鐵路圖的形式,(可能)更直觀一些:

replacement_field.jpg

模板中替換變數用 {} 包圍,且由 : 分為兩部分,其中後半部分 format_spec 在後面會單獨討論。前半部分有三種用法:

  1. 代表位置的數字
  2. 代表keyword的識別符號

這與函式呼叫的引數類別是一致的:

除此之外,就像在0x05 函式引數與解包中提到的一樣,format() 中也可以直接使用解包操作:

在模板中還可以通過 .identifier[key] 的方式獲取變數內的屬性或值(需要注意的是 "{}{}" 相當於 "{0}{1}"):

強制轉換

可以通過 ! + r|s|a 的方式對替換的變數進行強制轉換:

  1. "{!r}" 對變數呼叫 repr()
  2. "{!s}" 對變數呼叫 str()
  3. "{!a}" 對變數呼叫 ascii()

格式

最後 : 之後的部分定義輸出的樣式:

format_spec.jpg

align 代表對齊方向,通常要配合 width 使用,而 fill 則是填充的字元(預設為空白):

同時可以看出,樣式設定裡面可以巢狀 {} ,但是必須通過 keyword 指定,且只能巢狀一層。

接下來是符號樣式:+|-|' ' 分別指定數字是否需要強制符號(其中空格是指在正數的時候不顯示 + 但保留一位空格):

# 用於表示特殊格式的數字(二進位制、十六進位制等)是否需要字首符號;, 也是用於表示數字時是否需要在千位處進行分隔;0 相當於前面的 {:0=} 右對齊並用 0 補充空位:

最後兩個就是我們熟悉的小數點精度 .n 和格式化型別了,這裡僅給出一些示例,詳細內容可以查閱文件

Integer

Float

String (default)

打賞支援我寫出更多好文章,謝謝!

打賞作者

打賞支援我寫出更多好文章,謝謝!

Python 字串的格式化

相關文章