比較 Python 的格式化字串 — %-formatting、str.format()、 f-string

Jo-Yu Liao
5 min readFeb 21, 2020

%-formatting、str-format(Python 2.6+)、f-string (Python 3.6+)

一、%-formatting

最早 Python 的格式化字串(format string)是用與 C 語言類似的 %-formatting,透過% 運算符號,將在元組(tuple)中的一組變量依照指定的格式化方式輸出。如 %s(字串)、 %d(十進位整數)、 %f(浮點數):

%-formatting

但這種輸出方式並不適合有很多變量的情況,容易搞錯也不易讀,如:

I am %s %s. %s

就完全不知道 %s 個別代表是什麼意思,需要配合參數才能知道用途:

%-formatting

二、str.format()

2008 發布的 Python 2.6 開始有新的格式化字符函數 str.format(),透過 {} 和 format 來代替 %運算符號,如我們可以將上面例子的:

s = 'I am %s %s. %s'

重寫為:

s = 'I am {first_name} {middle_name}. {last_name}'

然後透過 format 來帶入值:

s.format(first_name='Monkey', middle_name='D', last_name='Luffy')

有沒有比之前容易讀一點呢:)?但是,這也會導致接變量後 format 會變長:

str.format()

str.format() 除了可以指定格式化變量的名稱外,也可以透過^(居中)<(向左對齊)>(向右對齊)等方式調整輸出樣式:

str-formatting

或是以 {:,} 的方式以逗號分隔數字:

str-formatting

更多 str.format() 支持的格式可參考:Python format 格式化函数

三、f-string

2016 發布的 Python 3.6 新增 f-string,可以解決 %-formatting 變量不易閱讀以及 str.format() 接變量後變超長的問題,如上面自介的例子:

# variables
first_name = "Monkey"
middle_name = "D"
last_name = "Luffy"
# str.format()
"I am {first_name} {middle_name}. {last_name}".format(
first_name=first_name,
middle_name=middle_name,
last_name=last_name
)
# Output: "I am Monkey D. Luffy"

可用 f-string 改成如下格式,就可以將之前的變量帶入並格式化輸出喔!:

# variables
first_name = "Monkey"
middle_name = "D"
last_name = "Luffy"
# f-string
f"I am {first_name} {middle_name}. {last_name}"
# Output: "I am Monkey D. Luffy"

有木有比較清爽一點?再一個例子比較三個方法的可讀性:

覺得 f-string 有沒有比較容易閱讀呢:)?而且 f-string 執行速度比 str.format()、%s 還快呢!但要注意的是 f-string 不能像 %-string、str.format() 一樣,可以先將 template 賦值給變量再格式化輸出:

error

以上是 %-string、str.format()、f-string 的使用方法比較。

--

--