https://miguendes.me/73-examples-to-help-you-master-pythons-f-strings
PythonのF文字列とは何ですか-別名リテラル文字列補間?
文字列のフォーマットは、Pythonの歴史の中でかなり進化してきました。Python2.6より前は、文字列をフォーマットするには、%演算子またはstring.Templateモジュールのいずれかを使用していました。しばらくして、このstr.formatメソッドが登場し、文字列をフォーマットするためのより柔軟で堅牢な方法が言語に追加されました。
%:を使用した古い文字列のフォーマット
>>> msg = 'hello world'>>> 'msg: %s' % msg
'msg: hello world'
使用string.format:
>>> msg = 'hello world'>>> 'msg: {}'.format(msg)
'msg: hello world'
フォーマットをさらに簡素化するために、2015年に EricSmithはPEP498 –Literal StringInterpolationを 提案しました。
PEP 498は、この新しい文字列補間を、の代わりにシンプルで使いやすいものとして提示しましたstr.format。必要なのはf""、文字列の先頭にもう1文字—だけでした。
f文字列の使用:
>>> msg = 'hello world'>>> f'msg: {msg}''msg: hello world'
そしてそれはそれでした!str.formatまたはを使用する必要はありません%。ただし、f文字列はstr.format完全には置き換えられません。このガイドでは、それらが適切でない例を示します。
Pythonを使用した基本的な文字列フォーマット
前のセクションで示したように、f-stringsを使用して文字列をフォーマットするのは非常に簡単です。唯一の要件は、有効な式を提供することです。f文字列は大文字Fで始めることもでき、生の文字列と組み合わせることができます。ただし、バイトb""や"u"。と混在させることはできません。
>>> book = "The dog guide"
>>> num_pages = 124
>>> f"The book {book} has {num_pages} pages"'The book The dog guide has 124 pages'
>>> F"The book {book} has {num_pages} pages"'The book The dog guide has 124 pages'
>>> print(Fr"The book {book} has {num_pages} pages\n")
The book The dog guide has 124 pages\n
>>> print(FR"The book {book} has {num_pages} pages\n")
The book The dog guide has 124 pages\n
>>> print(f"The book {book} has {num_pages} pages\n")
The book The dog guide has 124 pages
そして、それはほとんどそれです!次のセクションでは、f文字列を使用して実行できること(実行できないこと)の例をいくつか示します。
制限事項
f-stringは非常に便利ですが、str.format完全に置き換えられるわけではありません。f文字列は、式が表示されるコンテキストで式を評価します。PEP 498に よると 、これは、式がローカル変数とグローバル変数に完全にアクセスできることを意味します。これらは、実行時に評価される式でもあります。内で使用されている式を{ <expr> }評価できない場合、インタプリタは例外を発生させます。
>>> f"{name}"
<span style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: rgb(238, 238, 238); font-size: 16px; font-weight: bold; –text-opacity: 1; border-radius: 0px; background: transparent;"–<————————————————————————-
NameError Traceback (most recent call last)
<ipython-input-1-f0acc441190f> in <module>
<span style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: rgb(238, 238, 238); font-size: 16px; font-weight: bold; –text-opacity: 1; border-radius: 0px; background: transparent;"–<–> 1 f"{name}"
NameError: name 'name' is not defined
str.formatテンプレート文字列を定義してから呼び出し.formatてコンテキストを渡すことができるため、これはメソッドにとって問題ではありません。
>>> s = "{name}"
>>> s.format(name="Python")
'Python'
>>> print(s)
{name}
もう1つの制限は、f文字列内でインラインコメントを使用できないことです。
>>> f"My name is {name #name}!"
File "<ipython-input-37-0ae1738dd871>", line 1
f"My name is {name #name}!"
^
SyntaxError: f-string expression part cannot include '#'
式をフォーマットする方法
変数を定義したくない場合は、角かっこ内でリテラルを使用できます。Pythonは式を評価し、最終結果を表示します。
>>> f"4 * 4 is {4 * 4}"'4 * 4 is 16'
またはあなたが好むなら…
>>> n = 4
>>> f"4 * 4 is {n * n}"'4 * 4 is 16'
F文字列を使用してコードをデバッグする方法
f-stringの最も頻繁な使用法の1つは、デバッグです。Python 3.8より前は、多くの人がそうhello = 42; f"hello = {hello}"していましたが、これは非常に反復的です。その結果、Python3.8は新しい機能をもたらしました。その式を次のように書き直すことができf"{hello=}"、Pythonはを表示しますhello=42。次の例は、関数を使用してこれを示していますが、原理は同じです。
>>> def magic_number():
…: return 42
…:
>>> f"{magic_number() = }"'magic_number() = 42'
異なる基数で整数をフォーマットする方法
f文字列を使用すると、さまざまな基数で整数を表示することもできます。たとえばint、bオプションを使用して、変換せずにバイナリとして表示できます。
>>> f'{7:b}''111'
要約すると、f文字列を使用してフォーマットできます。
int バイナリに
int 16進数に
int 8進数に
int HEXへ(すべての文字が大文字になっている場合)
次の例では、パディング機能と基数の書式設定を使用して、intを他の基数で表示するテーブルを作成します。
>>> bases = {
"b": "bin",
"o": "oct",
"x": "hex",
"X": "HEX",
"d": "decimal"
}
>>> for n in range(1, 21):
…: for base, desc in bases.items():
…: print(f"{n:5{base}}", end=' ')
…: print()
1 1 1 1 1
10 2 2 2 2
11 3 3 3 3
100 4 4 4 4
101 5 5 5 5
110 6 6 6 6
111 7 7 7 7
1000 10 8 8 8
1001 11 9 9 9
1010 12 a A 10
1011 13 b B 11
1100 14 c C 12
1101 15 d D 13
1110 16 e E 14
1111 17 f F 15
10000 20 10 10 16
10001 21 11 11 17
10010 22 12 12 18
10011 23 13 13 19
10100 24 14 14 20
F文字列でオブジェクトを印刷する方法
f文字列を使用してカスタムオブジェクトを印刷できます。デフォルトでは、オブジェクトインスタンスをf-stringに渡すと、__str__メソッドが返すものが表示されます。ただし、明示的な変換フラグを使用してを表示することもできます__repr__。
!r – converts the value to a string using repr().
!s – converts the value to a string using str().
>>> class Color:
def __init__(self, r: float = 255, g: float = 255, b: float = 255):
self.r = r
self.g = g
self.b = b
def __str__(self) -> str:
return "A RGB color"
def __repr__(self) -> str:
return f"Color(r={self.r}, g={self.g}, b={self.b})"
>>> c = Color(r=123, g=32, b=255)
# When no option is passed, the __str__ result is printed>>> f"{c}"'A RGB color'
# When `obj!r` is used, the __repr__ output is printed>>> f"{c!r}"'Color(r=123, g=32, b=255)'
# Same as the default>>> f"{c!s}"'A RGB color'
Pythonでは 、メソッドを介してタイプごとにフォーマットを制御することもできます__format__。次の例は、これらすべてを実行する方法を示しています。
>>> class Color:
def __init__(self, r: float = 255, g: float = 255, b: float = 255):
self.r = r
self.g = g
self.b = b
def __str__(self) -> str:
return "A RGB color"
def __repr__(self) -> str:
return f"Color(r={self.r}, g={self.g}, b={self.b})"
def __format__(self, format_spec: str) -> str:
if not format_spec or format_spec == "s":
return str(self)
if format_spec == "r":
return repr(self)
if format_spec == "v":
return f"Color(r={self.r}, g={self.g}, b={self.b}) – A nice RGB thing."
if format_spec == "vv":
return (
f"Color(r={self.r}, g={self.g}, b={self.b}) "
f"- A more verbose nice RGB thing."
)
if format_spec == "vvv":
return (
f"Color(r={self.r}, g={self.g}, b={self.b}) "
f"- A SUPER verbose nice RGB thing."
)
raise ValueError(
f"Unknown format code '{format_spec}' " "for object of type 'Color'"
)
>>> c = Color(r=123, g=32, b=255)
>>> f'{c:v}''Color(r=123, g=32, b=255) – A nice RGB thing.'
>>> f'{c:vv}''Color(r=123, g=32, b=255) – A more verbose nice RGB thing.'
>>> f'{c:vvv}''Color(r=123, g=32, b=255) – A SUPER verbose nice RGB thing.'
>>> f'{c}''A RGB color'
>>> f'{c:s}''A RGB color'
>>> f'{c:r}''Color(r=123, g=32, b=255)'
>>> f'{c:j}'
<span style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: rgb(238, 238, 238); font-size: 16px; font-weight: bold; –text-opacity: 1; border-radius: 0px; background: transparent;"–<————————————————————————-
ValueError Traceback (most recent call last)
<ipython-input-20-1c0ee8dd74be> in <module>
<span style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: rgb(238, 238, 238); font-size: 16px; font-weight: bold; –text-opacity: 1; border-radius: 0px; background: transparent;"–<–> 1 f'{c:j}'
<ipython-input-15-985c4992e957> in __format__(self, format_spec)
29 f"- A SUPER verbose nice RGB thing."
30 )
<span style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: rgb(238, 238, 238); font-size: 16px; font-weight: bold; –text-opacity: 1; border-radius: 0px; background: transparent;"–<-> 31 raise ValueError(
32 f"Unknown format code '{format_spec}' " "for object of type 'Color'"
33 )
ValueError: Unknown format code 'j' for object of type 'Color'
最後に、a非ASCII文字をエスケープするオプションもあります。詳細については、docs.python.org / 3 / library / Functions.html#as。をご覧ください。
>>> utf_str = "Áeiöu"
>>> f"{utf_str!a}""'\\xc1ei\\xf6u'"
F文字列で浮動小数点数の精度を設定する方法
f文字列を使用すると、str.formatメソッドと同様に浮動小数点数をフォーマットできます。これを行うには、:(コロン)の後に.(ドット)を追加し、小数点以下の桁数にf接尾辞を付けます。
たとえば、floatを小数点以下2桁に丸めて、次のように変数を出力できます。
>>> num = 4.123956
>>> f"num rounded to 2 decimal palces = {num:.2f}"'num rounded to 2 decimal palces = 4.12'
何も指定しない場合、float変数は完全な精度を使用します。
>>> print(f'{num}')
4.123956
数値をパーセンテージとしてフォーマットする方法
Pythonのf文字列には、パーセンテージをフォーマットする非常に便利な方法があります。ルールは%、f。の代わりにを追加することを除いて、floatフォーマットに似ています。数値に100を掛けて、固定形式で表示し、その後にパーセント記号を付けます。精度を指定することもできます。
>>> total = 87
>>> true_pos = 34
>>> perc = true_pos / total
>>> perc
0.39080459770114945
>>> f"Percentage of true positive: {perc:%}"'Percentage of true positive: 39.080460%'
>>> f"Percentage of true positive: {perc:.2%}"'Percentage of true positive: 39.08%'
F文字列にパディングを正当化または追加する方法
<または>文字を使用して、文字列を非常に簡単に正当化できます。
>>> greetings = "hello"
>>> f"She says {greetings:>10}"'She says hello'
# Pad 10 char to the right>>> f"{greetings:>10}"' hello'
>>> f"{greetings:<10}"'hello '
# You can omit the < for left padding>>> f"{greetings:10}"'hello '
>>> a = "1"
>>> b = "21"
>>> c = "321"
>>> d = "4321"
>>> print("\n".join((f"{a:>10}", f"{b:>10}", f"{c:>10}", f"{d:>10}")))
1
21
321
4321
文字をエスケープする方法
値をレンダリングする代わりに中括弧で囲まれた変数名を表示する場合は、doubleを使用してエスケープできます{{<expr>}}。
>>> hello = "world"
>>> f"{{hello}} = {hello}"'{hello} = world'
これで、二重引用符をエスケープしたい場合は、円記号を使用できます\"。
>>> f"{hello} = \"hello\""'world = "hello"'
文字列を中央に配置する方法
文字列の中央揃えは、を使用して実現できます。var:^Nここで、varは表示する変数で、Nは文字列の長さです。場合Nよりも短くなってvar、その後、Pythonは文字列全体を表示します。
>>> hello = "world"
>>> f"{hello:^11}"' world '
>>> f"{hello:*^11}"'***world***'
# Extra padding is added to the right>>> f"{hello:*^10}"'**world***'
# N shorter than len(hello)>>> f"{hello:^2}"'world'
千の区切り文字を追加する方法
f文字列を使用すると、数値をカスタマイズすることもできます。一般的な操作の1つは、1000の場所ごとにアンダースコアを追加して区切ることです。
>>> big_num = 1234567890
>>> f"{big_num:_}"'1_234_567_890'
小数点記号としてコンマを使用して数値をフォーマットする方法
実際、任意の文字を区切り文字として使用できます。区切り文字としてコンマを使用することもできます。
>>> big_num = 1234567890
>>> f"{big_num:,}"'1,234,567,890'
フロートをコンマでフォーマットし、精度を一度に設定することもできます。
>>> num = 2343552.6516251625
>>> f"{num:,.3f}"'2,343,552.652'
小数点記号としてスペースを使用して数値をフォーマットする方法
代わりにスペースを使用するのはどうですか?
まあ、これは少し「ハッキー」ですが、動作します。,区切り文字として使用して、スペースに置き換えることができます。
>>> big_num = 1234567890
>>> f"{big_num:,}".replace(',', ' ')
'1 234 567 890'
もう1つのオプションは、環境のロケールを、スペースを千の区切り記号として使用するロケールに設定することですpl_PL。詳細については、スタックオーバーフローに関するこのスレッドを参照してください。
科学的記数法(指数表記)で数値をフォーマットする方法
eorEオプションを使用すると、科学的記数法で数値をフォーマットできます。
>>> num = 2343552.6516251625
>>> f"{num:e}"'2.343553e+06'
>>> f"{num:E}"'2.343553E+06'
>>> f"{num:.2e}"'2.34e+06'
>>> f"{num:.4E}"'2.3436E+06'
if-elseF文字列での条件付きの使用
f-stringsは、インラインなどのより複雑な式も評価しますif/else。
>>> a = "this is a"
>>> b = "this is b"
>>> f"{a if 10 > 5 else b}"'this is a'
>>> f"{a if 10 < 5 else b}"'this is b'
辞書でF文字列を使用する方法
f文字列で辞書を使用できます。唯一の要件は、式を囲む引用符とは異なる引用符を使用することです。
>>> color = {"R": 123, "G": 145, "B": 255}
>>> f"{color['R']}"'123'
>>> f'{color["R"]}'''123'
>>> f"RGB = ({color['R']}, {color['G']}, {color['B']})"
'RGB = (123, 145, 255)'
F文字列を連結する方法
f文字列の連結は、通常の文字列の連結に似ています。これは、暗黙的に、または+演算子を適用するかstr.joinメソッドを使用して明示的に行うことができます。
# Implicit string concatenation>>> f"{123}" " = " f"{100}" " + " f"{20}" " + " f"{3}"'123 = 100 + 20 + 3'
# Explicity concatenation using '+' operator>>> f"{12}" + " != " + f"{13}"'12 != 13'
# string concatenation using `str.join`>>> " ".join((f"{13}", f"{45}"))
'13 45'
>>> "#".join((f"{13}", f"{45}"))
'13#45'
datetimeオブジェクトをフォーマットする方法
f-stringは、datetimeオブジェクトのフォーマットもサポートします。このプロセスは、str.format日付のフォーマット方法と非常によく似ています。サポートされている形式の詳細については 、公式ドキュメントでこの表を確認してください 。
>>> import datetime
>>> now = datetime.datetime.now()
>>> ten_days_ago = now – datetime.timedelta(days=10)
>>> f'{ten_days_ago:%Y-%m-%d %H:%M:%S}''2020-10-13 20:24:17'
>>> f'{now:%Y-%m-%d %H:%M:%S}''2020-10-23 20:24:17'
F-Stringの無効な構文エラーを修正する方法
正しく使用されていない場合、f文字列はSyntaxError。最も一般的な原因は、二重引用符で囲まれたf文字列内で二重引用符を使用することです。一重引用符についても同じことが言えます。
>>> color = {"R": 123, "G": 145, "B": 255}
>>> f"{color["R"]}"
File "<ipython-input-43-1a7f5d512400>", line 1
f"{color["R"]}"
^
SyntaxError: f-string: unmatched '['
>>> f'{color['R']}'
File "<ipython-input-44-3499a4e3120c>", line 1
f'{color['R']}'
^
SyntaxError: f-string: unmatched '['
もう1つの一般的なケースは、古いバージョンのPythonでf文字列を使用することです。f文字列はPython3.6で導入されました。古いバージョンで使用する場合、インタプリタはを上げますSyntaxError: invalid syntax。
>>> f"this is an old version"
File "<stdin>", line 1
f"this is an old version"
^
SyntaxError: invalid syntax
が表示された場合はinvalid syntax、実行しているPythonのバージョンを再確認してください。私の場合、Python 2.7でテストしましたが、を呼び出すことでバージョンを見つけることができますsys.version。
>>> import sys; print(sys.version)
2.7.18 (default, Apr 20 2020, 19:27:10)
[GCC 8.3.0]
先行ゼロを追加する方法
あなたはフォーマット使って追加することにより、先行ゼロを追加することができます返される文字列の長さを。署名オプションを含めることができます。この場合、は正と負の数に符号を使用する必要があることを意味します。唯一のデフォルトの動作で負の数、のために使用されています。詳細については、文字列形式の仕様ページを確認して ください。{expr:0len}len+–
>>> num = 42
>>> f"{num:05}"'00042'
>>> f'{num:+010}''+000000042'
>>> f'{num:-010}''0000000042'
>>> f"{num:010}"'0000000042'
>>> num = -42
>>> f'{num:+010}''-000000042'
>>> f'{num:010}''-000000042'
>>> f'{num:-010}''-000000042'
複数行のF文字列の書き方(新しい行の処理)
改行文字\nをf文字列とともに使用して、文字列を複数行で印刷できます。
>>> multi_line = (f'R: {color["R"]}\nG: {color["G"]}\nB: {color["B"
…: ]}\n')
>>> multi_line
'R: 123\nG: 145\nB: 255\n'
>>> print(multi_line)
R: 123
G: 145
B: 255
別の方法として、三重引用符を使用して複数行の文字列を表すことができます。改行を追加できるだけでなく、を追加することもできTABます。
>>> other = f"""R: {color["R"]}
…: G: {color["G"]}
…: B: {color["B"]}
…: """
>>> print(other)
R: 123
G: 145
B: 255
TABsの例。
>>> other = f'''
…: this is an example
…:
…: ^Iof color {color["R"]}
…:
…: '''
>>> other
'\nthis is an example\n\n\tof color 123\n \n'
>>> print(other)
this is an example
of color 123
>>>
結論
今日は以上です、皆さん!何か違った便利なことを学んだことを願っています。f-stringを最大限に活用する方法を知っていると、私たちの生活がとても楽になります。この投稿では、私が日常的に使用する最も一般的なトリックを示しました。この投稿が気に入ったら、友達と共有することを検討してください。また、miguendes.meをフォローしてください。
あなたが好きかもしれない他の投稿:
pytestで例外が発生する(または発生しない)かどうかを確認する方法
PythonでAPIクライアントアプリケーションをテストする3つの方法