note.nkmk.me

Pythonのf文字列(フォーマット済み文字列リテラル)の使い方

Date: 2018-06-11 / tags: Python, 文字列操作
このエントリーをはてなブックマークに追加

Python3.6からf文字列(f-strings、フォーマット文字列、フォーマット済み文字列リテラル)という仕組みが導入され、冗長だった文字列メソッドformat()をより簡単に書けるようになった。

3.5以前のバージョンでは使えないので注意。

以下の内容について説明する。

  • f文字列(フォーマット文字列)の基本的な使い方
  • 書式指定
    • 右寄せ、中央寄せ、左寄せ
    • ゼロ埋め
    • 桁区切り
    • 2進数、8進数、16進数
    • 小数点以下の桁数、有効桁(有効数字)
    • 指数表記
    • パーセント表記
  • 波括弧{}の扱い
  • ネストした置換フィールド
  • raw文字列との組み合わせ
  • 文字列メソッドformat()との違い
    • f文字列では式を使用可能
    • 辞書のキー指定方法

文字列メソッドformat()および組み込み関数format()については以下の記事を参照。書式指定文字列については以下の記事のほうがより詳しい。

スポンサーリンク

f文字列(フォーマット文字列)の基本的な使い方

文字列メソッドformat()では、順番に引数を指定したり名前を決めてキーワード引数で指定したりして置換フィールド{}に値を挿入できる。

a = 123

b = 'abc'

print('{} and {}'.format(a, b))
# 123 and abc

print('{first} and {second}'.format(first=a, second=b))
# 123 and abc
source: f_strings.py

f文字列(f-strings)は文字列リテラルの前にfまたはFを置く(f'xxx', F'xxx')。文字列中の置換フィールドに変数をそのまま指定できる。

print(f'{a} and {b}')
# 123 and abc

print(F'{a} and {b}')
# 123 and abc
source: f_strings.py

標準の文字列リテラルと同様、シングルクォート'だけでなくダブルクォート"でもトリプルダブルクォート''', """でもOK。

print(f"{a} and {b}")
# 123 and abc

print(f'''{a} and {b}''')
# 123 and abc

print(f"""{a} and {b}""")
# 123 and abc
source: f_strings.py

書式指定

文字列メソッドformat()と同様に、f文字列でも置換フィールドでコロン:のあとに書式指定文字列を指定することで様々な書式を指定できる。

いくつか例を示す。詳細は以下の記事を参照。

右寄せ、中央寄せ、左寄せ

s = 'abc'

print(f'right : {s:_>8}')
print(f'center: {s:_^8}')
print(f'left  : {s:_<8}')
# right : _____abc
# center: __abc___
# left  : abc_____
source: f_strings.py

ゼロ埋め

i = 1234

print(f'zero padding: {i:08}')
# zero padding: 00001234
source: f_strings.py

桁区切り

print(f'comma: {i:,}')
# comma: 1,234
source: f_strings.py

2進数、8進数、16進数

print(f'bin: {i:b}')
print(f'oct: {i:o}')
print(f'hex: {i:x}')
# bin: 10011010010
# oct: 2322
# hex: 4d2

print(f'bin: {i:#b}')
print(f'oct: {i:#o}')
print(f'hex: {i:#x}')
# bin: 0b10011010010
# oct: 0o2322
# hex: 0x4d2
source: f_strings.py

小数点以下の桁数、有効桁(有効数字)

f = 12.3456

print(f'digit(decimal): {f:.3f}')
print(f'digit(all)    : {f:.3g}')
# digit(decimal): 12.346
# digit(all)    : 12.3
source: f_strings.py

指数表記

print(f'exponen: {f:.3e}')
# exponen: 1.235e+01
source: f_strings.py

パーセント表記

f = 0.123

print(f'percent: {f:.2%}')
# percent: 12.30%
source: f_strings.py

波括弧{}の扱い

文字列メソッドformat()と同様に、f文字列中に波括弧{}を記述したい場合は{{, }}のように2回続けて書く。

n = 123

print(f'{{}}-{n}-{{{n}}}')
# {}-123-{123}
source: f_strings.py

ネストした置換フィールド

文字列メソッドformat()と同様に、f文字列でも置換フィールド内に置換フィールドを書くことができる。書式指定文字列の数値を変数で指定したりできる。

n = 123
i = 8

print('{n:0{i}}'.format(n=n, i=i))
# 00000123

print(f'{n:0{i}}')
# 00000123
source: f_strings.py

こんなことも可能。

f = 1.2345

for i in range(5):
    print(f'{f:.{i}f}')
# 1
# 1.2
# 1.23
# 1.234
# 1.2345
source: f_strings.py

raw文字列との組み合わせ

通常の文字列中では特殊文字を表すためにバックスラッシュ\を使う。文字列リテラルの先頭にrまたはRをつけたraw文字列ではバックスラッシュによるエスケープが無視される。

print('x\ty')
# x y

print(r'x\ty')
# x\ty
source: f_strings.py

文字列リテラルの先頭にrfを両方つけることでraw文字列かつf文字列として処理される。rfの順番はどちらでもよい。大文字でもOK。

x = 'XXX'
y = 'YYY'

print(f'{x}\t{y}')
# XXX   YYY

print(rf'{x}\t{y}')
# XXX\tYYY

print(fr'{x}\t{y}')
# XXX\tYYY
source: f_strings.py

なお、raw文字列でもそうでなくても置換フィールド内ではバックスラッシュは使えない。後述の辞書のキー指定の際には注意。

文字列メソッドformat()との違い

f文字列では式を使用可能

文字列メソッドformat()では置換フィールド内に式を記述することはできず、エラーKeyErrorになる。

a = 3
b = 4

# print('{a} + {b} = {a + b}'.format(a=a, b=b))
# KeyError: 'a + b'
source: f_strings.py

f文字列では置換フィールド内に式を記述することが可能。評価された値に対して書式指定もできる。

print(f'{a} + {b} = {a + b}')
# 3 + 4 = 7

print(f'{a} * {b} = {a * b}')
# 3 * 4 = 12

print(f'{a} / {b} = {a / b:.2e}')
# 3 / 4 = 7.50e-01
source: f_strings.py

辞書のキー指定方法

辞書(dict型オブジェクト)を置換フィールドに指定する場合、文字列メソッドformat()ではキーの指定に引用符', "は不要。引用符をつけるとエラーになる。

d = {'key1': 3, 'key2': 4}

print('{0[key1]}, {0[key2]}'.format(d))
# 3, 4

# print('{0["key1"]}, {0["key2"]}'.format(d))
# KeyError: '"key1"'
source: f_strings.py

f文字列では置換フィールドがそのまま式として評価されるので引用符が必要。引用符が無いとエラーになる。

print(f'{d["key1"]}, {d["key2"]}')
# 3, 4

# print(f'{d[key1]}, {d[key2]}')
# NameError: name 'key1' is not defined
source: f_strings.py

また通常の文字列と同様にf文字列全体を囲む引用符と同じ引用符は使えないので、全体を'で囲んだら中では"を使う。その逆も可。

# print(f'{d['key1']}, {d['key2']}')
# SyntaxError: invalid syntax

print(f"{d['key1']}, {d['key2']}")
# 3, 4
source: f_strings.py

上述のように置換フィールド内ではバックスラッシュによるエスケープが使えないので注意。

# print(f'{d[\'key1\']}, {d[\'key2\']}')
# SyntaxError: f-string expression part cannot include a backslash
source: f_strings.py
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事