Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Python F-Strings lebih berkuasa daripada yang anda fikirkan

Python F-Strings lebih berkuasa daripada yang anda fikirkan

WBOY
WBOYke hadapan
2023-04-17 09:01:021225semak imbas

Python F-Strings lebih berkuasa daripada yang anda fikirkan

Rentetan rentetan berformat – juga dikenali sebagai rentetan f – telah wujud sejak Python 3.6, jadi kita semua tahu apa itu dan cara Menggunakannya. Walau bagaimanapun, anda mungkin tidak mengetahui beberapa ciri f-string yang lebih praktikal dan mudah. Jadi biarkan artikel ini membawa anda melalui beberapa ciri f-strings, dan semoga anda akan menggunakan ciri f-strings yang hebat ini dalam pengekodan harian anda.

Pemformatan Tarikh dan Masa

Menggunakan format nombor menggunakan rentetan f adalah sangat biasa, tetapi adakah anda tahu anda juga boleh memformat rentetan tarikh dan cap waktu ?

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

f-strings boleh digunakan untuk memformat tarikh dan masa sama seperti menggunakan kaedah datetime.strftime. Sangat bagus apabila anda menyedari bahawa terdapat lebih banyak format daripada beberapa yang dinyatakan dalam dokumentasi. Python strftime juga menyokong semua format yang disokong oleh pelaksanaan C yang mendasari, yang mungkin berbeza dari platform ke platform, itulah sebabnya ia tidak disebut dalam dokumentasi. Setelah berkata demikian, anda masih boleh memanfaatkan format ini dan menggunakan contohnya %F yang bersamaan dengan %Y-%m-%d atau %T dsb. Berkesan untuk %H:%M:%S, ia juga patut disebut bahawa %x dan %X ialah format tarikh dan masa pilihan tempat tersebut masing-masing. Penggunaan format ini jelas tidak terhad kepada f-strings. Untuk senarai lengkap format masa lihat:
https://manpages.debian.org/bullseye/manpages-dev/strftime.3.en.html

Nama Pembolehubah dan Nyahpepijat

Salah satu penambahan baru-baru ini kepada fungsi f-string (seperti Python 3.8) ialah keupayaan untuk mencetak nama dan nilai pembolehubah:

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

Ini ciri dipanggil "Nyahpepijat", boleh digabungkan dengan pengubah suai yang lain. Ia juga mengekalkan ruang, jadi f"{x = }" dan f"{x=}" akan menghasilkan rentetan yang berbeza.

Perwakilan rentetan

Apabila mencetak tika kelas, __str__ menggunakan kaedah kelas secara lalai untuk mewakili rentetan. Walau bagaimanapun, jika kita mahu memaksa penggunaan __repr__, kita boleh menggunakan bendera penukaran !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

Kita boleh juga hanya repr(some_var) dipanggil di dalam rentetan f, tetapi menggunakan bendera penukaran ialah kebiasaan yang baik dan penyelesaian yang kemas.

Prestasi cemerlang f-strings

Ciri-ciri berkuasa dan gula sintaksis selalunya datang pada penalti prestasi, tetapi ini tidak berlaku dengan f-strings:

# 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!

Contoh di atas telah diuji menggunakan modul timeit seperti berikut: python -m timeit -s 'x, y = "Hello", " World "' 'f"{x} {y}"'Seperti yang anda lihat, f-strings sebenarnya adalah yang terpantas daripada semua pilihan pemformatan yang ditawarkan Python. Jadi, walaupun anda lebih suka menggunakan beberapa pilihan pemformatan yang lebih lama, anda mungkin mempertimbangkan untuk beralih kepada rentetan f hanya untuk prestasi yang lebih baik.

Fungsi penuh spesifikasi pemformatan

F-strings menyokong Format Specification Mini-Language Python, jadi anda boleh menambah pengubah padanya Terdapat banyak operasi pemformatan yang dibenamkan dalam:

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

Bahasa Mini Spesifikasi Format Python termasuk lebih daripada sekadar pilihan untuk memformat nombor dan tarikh. Ia membolehkan kami menjajarkan atau memusatkan teks, menambah sifar/ruang utama, menetapkan beribu-ribu pemisah dan banyak lagi. Semua ini jelas terpakai bukan sahaja untuk f-strings, tetapi untuk semua pilihan pemformatan lain.

Rentetan f bersarang

Jika rentetan f asas tidak mencukupi untuk keperluan pemformatan anda, anda malah boleh menyarangkannya antara satu sama lain:

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 模块/特性的文档页面。深入研究文档通常会帮助你发现一些非常有用的功能。

Atas ialah kandungan terperinci Python F-Strings lebih berkuasa daripada yang anda fikirkan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:51cto.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam