【導(dǎo)語】:本文介紹了“格式化字符串常量”f-strings
一些不常見的特性,包括:格式化日期和時(shí)間、同時(shí)打印變量名和變量值等,嵌套使用f-strings
等,此外與其他格式化字符串的方法相比,f-strings
的速度更快,因此,學(xué)習(xí)這些新特性有助于開發(fā)者更好地處理字符串。
簡(jiǎn)介
f-strings,也稱為格式化字符串常量(formatted string literals),是Python3.6引入的一種字符串格式化方法,它的使用方式為f'xxx',只需將要替換的字段放到{}
中,就可以格式化字符串了。相信很多讀者已經(jīng)使用過f-strings了。然而許多好用的特性你可能還未使用過,我們來一起學(xué)習(xí)下。Python開發(fā)者之前還分享一篇包含73個(gè)f-string例子的文章,建議收藏一起閱讀。
1. 格式化日期和時(shí)間
用f-strings格式化數(shù)字很常見,但你知道f-strings也可以用來格式化日期和時(shí)間戳字符串嗎?
importdatetime
today=datetime.datetime.today()
print(f"{today:%Y-%m-%d}")
#2022-07-04
print(f"{today:%Y}")
#2022
f-strings可以格式化日期和時(shí)間,它與datetime.strftime
的功能一樣。同時(shí),所有底層C實(shí)現(xiàn)所支持的格式,在Python的strftime中也可以使用。但在不同的平臺(tái)上,使用方式可能有所不同。你可以在Linux manpages[1]上查閱相關(guān)信息,例如%F
相當(dāng)于%Y-%m-%d
,%T
相當(dāng)于%H:%M:%S
,此外%x
和%X
分別是設(shè)置地區(qū)首選的日期和時(shí)間格式。
2. 變量名和調(diào)試
f-strings最近新增的一個(gè)特性是可以同時(shí)打印變量名和變量值(Python 3.8及之后的版本均可使用):
x=10
y=25
print(f"x={x},y={y}")
#x=10,y=25
print(f"{x=},{y=}")#更方便!(3.8+)
#x=10,y=25
print(f"{x=:.3f}")
#x=10.000
該特性被稱為“調(diào)試”,可以與其他修飾符結(jié)合使用。它還能檢測(cè)到空格,因此f"[x =]和f"[x =]"會(huì)產(chǎn)生不同的結(jié)果。
3. __repr__ and __str__
當(dāng)輸出類的實(shí)例時(shí),默認(rèn)使用的是類的__str__
方法。如果我們想將默認(rèn)方法改為__repr__
,可以使用!r
進(jìn)行轉(zhuǎn)換。
classUser:
def__init__(self,first_name,last_name):
self.first_name=first_name
self.last_name=last_name
def__str__(self):
returnf"{self.first_name}{self.last_name}"
def__repr__(self):
returnf"User'snameis:{self.first_name}{self.last_name}"
user=User("John","Doe")
print(f"{user}")
#JohnDoe
print(f"{user!r}")
#User'snameis:JohnDoe
我們也可以調(diào)用f-string內(nèi)部的repr(some_var)
方法,但直接使用轉(zhuǎn)化標(biāo)志顯然更加方便。
4. f-strings的性能更優(yōu)
通常新特性和語法糖的提出都是以犧牲性能為代價(jià)的,但f-strings成功做到了兩者兼顧:
#python-mtimeit-s'x,y="Hello","World"''f"{x}{y}"'
fromstringimportTemplate
x,y="Hello","World"
print(f"{x}{y}")#39.6納秒-最快!
print(x+""+y)#43.5納秒
print("".join((x,y)))#58.1納秒
print("%s%s"%(x,y))#103納秒
print("{}{}".format(x,y))#141納秒
print(Template("$x$y").substitute(x=x,y=y))#1.24微秒-最慢!
以上所有示例的耗費(fèi)時(shí)間均是用timeit模塊測(cè)試的,例如我們想測(cè)試f-strings,就可以這樣做:python -m timeit -s 'x, y = "Hello", "World"' 'f"{x} {y}"'
,由測(cè)試結(jié)果可知,f-strings是所有方法中最快的,因此非常推薦使用該方法。
5. 格式化標(biāo)準(zhǔn)
f-strings支持Python的格式化標(biāo)準(zhǔn)[2],所以我們可以在修飾符中進(jìn)行多種格式化操作:
text="helloworld"
#文本居中:
print(f"{text:^15}")
#'helloworld'
number=1234567890
#加入分隔符
print(f"{number:,}")
#1,234,567,890
number=123
#在起始位置補(bǔ)0
print(f"{number:08}")
#00000123
通過使用Python的格式化功能,不僅可以格式化數(shù)字和日期,還可以對(duì)齊或居中文本,在字符串前面添加0或者空格,添加分隔符。這些特性也可以在其他格式化方法中使用。
6. f-strings的嵌套使用
如果f-strings的基本功能不能滿足你的需求,你還可以將其嵌套使用,假如我們想在一個(gè)數(shù)字前加上$
符號(hào),可以這樣做:
number=254.3463
print(f"{f'${number:.3f}':>10s}")
#'$254.346'
如果你需要在格式符中加入變量,也可以使用嵌套的f-strings。這樣f-string的可讀性也更強(qiáng):
importdecimal
width=8
precision=3
value=decimal.Decimal("42.12345")
print(f"output:{value:{width}.{precision}}")
#'output:42.1'
7. 分情況格式化字符串
在嵌套使用f-strings的基礎(chǔ)上,我們還可以在其內(nèi)部使用三元條件操作符:
importdecimal
value=decimal.Decimal("42.12345")
print(f'Result:{value:{"4.3"ifvalue100?else?"8.3"}}')
#Result:42.1
value=decimal.Decimal("142.12345")
print(f'Result:{value:{"4.2"ifvalue100?else?"8.3"}}')
#Result:142
8. Lambda表達(dá)式
我們也可以在f-strings中使用lambda表達(dá)式,在如下的例子中,我們需要把lambda表達(dá)式放到括號(hào)中,否則:
會(huì)被f-strings當(dāng)作字符串:
print(f"{(lambdax:x**2)(3)}")
#9
結(jié)論
通過前面的使用,我們可以看到f-strings還有許多好用的特性,然而許多讀者可能沒有用過這些特性。因此在平時(shí)的學(xué)習(xí)中,我們還可以查看其他模塊的官方文檔,也許你會(huì)發(fā)現(xiàn)一些有趣的東西。
審核編輯:湯梓紅
-
字符串
+關(guān)注
關(guān)注
1文章
590瀏覽量
22313 -
python
+關(guān)注
關(guān)注
56文章
4827瀏覽量
86825
原文標(biāo)題:實(shí)用!f-strings 比你想象的還要強(qiáng)大
文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
LABVIEW中的printf函數(shù)---格式化寫入字符串函數(shù)
labview 的格式化字符串,請(qǐng)問選項(xiàng)的參數(shù)是0x%02x是什么意思?
C語言技巧 sprintf()函數(shù):將格式化的數(shù)據(jù)寫入字符串
2.6 python字符串格式化
剖析提升字符串格式化效率的小技巧

strtok拆分字符串

評(píng)論