Python f文字列とは?変数を文字列に埋め込む新しい方法
Python初心者向けにf文字列(f-string)の使い方を詳しく解説。変数の埋め込み方、フォーマット指定、従来の方法との比較を実例とともに説明します。
Python f文字列とは?変数を文字列に埋め込む新しい方法
みなさん、Pythonで文字列に変数を入れたい時、どうしていますか?
「文字列と変数を組み合わせるのって面倒」 「もっと簡単に変数を埋め込みたい」 「f文字列って聞いたことあるけど、どう使うの?」
こんな疑問、よくありますよね。
実は、Python 3.6から**f文字列(f-string)**という画期的な機能が追加されました。 これを使えば、変数や式を文字列に簡潔に埋め込むことができるんです。
この記事では、Python初心者の方向けにf文字列の基本から応用まで、分かりやすく解説します。 従来の方法と比べて読みやすく、書きやすく、しかも高速という優れもの!
一緒にf文字列をマスターして、もっと楽にプログラミングできるようになりましょう!
f文字列って何?
**f文字列(f-string)**は、文字列の前にf
を付けることで、波括弧{}
内に変数や式を直接記述できるPython 3.6以降の文字列フォーマット機能です。
簡単に言うと、「文字列に変数をペタッと貼り付けられる便利な機能」です。
基本的な書き方
まずは、シンプルな例から見てみましょう。
name = "田中"age = 25
# f文字列を使用message = f"私の名前は{name}で、年齢は{age}歳です"print(message)
このコードを実行すると、こうなります。
私の名前は田中で、年齢は25歳です
すごく簡単ですよね!
文字列の前にf
を付けて、波括弧{}
内に変数名を書くだけです。
変数の値が自動的に埋め込まれます。
従来の方法との比較
f文字列の便利さを実感するために、従来の方法と比較してみましょう。
1. %演算子を使った方法(古い方法)
name = "田中"age = 25
# %演算子(もう推奨されていません)message = "私の名前は%sで、年齢は%d歳です" % (name, age)print(message)
これは古い方法です。
%s
や%d
といった記号を覚える必要があって、ちょっと面倒ですね。
2. format()メソッドを使った方法
name = "田中"age = 25
# format()メソッドmessage = "私の名前は{}で、年齢は{}歳です".format(name, age)print(message)
# またはmessage = "私の名前は{name}で、年齢は{age}歳です".format(name=name, age=age)print(message)
format()メソッドは%演算子より読みやすいですが、まだちょっと長いです。
3. f文字列を使った方法(推奨)
name = "田中"age = 25
# f文字列(最も推奨される方法)message = f"私の名前は{name}で、年齢は{age}歳です"print(message)
f文字列が一番シンプルで分かりやすいですね!
変数名がそのまま文字列の中に見えるので、どこに何が入るかが一目瞭然です。 パフォーマンスも一番優秀なんです。
f文字列の基本的な使い方
それでは、f文字列の基本的な使い方を詳しく見てみましょう。
変数の埋め込み
商品情報を表示する例です。
product_name = "ノートパソコン"price = 89800stock = 15
print(f"商品名: {product_name}")print(f"価格: {price:,}円")print(f"在庫数: {stock}個")
実行すると、こうなります。
商品名: ノートパソコン
価格: 89,800円
在庫数: 15個
{price:,}
の部分で、数字にカンマ区切りを付けています。
後で詳しく説明しますが、こんなふうにフォーマットも指定できるんです。
式の計算結果を埋め込み
変数だけでなく、計算式の結果も直接埋め込めます。
length = 5width = 3
print(f"長方形の面積: {length * width}平方メートル")print(f"長方形の周囲: {2 * (length + width)}メートル")
実行結果はこちらです。
長方形の面積: 15平方メートル
長方形の周囲: 16メートル
波括弧の中で直接計算できるのは便利ですね!
関数の戻り値を埋め込み
関数の実行結果も埋め込めます。
import datetime
def get_current_time(): return datetime.datetime.now().strftime("%Y年%m月%d日 %H:%M:%S")
def calculate_tax(price, tax_rate=0.1): return int(price * tax_rate)
price = 1000print(f"現在時刻: {get_current_time()}")print(f"商品価格: {price}円(税込: {price + calculate_tax(price)}円)")
実行結果の例はこちらです。
現在時刻: 2024年07月07日 14:30:15
商品価格: 1000円(税込: 1100円)
関数を波括弧の中で呼び出して、その結果を直接埋め込めるんです。
数値のフォーマット指定
f文字列では、数値の表示方法を細かく指定できます。
桁数指定と0埋め
数字の桁数を揃えたい時に便利です。
number = 42
print(f"基本: {number}")print(f"3桁0埋め: {number:03d}")print(f"5桁0埋め: {number:05d}")
実行結果はこちらです。
基本: 42
3桁0埋め: 042
5桁0埋め: 00042
{number:03d}
の:03d
の部分がフォーマット指定です。
「3桁で、足りない部分は0で埋める」という意味です。
小数点の桁数指定
小数点以下の桁数も指定できます。
pi = 3.14159265
print(f"基本: {pi}")print(f"小数点2桁: {pi:.2f}")print(f"小数点4桁: {pi:.4f}")
実行結果はこちらです。
基本: 3.14159265
小数点2桁: 3.14
小数点4桁: 3.1416
{pi:.2f}
の:.2f
で「小数点以下2桁まで表示」を指定できます。
千の位区切り
大きな数字を読みやすくするために、区切り文字を入れられます。
large_number = 1234567
print(f"区切りなし: {large_number}")print(f"カンマ区切り: {large_number:,}")print(f"アンダースコア区切り: {large_number:_}")
実行結果はこちらです。
区切りなし: 1234567
カンマ区切り: 1,234,567
アンダースコア区切り: 1_234_567
,
や_
を使って、読みやすい形式にできます。
パーセント表示
割合をパーセントで表示することもできます。
success_rate = 0.856
print(f"小数: {success_rate}")print(f"パーセント: {success_rate:.1%}")print(f"パーセント(2桁): {success_rate:.2%}")
実行結果はこちらです。
小数: 0.856
パーセント: 85.6%
パーセント(2桁): 85.60%
%
を使うと、自動的に100倍してパーセント記号を付けてくれます。
文字列の配置とパディング
文字列の配置や空白の埋め方も指定できます。
左揃え、右揃え、中央揃え
文字列の位置を調整できます。
text = "Python"
print(f"左揃え(10文字): '{text:<10}'")print(f"右揃え(10文字): '{text:>10}'")print(f"中央揃え(10文字): '{text:^10}'")
実行結果はこちらです。
左揃え(10文字): 'Python '
右揃え(10文字): ' Python'
中央揃え(10文字): ' Python '
<
、>
、^
で左揃え、右揃え、中央揃えを指定できます。
パディング文字の指定
空白以外の文字で埋めることもできます。
text = "Hello"
print(f"星印パディング: '{text:*^15}'")print(f"ハイフンパディング: '{text:-^15}'")print(f"ドットパディング: '{text:.^15}'")
実行結果はこちらです。
星印パディング: '*****Hello*****'
ハイフンパディング: '-----Hello-----'
ドットパディング: '.....Hello.....'
見た目がかわいくできて便利ですね!
実用的なf文字列の活用例
実際の開発でよく使われるパターンを見てみましょう。
ユーザー情報の表示
社員一覧を整列して表示する例です。
users = [ {"name": "田中太郎", "age": 28, "department": "開発部"}, {"name": "佐藤花子", "age": 32, "department": "営業部"}, {"name": "鈴木一郎", "age": 45, "department": "管理部"}]
print("社員一覧:")print("-" * 40)for i, user in enumerate(users, 1): print(f"{i:2d}. {user['name']:<8} ({user['age']:2d}歳) - {user['department']}")
実行結果はこちらです。
社員一覧:
----------------------------------------
1. 田中太郎 (28歳) - 開発部
2. 佐藤花子 (32歳) - 営業部
3. 鈴木一郎 (45歳) - 管理部
番号、名前、年齢がきれいに揃って表示されますね。
ファイルサイズの表示
ファイルサイズを適切な単位で表示する関数です。
def format_file_size(size_bytes): if size_bytes < 1024: return f"{size_bytes} B" elif size_bytes < 1024 ** 2: return f"{size_bytes / 1024:.1f} KB" elif size_bytes < 1024 ** 3: return f"{size_bytes / (1024 ** 2):.1f} MB" else: return f"{size_bytes / (1024 ** 3):.1f} GB"
file_sizes = [512, 2048, 1536000, 2147483648]
for size in file_sizes: print(f"ファイルサイズ: {format_file_size(size)}")
実行結果はこちらです。
ファイルサイズ: 512 B
ファイルサイズ: 2.0 KB
ファイルサイズ: 1.5 MB
ファイルサイズ: 2.0 GB
ファイルサイズが自動的に適切な単位で表示されて便利です。
進捗表示
プログレスバーを作る例です。
def show_progress(current, total): percentage = (current / total) * 100 filled = int(percentage // 5) # 20個のバーで100% bar = "█" * filled + "░" * (20 - filled) return f"進捗: [{bar}] {percentage:5.1f}% ({current}/{total})"
# 進捗の例tasks = [10, 25, 50, 75, 100]total_tasks = 100
for completed in tasks: print(show_progress(completed, total_tasks))
実行結果はこちらです。
進捗: [██░░░░░░░░░░░░░░░░░░] 10.0% (10/100)
進捗: [█████░░░░░░░░░░░░░░░░] 25.0% (25/100)
進捗: [██████████░░░░░░░░░░] 50.0% (50/100)
進捗: [███████████████░░░░░] 75.0% (75/100)
進捗: [████████████████████] 100.0% (100/100)
視覚的に進捗が分かって便利ですね!
デバッグ情報の出力
ユーザー情報を分かりやすく表示する例です。
# 使用例username = "admin"user_id = 12345is_active = True
print(f"ユーザー情報:")print(f" ユーザー名: {username}")print(f" ユーザーID: {user_id}")print(f" アクティブ: {'有効' if is_active else '無効'}")
実行結果はこちらです。
ユーザー情報:
ユーザー名: admin
ユーザーID: 12345
アクティブ: 有効
条件分岐も波括弧の中に書けるので便利です。
日付と時刻のフォーマット
日付や時刻も美しく表示できます。
import datetime
now = datetime.datetime.now()birthday = datetime.date(1990, 5, 15)
print(f"現在日時: {now}")print(f"年月日: {now:%Y年%m月%d日}")print(f"時刻: {now:%H時%M分%S秒}")print(f"曜日: {now:%A}")print(f"誕生日: {birthday:%Y年%m月%d日}")
実行結果の例はこちらです。
現在日時: 2024-07-07 14:30:15.123456
年月日: 2024年07月07日
時刻: 14時30分15秒
曜日: Sunday
誕生日: 1990年05月15日
%Y
、%m
、%d
などのフォーマット指定子で、日付の表示形式を自由に変更できます。
辞書とリストでの活用
辞書やリストの値も簡単に埋め込めます。
辞書の値を参照
person = { "name": "山田太郎", "age": 30, "city": "東京", "job": "エンジニア"}
print(f"{person['name']}さんは{person['age']}歳で、{person['city']}在住の{person['job']}です")
実行結果はこちらです。
山田太郎さんは30歳で、東京在住のエンジニアです
辞書のキーを指定して、値を直接埋め込めます。
リストのインデックス参照
colors = ["赤", "青", "緑", "黄", "紫"]
print(f"1番目の色: {colors[0]}")print(f"最後の色: {colors[-1]}")print(f"色の総数: {len(colors)}種類")
実行結果はこちらです。
1番目の色: 赤
最後の色: 紫
色の総数: 5種類
リストのインデックスや関数呼び出しも波括弧の中に書けます。
エラーハンドリングとの組み合わせ
例外処理と組み合わせた例も見てみましょう。
def safe_divide(a, b): try: result = a / b return f"{a} ÷ {b} = {result:.2f}" except ZeroDivisionError: return f"エラー: {a} を 0 で割ることはできません" except TypeError: return f"エラー: 数値以外の値が入力されました ({type(a).__name__}, {type(b).__name__})"
# テストtest_cases = [(10, 2), (10, 0), (10, "abc")]
for a, b in test_cases: print(safe_divide(a, b))
実行結果はこちらです。
10 ÷ 2 = 5.00
エラー: 10 を 0 で割ることはできません
エラー: 数値以外の値が入力されました (int, str)
エラーメッセージもf文字列で分かりやすく表示できます。
パフォーマンスの比較
f文字列がどれだけ高速か確認してみましょう。
import time
name = "Python"version = "3.11"iteration = 100000
# %演算子での測定start_time = time.time()for i in range(iteration): result = "%s %s" % (name, version)time_percent = time.time() - start_time
# format()での測定start_time = time.time()for i in range(iteration): result = "{} {}".format(name, version)time_format = time.time() - start_time
# f文字列での測定start_time = time.time()for i in range(iteration): result = f"{name} {version}"time_fstring = time.time() - start_time
print(f"パフォーマンス比較({iteration:,}回実行):")print(f"% 演算子: {time_percent:.4f}秒")print(f"format(): {time_format:.4f}秒")print(f"f文字列: {time_fstring:.4f}秒")
実行結果の例はこちらです。
パフォーマンス比較(100,000回実行):
% 演算子: 0.0523秒
format(): 0.0687秒
f文字列: 0.0312秒
f文字列が一番高速なことが分かりますね!
f文字列使用時の注意点
f文字列を使う時に気をつけるポイントがいくつかあります。
波括弧のエスケープ
波括弧を文字として表示したい場合は、二重にします。
value = 42print(f"辞書形式: {{'key': {value}}}")print(f"集合形式: {{{value}, {value + 1}, {value + 2}}}")
実行結果はこちらです。
辞書形式: {'key': 42}
集合形式: {42, 43, 44}
{{
と}}
で、実際の波括弧を表示できます。
バックスラッシュの制限
f文字列の波括弧内では、バックスラッシュが使えません。
# f文字列内でバックスラッシュは使用できないpath = "C:\\Users\\Documents"# print(f"パス: {path + "\\file.txt"}") # エラー
# 正しい方法file_name = "file.txt"full_path = f"{path}\\{file_name}"print(f"パス: {full_path}")
実行結果はこちらです。
パス: C:\Users\Documents\file.txt
バックスラッシュが必要な場合は、事前に変数に入れておきましょう。
複雑な式の可読性
あまりに複雑な式は読みにくくなります。
# 複雑すぎる式は避ける(悪い例)data = [1, 2, 3, 4, 5]# print(f"結果: {sum([x**2 for x in data if x % 2 == 0])}")
# 読みやすくする(良い例)even_squares = [x**2 for x in data if x % 2 == 0]result = sum(even_squares)print(f"偶数の二乗の合計: {result}")
実行結果はこちらです。
偶数の二乗の合計: 20
複雑な計算は事前に変数に入れて、コードを読みやすくしましょう。
まとめ
f文字列は、Python 3.6以降で利用できる最も推奨される文字列フォーマット方法です。
今回学んだポイントをおさらい
f文字列の利点
- 読みやすさ: 変数や式が直接文字列内に記述される
- 書きやすさ: 最小限の構文で変数を埋め込める
- 高速性: 従来の方法より実行速度が速い
- 柔軟性: 豊富なフォーマットオプション
主な機能
- 変数埋め込み:
f"{variable}"
- 式の計算:
f"{x + y}"
- 関数呼び出し:
f"{function()}"
- フォーマット指定:
f"{number:,.2f}"
- 配置制御:
f"{text:^10}"
便利なフォーマット指定
- 数値の0埋めや桁数指定
- 小数点以下の桁数制御
- 千の位区切り(カンマやアンダースコア)
- パーセント表示
- 文字列の配置(左右中央揃え)
実用的な活用例
- ユーザー情報の整列表示
- ファイルサイズの適切な単位表示
- 進捗バーの作成
- 日付と時刻の美しい表示
- デバッグ情報の出力
使用上の注意
- 波括弧のエスケープ:
{{
と}}
で表現 - バックスラッシュ: f文字列内では直接使用不可
- 可読性: 複雑な式は事前に変数に格納
f文字列をマスターすることで、より直感的で保守しやすいPythonコードが書けるようになります。
まずは基本的な変数埋め込みから始めて、徐々にフォーマット指定や応用的な使い方も覚えていきましょう。 コードがスッキリして、読みやすくなりますよ!
ぜひ今日からf文字列を使って、もっと楽しくプログラミングしてみてくださいね。