Python中進(jìn)行字符串格式化的不同方法介紹與對(duì)比
字符串格式化是每個(gè)Python開(kāi)發(fā)大神們都會(huì)遇到的基礎(chǔ)操作。剛開(kāi)始的時(shí)候用的是%操作符或者是str.format()。
到如今的是f-string,但你知道哪種方式最快?哪種最易讀?哪種又最適合你的項(xiàng)目嗎?
肯可能有人會(huì)回答:這沒(méi)啥鳥(niǎo)用,也沒(méi)啥影響,但起碼好看是有的吧!
接下來(lái)分析一下這三個(gè)貨,看誰(shuí)更硬更耐看:
1. %操作符
如果你看過(guò)一些老版本的Python代碼,肯定會(huì)對(duì)這個(gè)語(yǔ)法印象深刻:
name = "張三" age = 25 message = "我叫%s,今年%d歲" % (name, age)
這種寫(xiě)法源自C語(yǔ)言的printf函數(shù),對(duì)于有C背景的開(kāi)發(fā)者來(lái)說(shuō)非常親切。%s表示字符串位置,%d表示整數(shù)位置,還有其他各種占位符比如%f表示浮點(diǎn)數(shù)。
優(yōu)點(diǎn)是簡(jiǎ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ù)性。你可以通過(guò)數(shù)字索引、關(guān)鍵字參數(shù)甚至對(duì)象屬性來(lái)引用值:
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)樗枰冉馕龈袷阶址?,然后再進(jìn)行替換操作。都比上一個(gè)慢了我還用你干啥,是不是?
3. 新王者出現(xiàn)啦!f-string
Python 3.6引入了f-string(格式化字符串字面量),徹底改變了游戲規(guī)則:
message = f"我叫{name},今年{age}歲"
f-string直接在字符串中嵌入表達(dá)式,語(yǔ)法簡(jiǎn)潔直觀。你甚至可以在大括號(hào)內(nèi)執(zhí)行運(yùn)算或函數(shù)調(diào)用:
message = f"我叫{name.upper()},明年{age+1}歲"
為什么f-string如此強(qiáng)大?
首先,可讀性極高。變量名直接嵌入字符串,一目了然。而且壓根兒不用管是啥類(lèi)型的,就是一通操作。
其次,性能卓越。f-string在運(yùn)行時(shí)被解析為字節(jié)碼,直接執(zhí)行替換操作,避免了額外的解析開(kāi)銷(xiāo)。
我做了個(gè)簡(jiǎn)單測(cè)試我們來(lái)看一看,分別用三種方式格式化字符串100萬(wàn)次 (PS:雖然這種格式化字符串100萬(wàn)次的可能性在項(xiàng)目中極低,但是咱測(cè)試測(cè)試嘛!萬(wàn)一面試遇到了呢):

結(jié)果很明顯——f-string比%操作符快約19%,比str.format()快41%! 這還是字符串不長(zhǎng)的情況下。
4. 特殊場(chǎng)景考慮
雖然f-string優(yōu)勢(shì)明顯,但有些場(chǎng)景下其他方法仍有用武之地:
兼容舊版本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)
國(guó)際化(i18n):使用gettext等國(guó)際化工具時(shí),%操作符或str.format()更易與翻譯系統(tǒng)集成
5. 個(gè)人建議
基于以上分析,我給出以下建議:
- 新項(xiàng)目首選f-string:只要你的環(huán)境支持Python 3.6+,f-string是不二之選
- 注重性能的場(chǎng)景用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ù)場(chǎng)景下都是最佳選擇,但理解每種方法的優(yōu)缺點(diǎn)和適用場(chǎng)景,才能做出最合適的技術(shù)決策。記住,沒(méi)有絕對(duì)最好的工具,只有最適合當(dāng)前場(chǎng)景的工具。
到此這篇關(guān)于Python中進(jìn)行字符串格式化的不同方法介紹與對(duì)比的文章就介紹到這了,更多相關(guān)Python字符串格式化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python爬蟲(chóng)實(shí)戰(zhàn)JS逆向AES逆向加密爬取
一個(gè)建筑行業(yè)的堂哥為了搞一些商業(yè)數(shù)據(jù)前前后后花了1w,辣條我半個(gè)小時(shí)就能解決的事情,這就是技術(shù)的魅力!聲明:爬取是的公開(kāi)數(shù)據(jù)2021-10-10
python+pyqt5實(shí)現(xiàn)24點(diǎn)小游戲
這篇文章主要為大家詳細(xì)介紹了python+pyqt5實(shí)現(xiàn)24點(diǎn)小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
PyQtGraph在pyqt中的應(yīng)用及安裝過(guò)程
這篇文章主要介紹了PyQtGraph在pyqt中的應(yīng)用,文中給大家介紹了pyqtgraph的主要用途及PyQtGraph的安裝過(guò)程,需要的朋友可以參考下2019-08-08
淺談python多進(jìn)程共享變量Value的使用tips
今天小編就為大家分享一篇淺談python多進(jìn)程共享變量Value的使用tips,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07
python實(shí)現(xiàn)數(shù)組平移K位問(wèn)題
這篇文章主要介紹了python實(shí)現(xiàn)數(shù)組平移K位問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02

