Python中進(jìn)行字符串格式化的不同方法介紹與對比
字符串格式化是每個(gè)Python開發(fā)大神們都會(huì)遇到的基礎(chǔ)操作。剛開始的時(shí)候用的是%操作符或者是str.format()。
到如今的是f-string,但你知道哪種方式最快?哪種最易讀?哪種又最適合你的項(xiàng)目嗎?
肯可能有人會(huì)回答:這沒啥鳥用,也沒啥影響,但起碼好看是有的吧!
接下來分析一下這三個(gè)貨,看誰更硬更耐看:
1. %操作符
如果你看過一些老版本的Python代碼,肯定會(huì)對這個(gè)語法印象深刻:
name = "張三" age = 25 message = "我叫%s,今年%d歲" % (name, age)
這種寫法源自C語言的printf函數(shù),對于有C背景的開發(fā)者來說非常親切。%s表示字符串位置,%d表示整數(shù)位置,還有其他各種占位符比如%f表示浮點(diǎn)數(shù)。
優(yōu)點(diǎn)是簡單直接,但缺點(diǎn)也很明顯:當(dāng)變量較多時(shí),代碼可讀性會(huì)急劇下降。而且一旦參數(shù)順序出錯(cuò),這不就給自己惹麻煩了不是,咱們的重點(diǎn)是建設(shè)核心代碼,咋能被這種小卡拉米絆住腿呢?扯遠(yuǎn)了!
性能方面,%操作符其實(shí)并不差。在小規(guī)模字符串處理中,它的速度相當(dāng)不錯(cuò),但隨著Python版本更新,它已經(jīng)不再是性能最優(yōu)的選擇。
2. str.format()方法
Python 2.6引入了str.format()方法,提供了更強(qiáng)大的格式化能力:
message = "我叫{},今年{}歲".format(name, age)
# 或者更明確地
message = "我叫{name},今年{age}歲".format(name=name, age=age)
這種方式明顯提高了代碼的可讀性和可維護(hù)性。你可以通過數(shù)字索引、關(guān)鍵字參數(shù)甚至對象屬性來引用值:
person = {"name": "張三", "age": 25}
message = "我叫{0[name]},今年{0[age]}歲".format(person)
str.format()還提供了豐富的格式規(guī)范,比如控制浮點(diǎn)數(shù)精度、數(shù)字的進(jìn)制轉(zhuǎn)換等高級(jí)功能。
但從性能角度看,str.format()比%操作符要慢一些,因?yàn)樗枰冉馕龈袷阶址缓笤龠M(jìn)行替換操作。都比上一個(gè)慢了我還用你干啥,是不是?
3. 新王者出現(xiàn)啦!f-string
Python 3.6引入了f-string(格式化字符串字面量),徹底改變了游戲規(guī)則:
message = f"我叫{name},今年{age}歲"
f-string直接在字符串中嵌入表達(dá)式,語法簡潔直觀。你甚至可以在大括號(hào)內(nèi)執(zhí)行運(yùn)算或函數(shù)調(diào)用:
message = f"我叫{name.upper()},明年{age+1}歲"
為什么f-string如此強(qiáng)大?
首先,可讀性極高。變量名直接嵌入字符串,一目了然。而且壓根兒不用管是啥類型的,就是一通操作。
其次,性能卓越。f-string在運(yùn)行時(shí)被解析為字節(jié)碼,直接執(zhí)行替換操作,避免了額外的解析開銷。
我做了個(gè)簡單測試我們來看一看,分別用三種方式格式化字符串100萬次 (PS:雖然這種格式化字符串100萬次的可能性在項(xiàng)目中極低,但是咱測試測試嘛!萬一面試遇到了呢):

結(jié)果很明顯——f-string比%操作符快約19%,比str.format()快41%! 這還是字符串不長的情況下。
4. 特殊場景考慮
雖然f-string優(yōu)勢明顯,但有些場景下其他方法仍有用武之地:
兼容舊版本Python:如果你需要支持Python 3.6以下的版本,顯然不能使用f-string
動(dòng)態(tài)格式字符串:當(dāng)你需要?jiǎng)討B(tài)構(gòu)建格式字符串時(shí),str.format()更合適
template = "我叫{},今年{}歲"
message = template.format(name, age)
國際化(i18n):使用gettext等國際化工具時(shí),%操作符或str.format()更易與翻譯系統(tǒng)集成
5. 個(gè)人建議
基于以上分析,我給出以下建議:
- 新項(xiàng)目首選f-string:只要你的環(huán)境支持Python 3.6+,f-string是不二之選
- 注重性能的場景用f-string:特別是循環(huán)內(nèi)部或頻繁調(diào)用的函數(shù)中
- 需要?jiǎng)討B(tài)格式化時(shí)用str.format():當(dāng)格式字符串需要根據(jù)不同條件變化時(shí)
- 維護(hù)老代碼保留原有風(fēng)格:不要為了重構(gòu)而重構(gòu),除非有明確的性能提升需求
雖然f-string在大多數(shù)場景下都是最佳選擇,但理解每種方法的優(yōu)缺點(diǎn)和適用場景,才能做出最合適的技術(shù)決策。記住,沒有絕對最好的工具,只有最適合當(dāng)前場景的工具。
到此這篇關(guān)于Python中進(jìn)行字符串格式化的不同方法介紹與對比的文章就介紹到這了,更多相關(guān)Python字符串格式化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python3 pathlib庫Path類方法總結(jié)
這篇文章主要介紹了python3 pathlib庫Path類方法總結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
Pandas DataFrame如何按照一列數(shù)據(jù)的特定順序進(jìn)行排序
這篇文章主要介紹了Pandas DataFrame如何按照一列數(shù)據(jù)的特定順序進(jìn)行排序,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10
python3.7.3版本和django2.2.3版本是否可以兼容
在本篇文章里小編給大家整理的是一篇關(guān)于python3.7.3版本和django2.2.3版本是否可以兼容的相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2020-09-09
Python發(fā)起請求提示UnicodeEncodeError錯(cuò)誤代碼解決方法
這篇文章主要介紹了Python發(fā)起請求提示UnicodeEncodeError錯(cuò)誤代碼解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
Python socket連接中的粘包、精確傳輸問題實(shí)例分析
這篇文章主要介紹了Python socket連接中的粘包、精確傳輸問題,結(jié)合實(shí)例形式分析了Python socket連接中的粘包、精確傳輸相關(guān)問題原因、解決方案與操作注意事項(xiàng),需要的朋友可以參考下2020-03-03
詳解python的網(wǎng)絡(luò)編程基礎(chǔ)
這篇文章主要為大家介紹了python網(wǎng)絡(luò)編程的基礎(chǔ),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-01-01

