【導語】:本文介紹了“格式化字符串常量”f-strings
一些不常見的特性,包括:格式化日期和時間、同時打印變量名和變量值等,嵌套使用f-strings
等,此外與其他格式化字符串的方法相比,f-strings
的速度更快,因此,學習這些新特性有助于開發者更好地處理字符串。
簡介
f-strings,也稱為格式化字符串常量(formatted string literals),是Python3.6引入的一種字符串格式化方法,它的使用方式為f'xxx',只需將要替換的字段放到{}
中,就可以格式化字符串了。相信很多讀者已經使用過f-strings了。然而許多好用的特性你可能還未使用過,我們來一起學習下。Python開發者之前還分享一篇包含73個f-string例子的文章,建議收藏一起閱讀。
1. 格式化日期和時間
用f-strings格式化數字很常見,但你知道f-strings也可以用來格式化日期和時間戳字符串嗎?
importdatetime
today=datetime.datetime.today()
print(f"{today:%Y-%m-%d}")
#2022-07-04
print(f"{today:%Y}")
#2022
f-strings可以格式化日期和時間,它與datetime.strftime
的功能一樣。同時,所有底層C實現所支持的格式,在Python的strftime中也可以使用。但在不同的平臺上,使用方式可能有所不同。你可以在Linux manpages[1]上查閱相關信息,例如%F
相當于%Y-%m-%d
,%T
相當于%H:%M:%S
,此外%x
和%X
分別是設置地區首選的日期和時間格式。
2. 變量名和調試
f-strings最近新增的一個特性是可以同時打印變量名和變量值(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
該特性被稱為“調試”,可以與其他修飾符結合使用。它還能檢測到空格,因此f"[x =]和f"[x =]"會產生不同的結果。
3. __repr__ and __str__
當輸出類的實例時,默認使用的是類的__str__
方法。如果我們想將默認方法改為__repr__
,可以使用!r
進行轉換。
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
我們也可以調用f-string內部的repr(some_var)
方法,但直接使用轉化標志顯然更加方便。
4. f-strings的性能更優
通常新特性和語法糖的提出都是以犧牲性能為代價的,但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微秒-最慢!
以上所有示例的耗費時間均是用timeit模塊測試的,例如我們想測試f-strings,就可以這樣做:python -m timeit -s 'x, y = "Hello", "World"' 'f"{x} {y}"'
,由測試結果可知,f-strings是所有方法中最快的,因此非常推薦使用該方法。
5. 格式化標準
f-strings支持Python的格式化標準[2],所以我們可以在修飾符中進行多種格式化操作:
text="helloworld"
#文本居中:
print(f"{text:^15}")
#'helloworld'
number=1234567890
#加入分隔符
print(f"{number:,}")
#1,234,567,890
number=123
#在起始位置補0
print(f"{number:08}")
#00000123
通過使用Python的格式化功能,不僅可以格式化數字和日期,還可以對齊或居中文本,在字符串前面添加0或者空格,添加分隔符。這些特性也可以在其他格式化方法中使用。
6. f-strings的嵌套使用
如果f-strings的基本功能不能滿足你的需求,你還可以將其嵌套使用,假如我們想在一個數字前加上$
符號,可以這樣做:
number=254.3463
print(f"{f'${number:.3f}':>10s}")
#'$254.346'
如果你需要在格式符中加入變量,也可以使用嵌套的f-strings。這樣f-string的可讀性也更強:
importdecimal
width=8
precision=3
value=decimal.Decimal("42.12345")
print(f"output:{value:{width}.{precision}}")
#'output:42.1'
7. 分情況格式化字符串
在嵌套使用f-strings的基礎上,我們還可以在其內部使用三元條件操作符:
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表達式
我們也可以在f-strings中使用lambda表達式,在如下的例子中,我們需要把lambda表達式放到括號中,否則:
會被f-strings當作字符串:
print(f"{(lambdax:x**2)(3)}")
#9
結論
通過前面的使用,我們可以看到f-strings還有許多好用的特性,然而許多讀者可能沒有用過這些特性。因此在平時的學習中,我們還可以查看其他模塊的官方文檔,也許你會發現一些有趣的東西。
審核編輯:湯梓紅
-
字符串
+關注
關注
1文章
577瀏覽量
20485 -
python
+關注
關注
56文章
4782瀏覽量
84452
原文標題:實用!f-strings 比你想象的還要強大
文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論