検索
連載

[解決!Python]f文字列の置換フィールドをネストさせて、整数や浮動小数点数の書式化方法を動的に切り替えるには解決!Python

f文字列の置換フィールドの内部にはさらに置換フィールドを記述できる。これを使って、複数の値を1つの置換フィールドに埋め込める。その使用例を紹介。

PC用表示 関連情報
Share
Tweet
LINE
Hatena
「解決!Python」のインデックス

連載目次

# 浮動小数点数の精度を変更する
n = 123.4567

result = f'{n:.5f}'
print(result)  # 123.45670

precision = 5
result = f'{n:.{precision}f}' 
print(result)  # 123.45670

for precision in range(5):
    result = f'{n:.{precision}f}'
    print(result)
# 出力結果:
#123
#123.5
#123.46
#123.457
#123.4567

# 2進/10進/16進の切り替え
n = 2050

for flg in ['b', 'd', 'x']:
    tmp = "_b" if flg == "b" else "#08x" if flg == "x" else "+08d"
    result = f'{n:{tmp}}'
    print(result)
# 出力結果:
#1000_0000_0010
#+0002050
#0x000802


f文字列の置換フィールドをネストさせる

 Pythonのf文字列では置換フィールド内に置換フィールドをネストさせて記述できる。例えば、以下のようなコードについて考える。

n = 123.4567

result = f'{n:.5f}'
print(result)  # 123.45670


 この例では置換フィールド(波かっこ「{}」で囲まれた部分)に変数nの値を小数点以下5桁の値として埋め込んでいる。何らかの理由で、小数点以下の有効桁数をコードの実行時に動的に変更したくなったとしよう。この値を変数precisionに格納するとする。すると、これを実現するコードは次のようになる。

precision = 5
result = f'{n:.{precision}f}' 
print(result)  # 123.45670


 ここでは、変数nと変数precisionという2つの値を1つの置換フィールドに埋め込む必要があるので、置換フィールドをネストさせている。単一のf文字列で別々の部分に置換フィールドを置いて、それらに変数や式の値を埋め込むのであれば、このようにネストさせる必要はない。

 置換フィールドをネストさせることで、複数の変数や式の値をf文字列に埋め込める。以下は小数点以下の有効桁数を増やしながら、変数nの値を出力する例だ。

for precision in range(5):
    result = f'{n:.{precision}f}'
    print(result)
# 出力結果:
#123
#123.5
#123.46
#123.457
#123.4567


 小数点以下の有効桁数が切り替わっていることに注目されたい。

 もう1つ例を示す。これは整数値を2進/10進/16進のいずれかで表示するものだ。それぞれの形式で出力する際には、2進なら4桁ごとにアンダースコアが表示されるようにするなど、追加のフォーマットも指定している。

 1つのf文字列でこれら全てを記述してもよいのだが、ここでは書式指定を独立した変数tmpに代入した後に、それを最終的なf文字列に埋め込むようにしている。

n = 2050

for flg in ['b', 'd', 'x']:
    tmp = "_b" if flg == "b" else "#08x" if flg == "x" else "+08d"
    result = f'{n:{tmp}}'
    print(result)
# 出力結果:
#1000_0000_0010
#+0002050
#0x000802


 ループ変数flgの値によって、出力形式が切り替わっている点に注目されたい。

 ユーザーに出力形式を選択してもらうような処理を行う際には、置換フィールドのネストがうまく使えるだろう。

「解決!Python」のインデックス

解決!Python

Copyright© Digital Advantage Corp. All Rights Reserved.

[an error occurred while processing this directive]
ページトップに戻る