Pythonのコードを美しく、効率的に。f文字列(フォーマット済み文字列リテラル)の完全ガイド
![]()
【Hiroki】Yukiさん、こんにちは。最近Pythonのコードを書いていて気になったんですけど、文字列の中に変数の値を埋め込むとき、いつも+記号で連結したり、.format()を使ったりしています。でも、もっと短くて直感的な書き方があると聞いたのですが……。
![]()
【Yuki】Hirokiくん、こんにちは……。そうですね、Python 3.6から導入された「f文字列(f-strings)」という機能を使うと、コードがとてもスッキリすると思います。正式名称は「フォーマット済み文字列リテラル」と言いますが、一般的には「f文字列」と呼ばれています。
![]()
【Hiroki】f文字列、ですか。使い方は難しいんでしょうか?
![]()
【Yuki】いえ、むしろ他の方法よりもずっと簡単ですよ。基本的には文字列の先頭に f または F を付けて、変数名を波括弧 {} で囲むだけなんです。少し詳しく見ていきましょうか。
f文字列の基本:変数の埋め込み
![]()
【Yuki】まずは、一番シンプルな書き方から紹介しますね。
name = "Hiroki"
age = 17
# 従来の.format()メソッド
print("僕は{}です。{}歳です。".format(name, age))
# f文字列
print(f"僕は{name}です。{age}歳です。")
![]()
【Hiroki】わあ、すごく読みやすいですね!.format()だと、後ろの方まで目を動かして何が入るか確認しないといけなかったですけど、f文字列ならその場で変数がわかるのがいいですね。
![]()
【Yuki】そうですね、直感的に理解できるのがf文字列の大きなメリットだと思います……。ちなみに、大文字の F を使っても同じように動きますが、一般的には小文字の f が使われることが多いかもしれません。
波括弧内での式の評価
![]()
【Hiroki】これって、ただ変数を入れるだけなんですか?
![]()
【Yuki】実は、波括弧 {} の中にはPythonの式を直接書くこともできるんです。計算をしたり、メソッドを呼び出したりすることも可能なんですよ。
price = 1200
tax = 0.1
print(f"合計金額は {price * (1 + tax)} 円です。")
message = "python is fun"
print(f"メッセージ: {message.upper()}")
![]()
【Hiroki】計算までできるのは便利ですね!わざわざ事前に計算した結果を変数に代入しなくても、そのまま書けるのは効率的だと思います。
![]()
【Yuki】はい、ちょっとした計算ならそのまま書くのがスマートですね。ただ、あまり複雑な式を入れすぎると、かえって読みにくくなってしまうこともあるので注意が必要かもしれません……。
数値の書式指定:桁数や精度の調整
![]()
【Hiroki】さっきの計算結果で、小数点以下が長く続いちゃうときとかはどうすればいいんですか?
![]()
【Yuki】そんなときは、波括弧の中で書式指定子を使います。変数名の後ろにコロン : を付けて指定するんです。
pi = 3.1415926535
# 小数点以下2桁まで表示
print(f"円周率は {pi:.2f} です。")
number = 1234567
# 3桁ごとのカンマ区切り
print(f"売上は {number:,} 円です。")
percent = 0.75
# パーセント表示(小数点以下0桁)
print(f"達成率は {percent:.0%} です。")
![]()
【Hiroki】:.2f で小数点第2位まで、:, でカンマ区切り……。これ、覚えると出力がすごく綺麗になりますね。
![]()
【Yuki】そうですね。データをレポートにまとめたりするときに重宝すると思います……。特に浮動小数点を扱うときは、桁を揃えるだけで一気にプロっぽくなりますよ。
配置とパディング:文字列を揃える
![]()
【Hiroki】表みたいに文字を揃えたいときは、どうすればいいでしょうか?
![]()
【Yuki】それも簡単ですよ。コロンの後に、記号を使って「左寄せ」「右寄せ」「中央寄せ」を指定できます。
name = "Python"
# 10文字分の幅で左寄せ(デフォルト)
print(f"|{name:<10}|")
# 10文字分の幅で右寄せ
print(f"|{name:>10}|")
# 10文字分の幅で中央寄せ
print(f"|{name:^10}|")
# 任意の文字で埋めることもできます
print(f"{name:=^20}")
![]()
【Hiroki】すごい、^ で中央寄せなんてできるんですね。= で埋めるのも、見出しとかを作るときに使えそうです。
![]()
【Yuki】はい。CLI(コマンドラインインターフェース)ツールなどを作るときに、メニュー画面を整えるのに役立つかもしれません。
日付のフォーマット
![]()
【Hiroki】日付の表示もf文字列でできるんですか?いつも strftime を使っていますけど。
![]()
【Yuki】それも可能です。datetime オブジェクトを直接f文字列に入れて、書式を指定できるんですよ。
from datetime import datetime
now = datetime.now()
print(f"現在時刻: {now:%Y-%m-%d %H:%M:%S}")
![]()
【Hiroki】わざわざ now.strftime(...) と書かなくてもいいんですね。記述が短くなって助かります。
![]()
【Yuki】コードがシンプルになれば、その分ミスも減りますからね……。
デバッグに便利な「=」記法(Python 3.8以降)
![]()
【Yuki】ところで、Hirokiくんはデバッグをするときに print(f"x = {x}") のようなコードを書くことはありますか?
![]()
【Hiroki】よくあります!変数の名前と、その中身を一緒に確認したいときに書きますね。
![]()
【Yuki】Python 3.8からは、もっと楽な書き方が追加されたんです。変数名の後ろに = を付けるだけで、変数名とその値の両方を出力してくれます。
user = "Hiroki"
score = 95
# 従来の書き方
print(f"user={user}, score={score}")
# デバッグ記法
print(f"{user=}, {score=}")
![]()
【Hiroki】えっ、これだけですか? user= って自分で書かなくていいのは、タイプミスも減るし最高ですね。
![]()
【Yuki】でしょう? 演算結果にも使えるので、f"{a + b = }" のように書くと計算式とその結果が表示されます。デバッグ中にはとても重宝すると思います……。
Python 3.12での進化したf文字列
![]()
【Yuki】実は、最新の Python 3.12 では、f文字列がさらに強力に進化(f-string lifting)したんです。これまでの制限がいくつか取り払われました。
![]()
【Hiroki】どんなところが変わったんですか?
![]()
【Yuki】主に3つのポイントがあります。
- 引用符の再利用が可能に 以前は、f文字列全体を囲む引用符(")と、中の辞書のキーなどで使う引用符は別の種類(')にする必要がありましたが、同じものが使えるようになりました。
- バックスラッシュ(\)が使用可能に
以前は波括弧の中で
\nなどのバックスラッシュが使えませんでしたが、今は使えます。 - 複数行の式とコメント 波括弧の中で改行したり、コメントを書いたりできるようになりました。
# Python 3.12での進化例
users = {"name": "Hiroki", "id": 123}
# 同じ引用符 " が使える
print(f"User Name: {users["name"]}")
# 波括弧の中でバックスラッシュが使える
words = ["Apple", "Banana", "Cherry"]
print(f"List:\n{'\n'.join(words)}")
![]()
【Hiroki】これまではクォートの使い分けでエラーになることがあったので、それが解消されるのは嬉しいです。
![]()
【Yuki】そうですね……。より自然にPythonのコードを書けるようになった、という印象です。
応用例:最新のAI APIとの連携
![]()
【Hiroki】具体的に、このf文字列はどんな場面で役立ちますか?
![]()
【Yuki】最近だと、AIのAPIを叩くためのリクエストメッセージを作る際にとても便利だと思います。例えば、Googleの最新ライブラリ google-genai を使って、最新モデル gemini-3-flash-preview に質問を投げるプログラムを考えてみましょう。
from google import genai
client = genai.Client(api_key="YOUR_API_KEY")
topic = "Pythonのf文字列"
user_level = "初心者"
# f文字列を使ってプロンプトを動的に生成
prompt = f"""
あなたは親切な講師です。
{topic}について、{user_level}にもわかるように100文字程度で説明してください。
"""
response = client.models.generate_content(
model="gemini-3-flash-preview",
contents=prompt
)
print(f"AIからの回答:\n{response.text}")
![]()
【Hiroki】なるほど、プロンプトの中に変数を組み込むときにf文字列は最適ですね。
![]()
【Yuki】はい、トリプルクォート """ を使った複数行の文字列でもf文字列は有効です。AIへの指示(プロンプト)は長くなりがちなので、この書き方はよく使われると思います……。
引用符とエスケープの注意点
![]()
【Hiroki】もし、f文字列の中で波括弧 { 自体を表示したいときはどうすればいいんですか?
![]()
【Yuki】その場合は、波括弧を2重にします。{{ や }} と書くことで、通常の文字として扱われるんですよ。
val = 10
print(f"この変数の値は {{val}} ではなく {val} です。")
# 出力: この変数の値は {val} ではなく 10 です。
![]()
【Hiroki】なるほど、2回重ねるんですね。
![]()
【Yuki】そうです。逆に、f文字列の中で辞書を扱うときなどは、先ほどお話ししたPython 3.12以前の環境だと、クォートの種類に注意してくださいね……。
なぜ .format() よりも f文字列なのか
![]()
【Hiroki】ここまで教えてもらって、f文字列が便利なのはよくわかりました。でも、昔からある % 演算子や .format() メソッドと比べて、性能とかはどうなんですか?
![]()
【Yuki】実は、f文字列は実行速度も一番速いんです。
![]()
【Hiroki】えっ、そうなんですか?
![]()
【Yuki】はい。.format() は関数呼び出しのオーバーヘッドがありますが、f文字列はコンパイル時に効率的なコードに変換されるため、非常に高速に動作します。読みやすくて、書きやすくて、さらに速い……。使わない理由がほとんどないくらい、素晴らしい機能なんです。
![]()
【Hiroki】最強じゃないですか!
![]()
【Yuki】ふふ、そうかもしれません……。ただ、古いPython(3.5以前)の環境で動かす必要があるコードでは使えないので、そこだけは注意してくださいね。
まとめ
![]()
【Hiroki】今日はありがとうございました!f文字列、今日から早速使ってみます。
![]()
【Yuki】ぜひ活用してみてください。最後に、ポイントを整理しておきますね。
- 文字列の前に
fを付ける。 {変数名}で値を埋め込める。{式}で計算やメソッド実行ができる。{変数:.2f}のように書式指定ができる。{変数=}はデバッグに便利。- Python 3.12からはさらに自由度が増した。
- 読みやすく、実行速度も速い。
![]()
【Hiroki】これだけ知っていれば、文字列操作で困ることはなさそうです。
![]()
【Yuki】お役に立ててよかったです……。もし途中でわからなくなったら、いつでも聞いてください。Pythonの公式ドキュメントも、情報が正確でおすすめですよ。
参考資料: - Python 公式ドキュメント: フォーマット済み文字列リテラル - Python 3.12 の新機能 (f-stringの文法制限緩和) - google-genai ライブラリ (GitHub)
![]()
【Yuki】……さて、説明はこんなところでしょうか。少し長くなってしまいましたが、Hirokiくん、ついてこられましたか?
![]()
【Hiroki】はい!丁寧に教えてくれたので、すごくよくわかりました。Yukiさん、ありがとうございました!
![]()
【Yuki】どういたしまして……。コードが綺麗になると、プログラミングがもっと楽しくなると思いますよ。頑張ってくださいね。
この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。
「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。
- 専門家の知見に基づいた、保守性の高いコード設計
- AIの専門家による、Gemini API等の最新AIを組み合わせた高度な自動化
- ChatGPT等が生成したコードのデバッグ・最適化
「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。


