Python 的格式化字符串(f-string)的基本用法詳解
Python 的格式化字符串(f-string,格式化字符串字面量)是 Python 3.6 引入的一種強大且簡潔的字符串格式化工具,通過在字符串前添加 f 或 F 前綴,并使用花括號 {} 嵌入變量或表達式,實現(xiàn)動態(tài)字符串生成。本文將詳細介紹 f-string 的定義、語法、用法、格式化選項、版本改進、性能、適用場景、注意事項及最佳實踐。
1. 什么是 f-string?
f-string 是 Python 3.6 及以上版本支持的字符串格式化方法,由 PEP 498 – Literal String Interpolation 提出,旨在提供比傳統(tǒng) % 格式化、str.format() 和 string.Template 更簡潔、可讀且高效的方式。f-string 允許在字符串字面量中直接嵌入 Python 表達式,運行時動態(tài)求值。
核心特點:
- 簡潔語法:通過
f"文本 {表達式}"嵌入變量或表達式。 - 高效性能:編譯時解析為字節(jié)碼,執(zhí)行速度快。
- 靈活性:支持任意 Python 表達式,包括運算 復(fù)雜運算、函數(shù)調(diào)用和推導(dǎo)式。
- 格式化選項:支持對齊、精度、類型等格式控制。
- 調(diào)試支持:Python 3.8+ 提供
=修飾符,便于調(diào)試。
示例:
name = "Alice"
age = 25
print(f"姓名: {name}, 年齡: {age}") # 輸出: 姓名: Alice, 年齡: 25與元類的關(guān)系:雖然 f-string 本身不直接涉及元類,但其實現(xiàn)依賴 Python 的動態(tài)求值機制,表達式在運行時通過 eval() 解析,類似于元類在類創(chuàng)建時的動態(tài)干預(yù)。
2. f-string 的基本語法和用法
f-string 的語法為在字符串前添加 f 或 F,在字符串中使用 {表達式} 嵌入內(nèi)容,表達式在運行時求值。
2.1 基本用法
f-string 支持嵌入變量、常量、算術(shù)運算、函數(shù)調(diào)用等。
示例:
x = 10
y = 20
print(f"結(jié)果: {x + y}") # 輸出: 結(jié)果: 30
print(f"平方: {x ** 2}") # 輸出: 平方: 100
def greet(name):
return f"你好, {name}!"
print(greet("Bob")) # 輸出: 你好, Bob!2.2 復(fù)雜表達式
f-string 支持列表推導(dǎo)式、字典操作等復(fù)雜表達式。
示例:
names = ["Alice", "Bob", "Charlie"]
print(f"名字: {', '.join(name.upper() for name in names)}") # 輸出: 名字: ALICE, BOB, CHARLIE
data = {"a": 1, "b": 2}
print(f"鍵值對: {list(data.items())}") # 輸出: 鍵值對: [('a', 1), ('b', 2)]2.3 多行 f-string
f-string 支持多行字符串,適合復(fù)雜格式化。
示例:
name = "Alice"
age = 25
print(f"""
個人信息:
姓名: {name}
年齡: {age}
""")
# 輸出:
# 個人信息:
# 姓名: Alice
# 年齡: 253. 格式化選項
f-string 使用格式說明符(format specification mini-language)控制輸出格式,語法為 {表達式:格式說明符},格式說明符位于 : 之后。格式說明符支持填充、對齊、寬度、精度和類型等,基于 Python 官方文檔:Common String Operations。
3.1 格式說明符語法
格式說明符 ::= [[填充]對齊][符號]["z"]["#"]["0"][寬度][分組]["." 精度][類型]
- 填充:任意字符,用于填充空白(如
_、*)。 - 對齊:
<(左對齊)、>(右對齊)、^(居中)。 - 符號:
+(顯示正負號)、-(僅負號)、空格(正數(shù)前加空格)。 - z:將負零轉(zhuǎn)為正零(Python 3.11+)。
- #:備用格式(如為十六進制加
0x前綴)。 - 0:數(shù)字左填充零。
- 寬度:輸出最小寬度。
- 分組:千位分隔符(
,或_)。 - 精度:小數(shù)點后位數(shù)或字符串最大長度。
- 類型:如
s(字符串)、d(十進制)、f(浮點數(shù))、x(十六進制)。
3.2 常見格式化示例
對齊和填充:
name = "Bob"
print(f"{name:>10}") # 輸出: " Bob"(右對齊,寬度10)
print(f"{name:_<10}") # 輸出: "Bob_______"(左對齊,用_填充)
print(f"{name:*^10}") # 輸出: "***Bob****"(居中,用*填充)數(shù)字格式化:
pi = 3.14159
print(f"Pi: {pi:.2f}") # 輸出: Pi: 3.14(2位小數(shù))
print(f"Pi: {pi:,.2f}") # 輸出: Pi: 3,141.59(千位分隔)
num = 42
print(f"Number: {num:05d}") # 輸出: Number: 00042(零填充)
print(f"Hex: {num:#x}") # 輸出: Hex: 0x2a(十六進制帶前綴)其他類型:
from datetime import datetime
now = datetime.now()
print(f"日期: {now:%Y-%m-%d}") # 輸出: 日期: 2025-05-18表 1:常見格式說明符
| 表達式 | 輸出 | 說明 |
|---|---|---|
f"{pi:.2f}" | 3.14 | 浮點數(shù),2位小數(shù) |
f"{num:>10d}" | " 42" | 右對齊,寬度10 |
f"{pi:,.2f}" | 3,141.59 | 千位分隔,2位小數(shù) |
f"{num:+d}" | +42 | 帶符號的十進制 |
f"{num:05d}" | 00042 | 零填充,寬度5 |
f"{num:#x}" | 0x2a | 十六進制,帶前綴 |
4. 修飾符與調(diào)試
f-string 支持修飾符 !s、!r 和 !a,分別調(diào)用 str()、repr() 和 ascii(),用于控制表達式輸出形式。
示例:
class Person:
def __init__(self, name):
self.name = name
def __str__(self):
return f"Person: {self.name}"
def __repr__(self):
return f"Person(name='{self.name}')"
p = Person("Charlie")
print(f"{p!s}") # 輸出: Person: Charlie
print(f"{p!r}") # 輸出: Person(name='Charlie')
print(f"{p!a}") # 輸出: Person(name='Charlie')(ASCII 編碼)調(diào)試模式(Python 3.8+):
使用 = 修飾符顯示表達式及其值,便于調(diào)試。
示例:
x = 10
y = 20
print(f"{x=}, {y=}, {x + y=}") # 輸出: x=10, y=20, x + y=305. Python 3.12 的改進
根據(jù) What’s New In Python 3.12 和 PEP 701,Python 3.12 放寬了 f-string 的語法限制,提升靈活性:
- 支持反斜杠:允許在表達式中使用反斜杠(如
\n)。 - 重復(fù)引號:允許嵌套與 f-string 相同的引號。
- 注釋和多行表達式:支持在表達式中添加注釋和多行代碼。
示例:
words = ["hello", "world"]
print(f"{'\\n'.join(words)}") # 輸出: hello\nworld
# 嵌套引號
print(f"{'\"quoted\"'}") # 輸出: "quoted"
# 多行表達式
print(f"""
結(jié)果: {
# 計算總和
sum([1, 2, 3])
}
""") # 輸出: 結(jié)果: 6這些改進使 f-string 在復(fù)雜場景下更易用,研究顯示其在多行格式化和動態(tài)生成中效果顯著。
6. 性能比較
f-string 在性能上優(yōu)于傳統(tǒng)格式化方法,因其在編譯時解析為字節(jié)碼,減少運行時開銷。根據(jù) Real Python 的基準測試(Real Python: Python’s F-String),在 1,000,000 次迭代中:
- f-string:87.08 ms
- % 運算符:90.98 ms
- str.format():144.69 ms
原因:
- f-string 直接嵌入表達式,避免了
str.format()的參數(shù)解析。 - 編譯時優(yōu)化,表達式求值更高效。
示例性能測試:
import timeit
print(timeit.timeit('f"Number: {42}"', number=1000000)) # 更快
print(timeit.timeit('"Number: %d" % 42', number=1000000)) # 稍慢
print(timeit.timeit('"Number: {}".format(42)', number=1000000)) # 最慢7. 適用場景
f-string 適用于大多數(shù)字符串格式化場景,包括:
- 用戶輸出:生成格式化的用戶界面文本。
score = 95 print(f"你的得分是: {score}/100") # 輸出: 你的得分是: 95/100 - 日志消息:快速構(gòu)造日志字符串(但見注意事項)。
user = "Alice" print(f"用戶 {user} 已登錄") - 數(shù)據(jù)格式化:處理數(shù)字、日期等。
from datetime import datetime now = datetime.now() print(f"當(dāng)前時間: {now:%Y-%m-%d %H:%M:%S}") # 輸出: 當(dāng)前時間: 2025-05-18 09:49:00 - 調(diào)試:使用
=修飾符檢查變量值。x = 42 print(f"{x=}") # 輸出: x=42
8. 注意事項
盡管 f-string 功能強大,但需注意以下事項:
版本兼容性:
- f-string 僅在 Python 3.6+ 可用,舊版本會拋出
SyntaxError。 - 某些功能(如
=修飾符)需 3.8+,反斜杠支持需 3.12+。
- f-string 僅在 Python 3.6+ 可用,舊版本會拋出
日志記錄:
- f-string 立即求值,可能在日志未記錄時浪費資源。
- 推薦:使用
logging模塊的%格式化,延遲求值。import logging logging.warning("用戶 %s 已登錄", "Alice") # 優(yōu)于 f-string
安全性:
- 避免將用戶輸入直接嵌入表達式,可能導(dǎo)致代碼注入。
user_input = ".__class__.__bases__[0].__subclasses__()" # 危險: print(f"{eval(user_input)}") - 對于 SQL 查詢,使用參數(shù)化查詢而非 f-string:
cursor.execute("SELECT * FROM users WHERE name = ?", (name,))
- 避免將用戶輸入直接嵌入表達式,可能導(dǎo)致代碼注入。
可讀性:
- 復(fù)雜表達式可能降低可讀性,建議拆分為多行或預(yù)計算。
# 不可讀 print(f"結(jié)果: {sum([x * y for x in range(10) for y in range(10)])}") # 改進 total = sum(x * y for x in range(10) for y in range(10)) print(f"結(jié)果: {total}")
- 復(fù)雜表達式可能降低可讀性,建議拆分為多行或預(yù)計算。
國際化:
- f-string 不直接支持動態(tài)格式化,國際化場景可能需
str.format()或模板。template = "姓名: {name}, 年齡: {age}" print(template.format(name="Alice", age=25))
- f-string 不直接支持動態(tài)格式化,國際化場景可能需
9. 最佳實踐
保持簡潔:
- 使用簡單表達式,避免嵌套復(fù)雜邏輯。
- 示例:
# 推薦 result = x + y print(f"結(jié)果: {result}") # 避免 print(f"結(jié)果: {x + y + complex_calculation()}")
使用格式化選項:
- 充分利用對齊、精度等功能,提升輸出美觀性。
print(f"{'項目':<10} {'得分':>5}") print(f"{'數(shù)學(xué)':<10} {95:>5}") # 輸出: # 項目 得分 # 數(shù)學(xué) 95
- 充分利用對齊、精度等功能,提升輸出美觀性。
調(diào)試優(yōu)先:
- 使用
=修飾符快速檢查變量值。print(f"{data['key']=}") # 檢查字典值
- 使用
性能優(yōu)化:
- 在循環(huán)中優(yōu)先使用 f-string,減少格式化開銷。
for i in range(1000): print(f"迭代: {i}") # 優(yōu)于 str.format()
- 在循環(huán)中優(yōu)先使用 f-string,減少格式化開銷。
安全性檢查:
- 對用戶輸入進行清洗,必要時使用參數(shù)化或模板。
name = sanitize_input(user_input) print(f"歡迎, {name}")
- 對用戶輸入進行清洗,必要時使用參數(shù)化或模板。
10. 總結(jié)表
| 功能 | 示例 | 說明 |
|---|---|---|
| 基本嵌入 | f"姓名: {name}" | 嵌入變量或簡單表達式 |
| 復(fù)雜表達式 | f"{', '.join(names)}" | 支持推導(dǎo)式、函數(shù)調(diào)用 |
| 格式化對齊 | f"{name:>10}" | 控制寬度、填充、左右居中 |
| 數(shù)字格式化 | f"{pi:.2f}" | 控制精度、千位分隔、符號 |
| 修飾符 | f"{obj!r}" | 調(diào)用 str()、repr()、ascii() |
| 調(diào)試模式 | f"{x=}" | 顯示表達式和值(3.8+) |
| 多行和注釋 | f"結(jié)果: {sum([1, 2]) # 注釋}" | 支持反斜杠、注釋(3.12+) |
11. 學(xué)習(xí)資源
- 官方文檔:
- 教程:
- 規(guī)范:
- 書籍:
- 《Fluent Python》:深入講解字符串處理。
- 《Python Cookbook》:f-string 實用案例。
12. 總結(jié)
f-string 是 Python 中最現(xiàn)代、最推薦的字符串格式化工具,憑借簡潔的語法、高效的性能和豐富的格式化選項,廣泛應(yīng)用于文本輸出、數(shù)據(jù)格式化、調(diào)試等領(lǐng)域。Python 3.8 和 3.12 的改進進一步增強了其功能,但需注意日志記錄、安全性和版本兼容性。學(xué)習(xí)者應(yīng)通過實踐掌握 f-string 的核心用法和最佳實踐,結(jié)合格式化選項提升代碼質(zhì)量。
到此這篇關(guān)于Python 的格式化字符串(f-string)的文章就介紹到這了,更多相關(guān)python格式化字符串內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實現(xiàn)TCP協(xié)議下的端口映射功能的腳本程序示例
端口映射一個最基本的運作形態(tài)就是通過一個中間端口將一個端口發(fā)送的數(shù)據(jù)全部轉(zhuǎn)給另一個端口,well,這里我們就來看一下Python實現(xiàn)TCP協(xié)議下的端口映射功能的腳本程序示例2016-06-06
Django在urls.py利用函數(shù)path()配置路由時傳遞參數(shù)給調(diào)用的視圖函數(shù)的方法(推薦)
這篇文章主要介紹了Django在urls.py利用函數(shù)path()配置路由時傳遞參數(shù)給調(diào)用的視圖函數(shù)的方法(推薦),本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-01-01
python神經(jīng)網(wǎng)絡(luò)AlexNet分類模型訓(xùn)練貓狗數(shù)據(jù)集
這篇文章主要為大家介紹了python神經(jīng)網(wǎng)絡(luò)AlexNet分類模型訓(xùn)練貓狗數(shù)據(jù)集,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05
Python利用zhconv模塊進行簡繁體字轉(zhuǎn)換的案例演示
zhconv是一個Python庫,提供了簡體字和繁體字之間的轉(zhuǎn)換功能,本教程將向你展示如何使用zhconv模塊來實現(xiàn)簡繁體字的互轉(zhuǎn),并附帶一個案例演示,感興趣的朋友可以參考一下2024-05-05
caffe的python接口生成配置文件學(xué)習(xí)
這篇文章主要介紹了caffe的python接口生成配置文件學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06
stream.findFirst().get()?報錯?NoSuchElementException的解決方案
文章講述了在使用Java?Stream?API時,stream.findFirst().get()報錯NoSuchElementException的原因,以及如何通過Optional提供的安全方法來修復(fù)這個問題,本文給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧2025-12-12
關(guān)于Python3爬蟲利器Appium的安裝步驟
在本篇文章里小編給大家整理的是一篇關(guān)于Python3爬蟲利器Appium的安裝步驟,需要的朋友們可以跟著參考下。2020-07-07

