Python中格式化字符串的方法總結(jié)
字符串格式化
字符串格式化是一項常見且重要的操作,用于動態(tài)生成包含變量內(nèi)容的字符串。關(guān)于字符串的格式化,在python的歷史上,曾經(jīng)存在多種格式化字符串的方式,因此,這可能帶來困擾,一些人可能不清楚應(yīng)該使用哪一種格式化方法,下面,我就進行一下詳細(xì)的介紹。
當(dāng)前推薦做法:f-string
毫無疑問,f-string是現(xiàn)在最適合的字符串格式化的方法,因此首先進行介紹。f-string最早引入自3.6,因此需要3.6以后版本的python可以使用。
使用方法: 在字符串前加上 f 或 F,并在花括號 {} 內(nèi)填入變量或者表達式。
name = "sagegrass" age = 18 greeting = f"你好,我的名字是{name},我今年{age}歲,我去年{age - 1}歲" print(greeting)
在python3.8以后,加入了f-string調(diào)試支持,使用方法為在變量或者表達式以后添加=,從而同時輸出名稱和結(jié)果。
name = "sagegrass" print(f"{name=}") # 此時輸出結(jié)果為name=sagegrass
歷史做法
%格式化
歷史做法是在以前版本的python中非常常見的做法,你可以在很多較早期的代碼中看見,并且,時至今日也并非完全沒有使用價值,一些人可能現(xiàn)在仍然這樣做(但最好應(yīng)該改為使用f-string)。
%格式化是python中最早的字符串格式化方法,已經(jīng)有幾十年的歷史了,最早從c語言中繼承過來的。
使用方法: "格式字符串" % 值
name = "sagegrass" age = 18 greeting = "你好,我的名字是%s,我今年%d歲,我去年%d歲" % (name, age, age - 1) print(greeting)
其中,%s用于字符串,%d用于整型,另外還有一個常用的是%f,用于浮點數(shù)的格式化。但是由于其較為古老,既不好用,也容易出現(xiàn)問題,因此現(xiàn)在已經(jīng)不建議使用了。
format格式化
format格式化是在python2.6以及3.0時期引入的,format提供了更強大和靈活的字符串格式化功能。
使用方法:"格式字符串".format(值1, 值2, ...)
p1 = "鋤禾" p2 = "當(dāng)午" p3 = "汗滴" p4 = "下土" poem = "{}日{(diào)},{}禾{}".format(p1, p2, p3, p4) print(poem)
format格式化還允許提供位置參數(shù),多次使用同一個變量。
p1 = "一寸" p2 = "光陰" p3 = "金" poem = "{0}{1}{0}{2},寸{2}難買寸{1}".format(p1, p2, p3) print(poem)
format格式化還允許提供關(guān)鍵字參數(shù),根據(jù)指定參數(shù)名使用。
name = "sagegrass" age = 18 greeting = "你好,我的名字是{name},我今年{age}歲,我去年{age_of_last_year}歲".format(name=name, age=age, age_of_last_year=age - 1) print(greeting)
與%格式化字符串不同,format至今仍然是一個非常不錯的選擇,甚至在某些語言中,最新引入的格式化字符串的方式,就是類似format的方式。
Template格式化字符串
這是一個好的格式化字符串的方式,但是較少使用,這可能與其來自于string模塊,而不可以直接使用有一些關(guān)系。
from string import Template name = "sagegrass" age = 18 template = Template("你好,我的名字是$name,我今年$age歲,我去年$age_of_last_year歲") greeting = template.substitute(name=name, age=age, age_of_last_year=age - 1) print(greeting)
如果使用safe_substitute,那么在缺少變量的時候,也不會拋出異常,此時將保留原文
from string import Template name = "sagegrass" age = 18 template = Template("你好,我的名字是$name,我今年$age歲,我去年$age_of_last_year歲") greeting = template.safe_substitute(name=name) print(greeting) # 你好,我的名字是sagegrass,我今年$age歲,我去年$age_of_last_year歲
不常用做法
字符串拼接
還有一些做法,不是很好,如非特殊情況,不應(yīng)該作為一個字符串格式化的方法,下面簡單的介紹,但是實際使用中應(yīng)該小心謹(jǐn)慎。
字符串拼接是通過例如+運算符,將多個字符串拼接為一個,它確實可以動態(tài)的生成字符串,不過其實不算是一個格式化字符串的方式。
name = "sagegrass" age = 18 greeting = "你好,我的名字是" + name + ",我今年" + str(age) +"歲,我去年" + str(age - 1) + "歲" print(greeting)
這種方式確實簡單易懂,但是缺點在于性能低下,且難以讀懂(尤其是在拼接字符串的數(shù)量變多的情況下)
str.join()連接
join()其實也不是用于進行字符串格式化的,它通常用于一些其他的功能。它起到了和字符串拼接相似的功能,但是性能通常卻更好一點,理論上是字符串拼接的上位替代,但是仍然不建議這樣做。
name = "sagegrass" age = 18 greeting = "".join(("你好,我的名字是", name, ",我今年", str(age), "歲,我去年", str(age - 1), "歲")) print(greeting)
自定義字符串格式化
只有非常特殊的需求才可能這樣做,一般情況下,這其實比較奇怪。
import re def my_format(template, **kwargs): return re.sub(r'\{(\w+)\}', lambda match: str(kwargs.get(match.group(1), match.group(0))), template) name = "sagegrass" age = 18 greeting = my_format("你好,我的名字是{name},我今年{age}歲,我去年{age_of_last_year}歲", name=name, age=age, age_of_last_year=age - 1) print(greeting)
缺點包括自定義可能產(chǎn)生一些錯誤,或者是性能問題,好處在于可以按照自己的想法自定義格式化字符串的方法,并且添加一些需要的額外功能。
總結(jié)
2024年都快過完了,再有幾個月就是2025年了,對于新的代碼,目前(截止python3.12)應(yīng)該盡可能使用f-string,這在過去可能是一個問題,因為前幾年,可能還有非常多的人在使用python3.5,這個版本沒有f-string功能,但是時至今日,3.7都已經(jīng)很罕見了,f-string的使用也不再是一個“版本”問題了。
以上就是Python中格式化字符串的方法總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于Python格式化字符串的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python數(shù)據(jù)結(jié)構(gòu)dict常用操作代碼實例
這篇文章主要介紹了Python數(shù)據(jù)結(jié)構(gòu)dict常用操作代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03Python批量查詢關(guān)鍵詞微信指數(shù)實例方法
在本篇文章中小編給大家整理的是關(guān)于Python批量查詢關(guān)鍵詞微信指數(shù)實例方法以及相關(guān)代碼,需要的朋友們可以跟著學(xué)習(xí)下。2019-06-06基于Python3.7.1無法導(dǎo)入Numpy的解決方式
這篇文章主要介紹了基于Python3.7.1無法導(dǎo)入Numpy的解決方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03