首頁  >  文章  >  後端開發  >  Python F-Strings 比你想像的更強大

Python F-Strings 比你想像的更強大

WBOY
WBOY轉載
2023-04-17 09:01:021225瀏覽

Python F-Strings 比你想像的更強大

格式化字串文字-也稱為f 字串-自Python 3.6 以來就已經存在,所以我們都知道它們是什麼以及如何使用它們。然而,你可能不知道 f-strings的一些比較實用跟方便的功能。因此讓這篇文章帶你了解f-strings的一些功能,希望你在日常程式設計中使用的這些很棒的 f-strings功能。

日期和時間格式

使用f 字串應用數字格式非常常見,但你知道你還可以格式化日期和時間戳字串嗎?

import datetime
today = datetime.datetime.today()
print(f"{today:%Y-%m-%d}")
# 2023-02-03
print(f"{today:%Y}")
# 2023

f-strings 可以像使用datetime.strftime方法一樣格式化日期和時間。當你意識到除了文件中提到的幾種格式之外還有更多格式時,這非常好。 Python strftime也支援底層 C 實作支援的所有格式,這可能會因平台而異,這就是為什麼文件中未提及的原因。話雖如此,你仍然可以利用這些格式並使用例如%F,它等效於%Y-%m-%d%T等效於%H:%M:%S,還值得一提的是%x%X分別是語言環境首選的日期和時間格式。這些格式的使用顯然不限於 f 字串。時間格式的完整清單請參閱:
https://manpages.debian.org/bullseye/manpages-dev/strftime.3.en.html

變數名稱和偵錯

f-string 功能(從Python 3.8 開始)最近新增的功能之一是能夠列印變數名稱和值:

x = 10
y = 25
print(f"x = {x}, y = {y}")
# x = 10, y = 25
print(f"{x = }, {y = }")# Better! (3.8+)
# x = 10, y = 25

print(f"{x = :.3f}")
# x = 10.000

此函數稱為“調試”,可以與其他修飾符結合使用。它也保留空格,因此f"{x = }"f"{x=}"將產生不同的字串。

字串表示

列印類別實例時,__str__預設使用類別的方法來表示字串。但是,如果我們想要強制使用__repr__,我們可以使用!r轉換標誌:

class User:
def __init__(self, first_name, last_name):
self.first_name = first_name
self.last_name = last_name

def __str__(self):
return f"{self.first_name} {self.last_name}"

def __repr__(self):
return f"User's name is: {self.first_name} {self.last_name}"

user = User("John", "Doe")
print(f"{user}")
# John Doe
print(f"{user!r}")
# User's name is: John Doe

我們也可以只repr (some_var)在f 字串內部調用,但使用轉換標誌是一個很好的習慣和簡潔的解決方案。

f-strings傑出的效能表現

強大的功能和語法糖通常會帶來效能損失,但對於f 字串而言並非如此:

# python -m timeit -s 'x, y = "Hello", "World"' 'f"{x} {y}"'
from string import Template

x, y = "Hello", "World"

print(f"{x} {y}")# 39.6 nsec per loop - Fast!
print(x + " " + y)# 43.5 nsec per loop
print(" ".join((x, y)))# 58.1 nsec per loop
print("%s %s" % (x, y))# 103 nsec per loop
print("{} {}".format(x, y))# 141 nsec per loop
print(Template("$x $y").substitute(x=x, y=y))# 1.24 usec per loop - Slow!

上面的範例使用timeit如下模組進行了測試:python -m timeit -s 'x, y = "Hello", "World" ' 'f"{x} {y}"'正如你所看到的,f 字串實際上是Python 提供的所有格式化選項中最快的。因此,即使你更喜歡使用一些較舊的格式化選項,你也可以考慮切換到 f-strings 只是為了提高效能。

格式化規範的完整功能

F-strings 支援Python 的Format Specification Mini-Language,所以你可以在它們的修飾符中嵌入很多格式化操作:

text = "hello world"

# Center text:
print(f"{text:^15}")
# 'hello world'

number = 1234567890
# Set separator
print(f"{number:,}")
# 1,234,567,890

number = 123
# Add leading zeros
print(f"{number:08}")
# 00000123

Python 的Format Specification Mini-Language不僅僅包括格式化數字和日期的選項。它允許我們對齊或居中文字、新增前導零/空格、設定千位分隔符號等等。所有這些顯然不僅適用於 f 字串,而且適用於所有其他格式設定選項。

嵌套f-strings

如果基本的f-strings 不足以滿足你的格式化需求,你甚至可以將它們相互嵌套:

number = 254.3463
print(f"{f'${number:.3f}':>10s}")
# '$254.346'

你可以将 f-strings 嵌入 f-strings 中以解决棘手的格式化问题,例如将美元符号添加到右对齐的浮点数,如上所示。

如果你需要在格式说明符部分使用变量,也可以使用嵌套的 f 字符串。这也可以使 f 字符串更具可读性:

import decimal
width = 8
precision = 3
value = decimal.Decimal("42.12345")
print(f"output: {value:{width}.{precision}}")
# 'output: 42.1'

条件格式

在上面带有嵌套 f 字符串的示例之上,我们可以更进一步,在内部 f 字符串中使用三元条件运算符:

import decimal
value = decimal.Decimal("42.12345")
print(f'Result: {value:{"4.3" if value < 100 else "8.3"}}')
# Result: 42.1
value = decimal.Decimal("142.12345")
print(f'Result: {value:{"4.2" if value < 100 else "8.3"}}')
# Result:142

lambda表达式

如果你想突破 f-strings 的限制,同时让阅读你代码的人觉得你很牛逼,那么你可以使用 lambdas

print(f"{(lambda x: x**2)(3)}")
# 9

在这种情况下,lambda 表达式周围的括号是强制性的,因为:否则将由 f 字符串解释。

结束语

正如我们在这里看到的,f-strings确实非常强大,并且具有比大多数人想象的更多的功能。然而,大多数这些"未知"特性在 Python 文档中都有提及,因此我建议你不仅阅读 f-strings,还阅读你可能使用的任何其他 Python 模块/特性的文档页面。深入研究文档通常会帮助你发现一些非常有用的功能。

以上是Python F-Strings 比你想像的更強大的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:51cto.com。如有侵權,請聯絡admin@php.cn刪除