Y - 3.03.format と f 文字列 Editorial /

Time Limit: 0 msec / Memory Limit: 0 KiB

前のページ | 次のページ

キーポイント

  • f"{式}" という書き方で、式の値を埋め込んだ文字列を作ることができる。
  • 埋め込む値はさまざまなフォーマット指定ができる。
  • デバッグ用の情報表示や、複雑な出力形式の整形に便利。
  • f-string を用いた f"{val1} {val2}" という記法は format メソッドを用いた "{} {}".format(val1, val2)% 演算子を用いた "%s %s" % (val1, val2) という記法と等価。

f-string とは

f-string は、変数等を埋め込んだ文字列を作成する際に便利な機能です。

例を見てみましょう。以下のコードは、Hello, Takahashi! と出力します。

name = "Takahashi"
print(f"Hello, {name}!")

この例の f"Hello, {name}!" のような文字列を f-string といい、文字列の先頭に f をつけ、式を {} でくくって書くことでその値を埋め込むことができます。

埋め込むことができる式の値は文字列に限らず、また、1つの文字列の中に複数の式を埋め込むこともできます。

int_val = 123
str_val = "a"
print(f"abc{int_val*2}_{str_val}") # 出力: abc246_a
problem = f"abc{int_val*2}_{str_val}"  # 変数 problem の値は 文字列 "abc246_a" になる

できること・使いどころ

f-string 中に埋め込む式の出力フォーマットを細かく指定することもできます。

ここでは競技プログラミングにおいてよく使われる例をいくつか紹介します。ここで紹介するもの以外の詳細は公式ドキュメントを参照してください。

小数点以下の桁数を指定した出力

浮動小数点数を出力する際、小数点以下の桁数を指定することができます。出力される値は、その1つ下の桁で四捨五入1されたものになります。

val = 3.1415
# 小数点以下2桁
print(f"{val:.2f}") # 出力: 3.14
# 小数点以下3桁
print(f"{val:.3f}") # 出力: 3.142
# 小数点以下8桁
print(f"{val:.8f}") # 出力: 3.14150000

数値の10進法以外での出力

2進法、8進法、16進法で出力することができます。

value = 29
# 2進法
print(f"{value:b}")  # 出力: 11101
# 8進法
print(f"{value:o}")  # 出力: 35
# 16進法
print(f"{value:x}")  # 出力: 1d

デバッグ

デバッグの際、プログラムに print 文を追加することで実行途中の変数の値を確認したくなることがあります。もちろん単に print 文を用いてもよいですが、f-string を用いると、式の最後に = をつけるだけで、式そのものとその値を同時に出力することができます。

x = 120
print(f"{x = }")  # 出力: x = 120
print(f"{x * 2 = }")  # 出力: x * 2 = 240
print(f"{x = :b}")  # 出力: x = 1111000

注意

{} 内にクォーテーションを含む場合

python のバージョンが 3.12 より前である場合、f-string 自体を囲むクォーテーションと同じ種類のクォーテーションを {} の中に入れることはできません。

# python 3.11 ではエラー、python 3.12 以降では abc123_a と出力される
print(f"abc123_{"a"}")
# python 3.11 以前でもエラーにならない書き方は以下の通り
print(f"abc123_{'a'}")

format メソッド

f-string は python 3.6 から導入された機能であるため、それ以前の非常に古いバージョンで同様の機能を実現したい場合は、format メソッドや % 演算子を使うことになります。

以下にあげる、f-string を用いた実装、format メソッドを用いた実装、 % 演算子を用いた実装の 3 つのはいずれも同じ結果になります。

int_val = 123
float_val = 3.1415
str_val = "Hello"

# 以下の3つはいずれも "123 7b 3.14 Hello" を出力する

# f-string
print(f"{int_val} {int_val:x} {float_val:.2f} {str_val}")
# format
print("{} {:x} {:.2f} {}".format(int_val, int_val, float_val, str_val))
# % 演算子
print("%d %x %.2f %s" % (int_val, int_val, float_val, str_val))

print, str の機能のみで実現できること

単にいくつかの値を1行にまとめて出力したい場合などは、print メソッドの適切な使い方や、文字列の結合などを用いることで、f-string を使わずに実現することもできます。

val1 = "abc"
val2 = 123
print(val1 + str(val2))  # 出力: abc123
print(val1, val2)  # 出力: abc 123
print(val1, val2, sep=",")  # 出力: abc,123

チートシート表

やりたいこと 記述例
小数点以下の桁数を指定 f"{val:.13f}"
指数形式にする f"{val:e}"
2進法にする f"{val:b}"
16進法にする f"{val:x}"
leading zeroを含て桁数を指定 f"{val:013}"
値が負でないとき先頭に + をつける f"{val:+}"
パーセンテージにする f"{val:%}"
3桁ごとにカンマで区切る f"{val:,}"
指定した幅に右詰め f"{val:>13}"
指定した幅に左詰め f"{val:<13}"

これらは複数組み合わせて使うこともできます。例えば f"{val:032b}", f"{val:.3e}" など。

問題

本節には練習問題はありません。

前のページ | 次のページ


  1. 正確には、 round() メソッド同様の偶数丸めとなります。1.5, 2.5, 3.5 をそれぞれ f"{x:.0f}" で出力した結果を確認してみてください。