ホームページ  >  記事  >  バックエンド開発  >  Python F-Strings は思っているよりも強力です

Python F-Strings は思っているよりも強力です

WBOY
WBOY転載
2023-04-17 09:01:021224ブラウズ

Python F-Strings は思っているよりも強力です

フォーマット文字列リテラル (f 文字列とも呼ばれます) は Python 3.6 から存在するため、誰もがそれが何であり、どのように使用するかを知っています。ただし、f 文字列のより実用的で便利な機能のいくつかについてはご存じないかもしれません。この記事では、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 実装でサポートされるすべての形式もサポートしていますが、プラットフォームごとに異なる可能性があるため、ドキュメントには記載されていません。そうは言っても、これらの形式を利用して、たとえば %Y-%m-%d または %T と同等の %F を使用することはできます。 %H:%M:%S と同等ですが、%x%X がそれぞれロケールで優先される日付と時刻の形式であることにも言及する価値があります。これらの形式の使用は、明らかに f-string に限定されません。時刻形式の完全なリストについては、次を参照してください:
https://manpages.debian.org/bullseye/manpages-dev/strftime.3.en.html

変数名とデバッグ

f-string 機能 (Python 3.8 以降) に最近追加された機能の 1 つは、変数名と値を出力する機能です:

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

この機能は "Debug" と呼ばれ、他の 修飾子 と組み合わせて使用​​できます。また、スペースも保持されるため、f"{x = }"f"{x=}" は異なる文字列を生成します。

文字列表現

クラス インスタンスを出力するとき、__str__default はクラス メソッドを使用して文字列を表します。ただし、__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 文字列の優れたパフォーマンス

強力な機能と糖衣構文にはパフォーマンスが低下することがよくありますが、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-string は、Python が提供するすべての書式設定オプションの中で実際には最も高速です。したがって、古いフォーマット オプションの一部を使用したい場合でも、パフォーマンスの向上のためだけに f-string に切り替えることを検討することもできます。

フォーマット仕様の全機能

F 文字列は Python の フォーマット仕様ミニ言語 をサポートしているため、修飾子を追加できます 多くのフォーマット操作

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 の フォーマット仕様ミニ言語 には、数値や日付をフォーマットするオプションだけではありません。これにより、テキストの位置揃えや中央揃え、先頭のゼロ/スペースの追加、桁区切り記号の設定などが可能になります。これはすべて、f-string だけでなく、他のすべての書式設定オプションにも明らかに当てはまります。

ネストされた f-strings

基本的な f-string が書式設定のニーズに十分でない場合は、相互にネストすることもできます:

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事は51cto.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。