回文章列表
Python5 分鐘閱讀2026年5月10日

Python 字串格式化:從 +、% 到 f-string,print 該用哪一種

#Python#f-string#字串格式化#print#新手

文章目錄

從一個常見的痛點開始

你想印出一句「小明 的分數是 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 基礎入門課程的課堂教材與練習題一起練。

相關課程

Python 基礎入門

從零開始學習 Python 程式語言,掌握變數、流程控制、函式與模組化設計,建立扎實的程式設計基礎。

查看課程內容