format関数の簡易的な記述方法である、f-string(f文字列)の使い方について、format関数との違いなどポイントを実例を用いて解説しています。
f-string(f文字列)とは何か?
f-string(f文字列)とは、format関数をより簡易的にした記述方法です。
適用されたのは、python3.6(2016年12月にリリース)からなので、比較的新しく導入された機能になります。
公式ページでは「フォーマット済み文字列リテラル」と呼ばれています。
f-strignとformat関数との特徴と違い
f-strignとformat関数の主な特徴と違いは以下になります。
・f-stringの方が記述がシンプル。
・format関数の方が自由度が高い。(パターンが多く複雑ともいえます)
▼f-stringの特徴
・コードが簡易的
・すべて変数で指定する
・変数と書式をセットで記述する
→ どの変数にどんな書式が与えられているかがわかりやすいです。
▼format関数の特徴
・代入する値に数値や文字列を直接指定できる
・{}の中を空欄でも指定できる(自動でインデックス番号が割り振られる)
・どの引数を使うかをインデックス番号で指定できる
f-stringの基本構文
f'{値:書式}'
変数を使う場合は以下のようになります。
変数名 = 値
f'{変数名:書式}'
- 「f」:冒頭に記述。大文字でも問題ありません。
- 「’ ‘」:文章を記述。「”」や「”’」でも問題ありません。
- 「{ }」:代入する変数と書式を記述
- 「変数名」:代入する変数(任意です)
f’ ‘ を使う以外はformat関数と同じ記述になります。
format関数で使われるダブルコロン「:」以下の書式設定を省略した記述です。
f-stringの使い方実例
f-stringの使い方の実例は以下になります。
f-string
a='AAA'
b=111
c='BBB'
f'私の名前は{a}です。身長は{b}cmです。好きな食べ物は{c}'
#出力
# '私の名前はAAAです。身長は111cmです。好きな食べ物はBBB'
format関数の使い方実例(比較用)
対比用として同じ出力結果をformat関数で作成する場合のコードは以下になります。
format関数
format関数を使う場合は、指定できるパターンが複数存在します。
(1) 引数に直接値を渡す
.format(‘AAA’, 111, ‘BBB’)
'私の名前は{}です。身長は{}cmです。好きな食べ物は{}'.format('AAA', 111, 'BBB')
#出力
# '私の名前はAAAです。身長は111cmです。好きな食べ物はBBB'
formatの( )に記載された順番に、{ }の中に適用されていきます。
{ }の数が、formatで指定した要素より多い場合はエラーになります。
(2) 引数に変数を渡す
.format(a, b, c)
a='AAA'
b=111
c='BBB'
'私の名前は{}です。身長は{}cmです。好きな食べ物は{}'.format(a, b, c)
#出力
# '私の名前はAAAです。身長は111cmです。好きな食べ物はBBB'
(3) 引数の番号で指定する
.format(c, b, a)
a='AAA'
b=111
c='BBB'
'私の名前は{2}です。身長は{1}cmです。好きな食べ物は{0}'.format(c, b, a)
#出力
# '私の名前はAAAです。身長は111cmです。好きな食べ物はBBB'
(4) 引数の中で変数名をつけて指定する
.format(height=’111′, favorit=’BBB’, name=’AAA’)
'私の名前は{name}です。身長は{height}cmです。好きな食べ物は{favorit}'.format(height='111', favorit='BBB', name='AAA')
#出力
# '私の名前はAAAです。身長は111cmです。好きな食べ物はBBB'
このように、format関数は同じ処理をするにも記述方法が複数ありますが、それがよけいにわかりにくくさせている場合があります。
実際、f-stringのシンプルな書き方で十分に対応できます。
f-stringで書式を指定する方法
書式設定の書き方はformat関数と同じです。
f'{A:0<10}'
└「:」:以下に書式を記述
└「0」:隙間を埋める文字(任意)
└「<」:文字の配置(< 左寄せ、> 右寄せ、 ^中央寄せ
└ 「10」:幅。bite数で指定
以下でそれぞれの設定について解説します。
配置を指定する方法
f'{a:^n}’
└「:」以降が書式設定
└「^」中央寄せ(「<」左寄せ、「>」右寄せ)
└「n」整数。隙間をbite数で指示
- 隙間の指定がないとテキストの配置は意味ない。右寄せ
a= 'AAA'
f'私の名前は{a:^9}です'
#出力
# '私の名前は AAA です'
隙間を埋める方法
0で埋める(0パディング)
f'{a:0>n}’
└ 要素の配置指定記号(ここでは「>」)の前に0をつける0埋め
a= 'AAA'
f'私の名前は{a:0>9}です'
#出力
# '私の名前は000000AAAです'
任意の文字で埋める
f'{a:Z>n}’
└ 要素の配置指定記号(ここでは「>」)の前に埋めたい文字を入れる
└ 記号でも文字でも数値でもOK
└ 1文字のみ。任意の文字で埋める
a= 'AAA'
f'私の名前は{a:え>9}です'
#出力
# '私の名前はええええええAAAです'
日付の書式を指定する方法
f'{A:%Y年%#m月%#d日}’
└「A」日付データが格納された変数
└「:」以下に日付の書式を記述
└「%Y」西暦4桁
└「%#m」0なしの月(Macの場合は「%-m」)
└「%#d」0なしの月(Macの場合は「%-d」)
(参考)【Python】datetimeモジュールの指定子まとめ。macとwindowsの指定方法(%Y, %y, %m, %Mなどの違い)
import datetime as dt
past = dt.date(2017,1,3) #datetime.date(2017, 1, 3)
f'{past:%Y年%#m月%#d日}'
#出力
# f'{past:%Y年%#m月%#d日}'
format関数と違って{変数:書式}のように、変数と書式がセットになっているため、何にどんな書式を設定しているかがわかりやすいです。
なお、format関数ではインデックス番号で指定するため視認性が下がります。
import datetime as dt
past = dt.date(2017,1,3)
now = dt.date(2020,1,28)
future = dt.date(2022,1,30)
"昔は{0:%Y年%#m月%#d日}。今は{1:%Y/%#m/%#d}。未来は{2:%y%m%d}。".format(past, now, future)
千の位にカンマを設定する方法(1,000){:,}
2,123,456,789のように、千の位にカンマを設定することができます。
f'{値:,}’
└「:」以下は書式設定
└「,」千の位にカンマ
x = 123456789
res = f'{x:,}'
print( res )
#出力
# '123,456,789'
%表示にする(数値が100倍される)|{:.n%}
%表示することもできます。1が100%のように、指定した数値が100倍されます。
f'{値:.n%}’
└「:」以下は書式設定
└「.n」小数点以下の桁数(デフォルト6)
└ 数値は100倍される
res = f'{1:%}'
print( res )
#出力
# 100.000000%
res = f'{1:.0%}'
print( res )
#出力
# '100%'
res = f'{1:.2%}'
print( res )
#出力
# '100.00%'
res = f'{1:.15%}'
print( res )
#出力
# '100.000000000000000%'
数値に+符号をつける|{:+}
数値がプラスのときに+符号をつけることができます。
f'{値:+}’
└「:」以下は書式設定
└「+」プラス/マイナスの符号をつける
x = -500
y = 300
z = 2.56
res = f'1つめ「{x:+}」。2つ目「{y:+}」。3つ目「{z:+}」'
print(res)
#出力
# '1つめ「-500」。2つ目「+300」。3つ目「+2.56」'
小数点の桁数を指定する|{.nf}
小数点以下を何桁まで表示するかを指定することができます。
f'{値:.nf}’
└「:」以下は書式設定
└「.n」小数点の桁数(0からの整数)
└ デフォルト「:.nf」なしは、入力値分
└ 四捨五入
x = 1.23
res = f'{x}'
print( res )
#出力
# '1.23'
x = 1.23456789
res = f'{x:.2f}'
print( res )
#出力
# '1.23'
x = 1.23456789
res = f'{x:.0f}'
print( res )
#出力
# '1'
x = 1.23456789
res = f'{x:.12f}'
print( res )
#出力
# '1.234567890000'
指数関数の固定小数点表記にする|{:.ne}
指数関数であるエクスポーネンシャルを使って、特定の桁数までの表示にすることもできます。
数値が大きい場合によく使います。(例:1.23e+08 ← 123456789)
f'{値:.ne}’
└「:」以下は書式設定
└「.n」点以下で表示する数
└デフォルト「.n」なしは点以下6桁まで表示
x = 123456789
res = f'{x:.e}'
print( res )
#出力
# '1.234568e+08'
x = 123456789
res = f'{x:.2e}'
print( res )
#出力
# '1.23e+08'
x = 123456789
res = f'{x:.0e}'
print( res )
#出力
# '1e+08'
x = 123.456789
res = f'{x:.0e}'
print( res )
#出力
# '1e+02'