從一個常見的痛點開始
你想印出一句「小明 的分數是 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——它把值放在該出現的位置,最好讀、最好維護,格式規格也最完整。str.format() 在少數需要先存好模板、之後再套值的情境還有用;% 格式化除非維護舊程式,否則不用再學新的。串接 + 留給「真的只是接兩三段純字串」的簡單場合就好。
想從變數、input()、型別到字串格式化把 Python 基礎打穩,可以搭配 Python 基礎入門課程的課堂教材與練習題一起練。