從一個常見的痛點開始
你想印出一句「小明 的分數是 92 分」,姓名跟分數都在變數裡。直覺會這樣寫:
name = "小明"
score = 92
print(name + " 的分數是 " + score + " 分")TypeError: can only concatenate str (not "int") to str字串不能直接接數字,得先 str(score)。把數字通通包一層 str()、再數清楚每個引號和空格要不要,是新手最常卡的地方。Python 其實給了好幾種格式化字串的方法,這篇先快速看過舊做法的優缺點,再帶到現在最推薦的 f-string。
舊做法一:+ 字串串接
print(name + " 的分數是 " + str(score) + " 分")- 優點:直覺,看得懂就是把字串一段段黏起來。
- 缺點:非字串都要手動
str();引號、空格要自己數,一長就很難讀,也容易漏一個空白。
舊做法二:% 格式化(最舊的寫法)
print("%s 的分數是 %d 分" % (name, score))%s 代表字串、%d 代表整數、%.2f 代表小數點兩位的浮點數。
- 優點:比串接短,數字不用先轉字串。
- 缺點:
%s/%d這些代號要背;變數是用位置對應的,順序一錯就對到別的值,多個參數時很容易數錯。這是 C 語言帶來的老語法,官方現在不建議新程式再用。
舊做法三:str.format()
print("{} 的分數是 {} 分".format(name, score))
print("{0} 的分數是 {1} 分".format(name, score)) # 用編號指定
print("{n} 的分數是 {s} 分".format(n=name, s=score)) # 用名字指定- 優點:可以用編號或名字對應,比
%清楚,功能也更完整。 - 缺點:值都塞在後面的
.format(...)裡,眼睛要在{}和括號之間來回對照,句子一長還是很囉嗦。
新做法:f-string(現在的首選)
f-string 就是在字串前面加一個 f,然後把變數直接寫在 {} 裡——值就在它該出現的位置,不用再對照後面的參數:
print(f"{name} 的分數是 {score} 分")一行搞定,數字不用 str(),讀起來就跟句子本身一樣順。f-string 從 Python 3.6 開始內建,現在幾乎是格式化字串的標準做法。
{} 裡可以放任何運算式
不只是變數名,任何合法的 Python 運算式都能塞進去,執行時直接算出結果:
a, b = 3, 5
print(f"{a} + {b} = {a + b}") # 3 + 5 = 8
print(f"平均是 {(a + b) / 2}") # 平均是 4.0
print(f"名字有 {len(name)} 個字") # 名字有 2 個字格式規格:冒號後面控制「怎麼顯示」
在變數後面加 :,就能指定顯示格式,這是 f-string 最實用的部分:
pi = 3.14159
print(f"圓周率約 {pi:.2f}") # 圓周率約 3.14 (小數點後 2 位)
price = 1234567
print(f"總金額 {price:,} 元") # 總金額 1,234,567 元 (千分位逗號)
ratio = 0.856
print(f"達成率 {ratio:.1%}") # 達成率 85.6% (自動 ×100 並加百分號)
for n in range(1, 4):
print(f"第 {n:>3} 名") # 靠右對齊、寬度 3,數字不會參差不齊常用的格式代號:.2f 小數位數、, 千分位、.1% 百分比、>/</^ 靠右/靠左/置中對齊。
= 除錯神器(Python 3.8 起)
在變數後面加一個 =,會連變數名帶值一起印出來,除錯時省得自己打一次名字:
score = 92
print(f"{score=}") # score=92
print(f"{a + b=}") # a + b=8跨行、引號的小提醒
f-string 可以搭配三引號寫多行:
print(f"""姓名:{name}
分數:{score}""")早期 f-string 的 {} 裡不能用跟外層相同的引號,也不能直接放反斜線;Python 3.12(PEP 701)之後這些限制都放寬了,內層可以自由重用引號、換行、甚至寫註解。如果你用的是舊版本遇到引號打架,把內外引號改成一單一雙(例如外層 "、內層 ')就能避開。
小結:該用哪一種
寫新程式,優先用 f-string——它把值放在該出現的位置,最好讀、最好維護,格式規格也最完整。str.format() 在少數需要先存好模板、之後再套值的情境還有用;% 格式化除非維護舊程式,否則不用再學新的。串接 + 留給「真的只是接兩三段純字串」的簡單場合就好。
想從變數、input()、型別到字串格式化把 Python 基礎打穩,可以搭配 Python 基礎入門課程的課堂教材與練習題一起練。