Python F-Strings 比你想象的更強大
格式化字符串文字——也稱為f 字符串——自 Python 3.6 以來就已經存在,所以我們都知道它們是什么以及如何使用它們。然而,你可能不知道 f-strings的一些比較實用跟方便的功能。因此讓這篇文章帶你了解一下f-strings的一些功能,希望你在日常編碼中使用的這些很棒的 f-strings功能。
日期和時間格式
使用 f 字符串應用數(shù)字格式非常常見,但你知道你還可以格式化日期和時間戳字符串嗎?
f-strings 可以像使用datetime.strftime方法一樣格式化日期和時間。當你意識到除了文檔中提到的幾種格式之外還有更多格式時,這非常好。Python strftime還支持底層 C 實現(xiàn)支持的所有格式,這可能因平臺而異,這就是文檔中未提及的原因。話雖如此,你仍然可以利用這些格式并使用例如%F,它等效于%Y-%m-%d或%T等效于%H:%M:%S,還值得一提的是%x和%X分別是語言環(huán)境首選的日期和時間格式。這些格式的使用顯然不限于 f 字符串。有關時間格式的完整列表請參閱:
https://manpages.debian.org/bullseye/manpages-dev/strftime.3.en.html
變量名和調試
f-string 功能(從 Python 3.8 開始)最近新增的功能之一是能夠打印變量名稱和值:
此功能稱為“調試”,可以與其他修飾符結合使用。它還保留空格,因此f"{x = }"和f"{x=}"將產生不同的字符串。
字符串表示
打印類實例時,__str__默認使用類的方法來表示字符串。但是,如果我們想強制使用__repr__,我們可以使用!r轉換標志:
我們也可以只repr(some_var)在 f 字符串內部調用,但使用轉換標志是一個很好的習慣和簡潔的解決方案。
f-strings杰出的性能表現(xiàn)
強大的功能和語法糖通常會帶來性能損失,但對于 f 字符串而言情況并非如此:
上面的示例使用timeit如下模塊進行了測試:python -m timeit -s 'x, y = "Hello", "World"' 'f"{x} {y}"'正如你所看到的,f 字符串實際上是 Python 提供的所有格式化選項中最快的。因此,即使你更喜歡使用一些較舊的格式化選項,你也可以考慮切換到 f-strings 只是為了提高性能。
格式化規(guī)范的全部功能
F-strings 支持 Python 的Format Specification Mini-Language,所以你可以在它們的修飾符中嵌入很多格式化操作:
Python 的Format Specification Mini-Language不僅僅包括格式化數(shù)字和日期的選項。它允許我們對齊或居中文本、添加前導零/空格、設置千位分隔符等等。所有這些顯然不僅適用于 f 字符串,而且適用于所有其他格式設置選項。
嵌套 f-strings
如果基本的 f-strings 不足以滿足你的格式化需求,你甚至可以將它們相互嵌套:
你可以將 f-strings 嵌入 f-strings 中以解決棘手的格式化問題,例如將美元符號添加到右對齊的浮點數(shù),如上所示。
如果你需要在格式說明符部分使用變量,也可以使用嵌套的 f 字符串。這也可以使 f 字符串更具可讀性:
條件格式
在上面帶有嵌套 f 字符串的示例之上,我們可以更進一步,在內部 f 字符串中使用三元條件運算符:
lambda表達式
如果你想突破 f-strings 的限制,同時讓閱讀你代碼的人覺得你很牛逼,那么你可以使用 lambdas
在這種情況下,lambda 表達式周圍的括號是強制性的,因為:否則將由 f 字符串解釋。
結束語
正如我們在這里看到的,f-strings確實非常強大,并且具有比大多數(shù)人想象的更多的功能。然而,大多數(shù)這些"未知"特性在 Python 文檔中都有提及,因此我建議你不僅閱讀 f-strings,還閱讀你可能使用的任何其他 Python 模塊/特性的文檔頁面。深入研究文檔通常會幫助你發(fā)現(xiàn)一些非常有用的功能。