Pythonにおける文字列フォーマットの実践ガイド:%演算子、formatメソッド、f文字列

%演算子を用いた伝統的なフォーマット

Pythonでは古くからC言語スタイルの%演算子が文字列フォーマットに利用されてきました。現在では後述する新しい手法が推奨されますが、既存コードの読解や簡易的な出力において依然として重要です。

整数の基数変換

整数値を出力する際、%d(10進数)、%o(8進数)、%x(16進数)を用いて基数を切り替えることができます。

value = 42
print('10進数: %d' % value)
print('8進数 : %o' % value)
print('16進数: %x' % value)
# 出力結果:
# 10進数: 42
# 8進数 : 52
# 16進数: 2a

浮動小数点数の精度と表記

浮動小数点数の出力には%f(固定小数点)、%e(指数表記)、%g(自動切り替え)を使用します。ピリオドに続けて桁数を指定することで、表示精度を制御可能です。

pi = 3.14159265
print('標準固定小数点: %f' % pi)
print('小数第2位まで : %.2f' % pi)
print('指数表記      : %e' % pi)
print('有効数字4桁   : %.4g' % pi)
# 出力結果:
# 標準固定小数点: 3.141593
# 小数第2位まで : 3.14
# 指数表記      : 3.141593e+00
# 有効数字4桁   : 3.142

文字列の配置と切り詰め

%sは文字列を埋め込みます。幅指定や配置制御、文字数の切り詰めを組み合わせることで、テーブル形式の出力などに活用できます。

label = 'Data'
print('標準出力   : [%s]' % label)
print('右寄せ10桁 : [%10s]' % label)
print('左寄せ10桁 : [%-10s]' % label)
print('2文字切り詰め: [%.2s]' % label)
print('右寄せ8桁/3文字切り詰め: [%8.3s]' % label)
# 出力結果:
# 標準出力   : [Data]
# 右寄せ10桁 : [      Data]
# 左寄せ10桁 : [Data      ]
# 2文字切り詰め: [Da]
# 右寄せ8桁/3文字切り詰め: [     Dat]

round()関数の挙動に関する注意点

数値の丸め処理には組み込みのround()が利用できますが、Python 3では「銀行丸め(Round Half to Even)」が採用されています。これは、端数がちょうど0.5の場合、結果が偶数になるように丸める仕様です。単純な四捨五入を期待すると意図しない結果になるため、厳密な金銭計算などにはdecimalモジュールの使用を推奨します。

print(round(2.5))  # 2(偶数側へ丸め)
print(round(3.5))  # 4(偶数側へ丸め)
print(round(1.235, 2)) # 1.23(浮動小数点の内部表現の影響も受ける)
print(round(1.245, 2)) # 1.25

str.format()メソッドによる柔軟なフォーマット

str.format()はプレースホルダー{}を使用し、より直感的で高機能なフォーマットを実現します。引数の順序入れ替えやキーワード指定、詳細なフォーマット指定子がサポートされています。

引数のマッピング方法

# 位置引数(自動連番)
print('{} と {}'.format('Apple', 'Orange'))

# 位置引数(インデックス指定による順序変更)
print('{1} と {0} と {1}'.format('Apple', 'Orange'))

# キーワード引数
print('{fruit_a} と {fruit_b}'.format(fruit_a='Grape', fruit_b='Lemon'))
# 出力結果:
# Apple と Orange
# Orange と Apple と Orange
# Grape と Lemon

型変換指定子

コロン:の後に型コードを記述することで、数値の表現形式を変更できます。

num = 255
print('2進数 : {:b}'.format(num))
print('10進数: {:d}'.format(num))
print('8進数 : {:o}'.format(num))
print('16進数: {:x}'.format(num))
print('文字  : {:c}'.format(65))
print('百分率: {:.1%}'.format(0.875))
# 出力結果:
# 2進数 : 11111111
# 10進数: 255
# 8進数 : 377
# 16進数: ff
# 文字  : A
# 百分率: 87.5%

配置・パディング・符号・桁区切り

フォーマット指定ミニ言語を用いて、高度なレイアウト制御が可能です。

  • <:左寄せ、>:右寄せ、^:中央寄せ
  • =:符号と数値の間をパディング(数値専用)
  • +:正の数にも符号を表示、-:負の数のみ表示(デフォルト)、 :正の数にスペースを挿入
  • ,:3桁ごとのカンマ区切り
val = 42
price = 1234567.89
ratio = 0.15

print('中央寄せ/星埋め: {:*^10d}'.format(val))
print('符号強制表示   : {:+d}'.format(val))
print('正数にスペース : {: d}'.format(val))
print('3桁カンマ区切り: {:,.2f}'.format(price))
print('パディングと符号: {:=+10d}'.format(-42))
# 出力結果:
# 中央寄せ/星埋め: ****42****
# 符号強制表示   : +42
# 正数にスペース :  42
# 3桁カンマ区切り: 1,234,567.89
# パディングと符号: -       42

f文字列(フォーマット済み文字列リテラル)の活用

Python 3.6以降では、文字列の先頭にfまたはFを付加するf文字列が導入されました。変数や式を直接{}内に記述できるため、コードの可読性と実行速度の両面で最も推奨される手法です。format()で利用できた指定子はそのまま適用可能です。

user = 'alice'
score = 98.7654
items_count = 15000

# 基本埋め込みとメソッド呼び出し
print(f'ユーザー名: {user.upper()}')

# format()と同じ指定子をコロン以降に記述
print(f'スコア    : {score:8.2f}')
print(f'所持アイテム: {items_count:,}個')

# 式の評価と配置制御
print(f'計算結果  : {score * 1.1:.1f}')
print(f'ステータス: {"ACTIVE":_^12}')
# 出力結果:
# ユーザー名: ALICE
# スコア    :    98.77
# 所持アイテム: 15,000個
# 計算結果  : 108.6
# ステータス: ___ACTIVE___

動的な幅指定や精度指定が必要な場合は、ネストした中括弧を用いてパラメータを注入できます。

target = 'Python'
width = 12
precision = 3
val = 2.71828

print(f'{target:>{width}}')
print(f'{val:.{precision}f}')
# 出力結果:
#       Python
# 2.718

タグ: Python 文字列フォーマット f文字列 str.format %演算子

9月26日 13:09 投稿