Pythonの文字列補間:初心者のためのガイド

ある人物の名前と職業を出力したいとします。以下のように簡単なプログラムを書くことができます。

# 変数を定義 name = 'Mark' profession = 'Astronaut' age = 7 # 情報を出力 output_string = ('My name is ' + name + ', I am ' + str(age) + ' years old ' + 'and my profession is ' + profession + '.') print(output_string)
My name is Mark, I am 7 years old and my profession is Astronaut.

このアプローチは簡潔さと可読性に欠けています。幸いなことに、文字列補間はより良い解決策を提供しています。変数、式、または関数の出力を直接文字列に挿入することで、文字列の操作を動的にし、手動の連結の必要性を排除します。

文字列補間アプローチを使用すると、コードを以下のように書き直すことができます。

# 変数を定義 name = 'Mark' profession = 'Astronaut' age = 7 # 情報を出力 output_string = f'My name is {name}, I am {age} years old and my profession is {profession}.' print(output_string)
My name is Mark, I am 7 years old and my profession is Astronaut.

文字列補間を使用したバージョンでは、式を文字列内に直接埋め込むことができ、乱雑な連結を使用する必要がありません。ご覧の通り、はるかにきれいなアプローチです。

Pythonにおける基本的な文字列補間

Pythonにはさまざまな文字列補間テクニックがあります。最も一般的に推奨される方法は、フォーマット済み文字列リテラル、またはf-stringsとしても知られる方法で、Python 3.6以降で利用可能です。

別の方法は、Python 3.6より古いコードでよく見られる.format()メソッドです。 このメソッドはf-stringsより冗長ですが、時々利点があります(詳細は以下に記載)。

最後に、レガシーコードで%形式のフォーマットを目にすることがあります。

f-stringsの使用(Python 3.6+)

f-strings(フォーマット済み文字列リテラル)は、Pythonで文字列をフォーマットする強力で簡潔な方法です。Python 3.6で導入され、変数、式、および関数呼び出しを直接文字列に挿入する読みやすく効率的な方法を提供します。

基本的なf-stringの構文のシンプルな例は次のとおりです。

name = 'Mark' output_string = f'My name is {name}.' print(output_string)
My name is Mark.

このコードでは、output_string変数にf-stringが代入されています。開く引用符の前にあるfプレフィックスは、文字列が埋め込み式をサポートしていることを示します。変数nameが評価され、その値が文字列に挿入され、出力は次のようになります:"私の名前はMarkです。"

変数の値だけでなく、計算や式もf-stringsに挿入することができます。次の例を考えてみてください。

import math a = 3.0 b = 4.0 # 式のために文字列補間を使用します print(f'The hypotenuse of a triangle with base {a} and side {b} is {math.sqrt(a ** 2 + b ** 2)}.')
The hypotenuse of a triangle with base 3.0 and side 4.0 is 5.0.

math.sqrt(a ** 2 + b ** 2)は、文字列内で直接評価され、値を別個に計算してから文字列に挿入する必要がなくなります。

.format()メソッドを使用する

f-stringsと同様に、.format()メソッドは変数や式を文字列に挿入することを可能にします。.format()メソッドの基本的な構文は次のとおりです。

name = 'Mark' output_string = 'My name is {}.'.format(name) print(output_string)
My name is Mark.

波括弧{}はプレースホルダーとして機能し、変数の値がその位置に文字列に挿入されることを示します。プレースホルダーに挿入される特定の変数の値は、提供される引数によって.format()メソッドで決定されます。

位置引数

複数の変数のために複数のプレースホルダーが必要な場合はどうなりますか?次のコードを考えてみてください。

name = 'Mark' age = 7 # プレースホルダーは引数の順序で埋められます output_string = 'My name is {} and I am {} years old.'.format(name, age) print(output_string)
My name is Mark and I am 7 years old.

この例では、nameageという2つの変数が必要です。したがって、この文字列には2つのプレースホルダが含まれており、変数は.format()メソッドの引数リスト内での位置に基づいて同じ順序で挿入されます。これらの引数は*位置指定*引数として知られ、文字列内の配置はメソッドの引数リスト内での位置によって決まります。

インデックス付けされたプレースホルダ

プレースホルダのアイデアの変化として、次の例を考えてみてください。

name = 'Mark' age = 7 # 年齢を2回出力 output_string = 'My name is {} and I am {} years old. My twin brother is also {} years old.'.format(name, age, age) print(output_string)
My name is Mark and I am 7 years old. My twin brother is also 7 years old.

ここでは、変数ageの値を2回再利用しました。同じ変数をこのように何度も含めるのは面倒で、可読性を損ないます。繰り返さずに.format()メソッドで文字列にフォーマットされた変数を再利用する方法はありますか?はい、いわゆる*インデックス付きプレースホルダー*を使用することによって可能です。

name = 'Mark' age = 7 # インデックス付きプレースホルダーを使用する output_string = 'My name is {0} and I am {1} years old. My twin brother is also {1} years old.'.format(name, age) print(output_string)
My name is Mark and I am 7 years old. My twin brother is also 7 years old.

この例では、Pythonのゼロベースのインデックスに従って、中括弧内の変数の順序を明示的に定義しました。さらに、繰り返す代わりにインデックス1の変数を再利用しました。

位置インデックスの代替として、各引数に名前を付ける名前付き引数を使用することもできます。

print('My name is {name} and I am {age} years old.'.format(name='Mark', age=7))
My name is Mark and I am 7 years old.

名前付き引数は、その名前を指定する中括弧内で評価されます。その結果、{name} のプレースホルダーは値 "Mark" で置き換えられ、{age} のプレースホルダーは 30 で置き換えられます。

% 演算子を使用すると、

文字列補間の最終的な方法は、%演算子です。これは、C言語のprintf()コマンドと同様に機能します。その使用は非推奨であり、f-stringsや.format()メソッドを使用することが強く推奨されています。レガシーコードベースで遭遇する可能性があるため、ここで言及しています。

演算子の基本的な形式は:“フォーマット文字列”%値です。フォーマット文字列には、値に置き換えられる%sなどのプレースホルダが含まれています。例えば、次の例は「Hello, Mark」と出力されます。他の一般的なフォーマット指定子は次の表に示されています。

'Hello %s' % 'Mark'
'Hello Mark'

指定子

意味

%s

文字列

“Hello %s” % “Alice” → “Hello Alice”

%d

整数(10進数)

“Age: %d” % 25 → “Age: 25”

%f

Float (Default 6 decimals)

“Pi: %f” % 3.14159 → “Pi: 3.141590”

%.nf

Float (n decimal places)

“%.2f” % 3.14159 → “3.14”

%x

Hexadecimal (lowercase)

“%x” % 255 → “ff”

%X

Hexadecimal (uppercase)

“%X” % 255 → “FF”

%o

Octal

“%o” % 255 → “377”

The % operator has many limitations. For one thing, it is less readable than f-strings. Consider the following code.

name = "Alice" age = 30 height = 5.6 # The % operator is hard to scan message = "My name is %s, I am %d years old, and my height is %.1f feet." % (name, age, height) print(message)
My name is Alice, I am 30 years old, and my height is 5.6 feet.

このコードは一目ではっきりとわかりますか?おそらくそうではありません。プレースホルダとそれに埋め込む変数の間を視覚的に行ったり来たりする必要があります。そのスキャン作業が続くと混乱したり(めまいがすることもあります)

さて、f-stringsを使用した等価コードを考えてみましょう。

# これははるかにクリーンです message = f"My name is {name}, I am {age} years old, and my height is {height:.1f} feet." print(message)
My name is Alice, I am 30 years old, and my height is 5.6 feet.

スキャンする必要も、不明瞭なフォーマット文字列も必要ありません。コードはクリーンで、理解しやすく、書きやすいです。DataCampのPythonプログラミングスキルトラックで明確で最適化されたコードを書くための他のヒントを学ぶことができます。ython Programming skill track。 

高度なPython文字列補間テクニック

Pythonの文字列補間の基礎を理解したので、さらに高度な使用法を見てみましょう。

Pythonの複数行文字列補間

f-stringsは、トリプルクォート(シングルまたはダブル)を使ってf識別子を使用することで、複数行のコンテンツにも使用できます。テキストは複数行にまたがって書かれることができ、出力ではそのままのフォーマットで表示されます。

name = 'Mark' profession = 'Astronaut' age = 7 # これは複数行文字列の例です bio = f""" Name: {name} Profession: {profession} Age: {age} """ print(bio)
Name: Mark Profession: Astronaut Age: 7

複数行の文字列は、.format()メソッドを使用して作成することもできます。

name = 'Mark' profession = 'Astronaut' age = 7 # これは、.format()を使用した複数行の文字列です bio = """ Name: {} Profession: {} Age: {} """.format(name, profession, age) print(bio)
Name: Mark Profession: Astronaut Age: 7

複数行文字列補間の使用例

なぜ複数行文字列補間を使用したいのですか?複数行文字列補間のためには多くの用途があります。以下にいくつかの使用例を示します。

  • 複数行のメールやメッセージの生成
  • ログ記録とデバッグ
  • SQLクエリの動的生成

複数行のメールやメッセージの生成

たとえば、テックカンファレンスへの多くの招待者にフォームレターを送信しているとします。

name = "Alice" event = "Annual Tech Conference" date = "March 15, 2025" email = """Dear {name}, We are pleased to invite you to the {event} taking place on {date}. We hope you can join us for an exciting experience. Best regards, The Event Team""".format(name=name, event=event, date=date) print(email)
Dear Alice, We are pleased to invite you to the Annual Tech Conference taking place on March 15, 2025. We hope you can join us for an exciting experience. Best regards, The Event Team

f-stringsを使用すると、フォームレターの作成が簡単で効率的です。名前、イベント、または日付を変更するには、単にそれらを変数で変更すれば、文字列が自動的に変更されます。

ログ記録とデバッグ

複数行文字列は、ログのエラーメッセージを出力するのに便利です。

error_code = 404 url = '/missing-page' timestamp = '2025-02-05 12:30:00' error_message = 'The requested page could not be found.' log_message = f"""[ERROR {error_code}] Time: {timestamp} URL: {url} {error_message}""" print(log_message)
[ERROR 404] Time: 2025-02-05 12:30:00 URL: /missing-page The requested page could not be found.

この方法は、ログメッセージを構造化し、適切にフォーマットされたログでデバッグを容易にします。

SQLクエリの動的生成

SQLクエリは、複数行文字列を使用して動的に構築することができます。

table = 'users' column = 'email' value = '[email protected]' query = f"""SELECT * FROM {table} WHERE {column} = '{value}';""" print(query)
SELECT * FROM users WHERE email = '[email protected]';

この方法はSQLクエリを可読にし、インデントを維持します。さらに、文字列の連結に + を使用する必要を排除します。

その他の使用例には:

  • フォーマットされた契約書の作成
  • Markdownまたは$\LaTeX$ ドキュメントの作成
  • マルチラインHTML/XMLテンプレート
  • APIレスポンスまたはJSONライクなテキストの生成

複数行の文字列補間の利点

複数行の文字列補間の利点はいくつかあります。

  • 文字列補間は、エスケープ文字 \nを必要とせずに書式を保持します。
  • 文字列補間は、単一行の書式よりも読みやすさを向上させます。
  • 文字列補間は、構造化されたテキスト(ログ、クエリ、レポートなど)を扱う際に整理された状態を保ちます。
  • 文字列補間は、インデントを崩さずに動的なテキスト生成を可能にします。

数値と特別な値のフォーマット

f文字列を使用して表示される小数点以下の桁数を制御するには、次の構文を使用します:f'{value:.nf}'、ここで value は浮動小数点数、n は小数点以下の桁数、f.の後のもの)は浮動小数点フォーマットを表します。

例を挙げると、次のコードは $\pi$ を異なる小数点以下の桁数で出力します。

pi = 3.1415926535 print(f'Pi rounded to 2 decimal places: {pi:.2f}') print(f'Pi rounded to 4 decimal places: {pi:.4f}') print(f'Pi rounded to 0 decimal places: {pi:.0f}')
Pi rounded to 2 decimal places: 3.14 Pi rounded to 4 decimal places: 3.1416 Pi rounded to 0 decimal places: 3

.format() メソッドを使用したフォーマットも同様です。

print('Pi rounded to 2 decimal places: {:.2f}'.format(pi)) print('Pi rounded to 4 decimal places: {:.4f}'.format(pi)) print('Pi rounded to 0 decimal places: {:.0f}'.format(pi))
Pi rounded to 2 decimal places: 3.14 Pi rounded to 4 decimal places: 3.1416 Pi rounded to 0 decimal places: 3

:.nf 構文を使用し、% と組み合わせてパーセンテージをフォーマットするには、n が小数点以下の桁数を表します。

score = 0.875 print(f"Success rate: {score:.2%}")
Success rate: 87.50%

f文字列を使用して、通貨をフォーマットすることができます。千の区切り文字を使用するには:,、小数点以下の桁数を制御するには.nfを使用します。また、$、€、または£などの通貨記号を文字列に直接含めることもできます。

amount = 98765.4321 print(f"USD: ${amount:,.2f}") print(f"EUR: €{amount:,.2f}") print(f"GBP: £{amount:,.2f}")
USD: $98,765.43 EUR: €98,765.43 GBP: £98,765.43

辞書とリストと組み合わせたf文字列の使用方法

Pythonの辞書を使用したf文字列を使う場合、波括弧内で角括弧表記(dict[‘key’])を使用して辞書の値にアクセスするか、辞書を**で展開して使います。

person = { 'name': 'Alice', 'age': 30, 'city': 'New York' } print(f"My name is {person['name']}, I am {person['age']} years old, and I live in {person['city']}.")
My name is Alice, I am 30 years old, and I live in New York.

各キーに個別にアクセスする代わりに、辞書をf文字列に展開することができます。

person = { 'name': 'Alice', 'age': 30, } print(f'My name is {name} and I am {age} years old.'.format(**person))
My name is Alice and I am 7 years old.

キーが存在しない場合のエラーを回避するために、辞書のアクセスにはget()を使用します。

person = {"name": "Alice"} # エラー:キー 'city' が見つかりません print(f"City: {person['city']}")
--------------------------------------------------------------------------- KeyError Traceback (most recent call last) Cell In[87], line 4 1 person = {"name": "Alice"} 3 # エラー:キー 'city' が見つかりません ----> 4 print(f"City: {person['city']}") KeyError: 'city'
print(f"City: {person.get('city', 'Not specified')}")
City: Not specified

文字列補間メソッドの長所と短所

私たちが見てきたように、f-stringsと.format()メソッドは、どちらも文字列の補間に役立つ方法です。それぞれの方法の長所と短所を比較してみましょう。

特徴

f-strings

.format()

%フォーマット

可読性

🟢 最良

🟡 良好

🔴 難しい

パフォーマンス

🟢 最速

🟡 遅い

🔴 最も遅い

式のサポート

🟢 はい

🟡 間接的

🔴 いいえ

複数行サポート

🟢 はい

🟢 はい

🔴 いいえ

使いやすさ

🟢 最も簡単

🟡 ミディアム

🔴 ハード

デバッグ(=演算子)

🟢 はい(Python 3.8+)

🔴 いいえ

🔴 いいえ

いつ.format()を使用すべきですか?

利点

.format()を使用する理由

レガシーPythonサポート

Python 2.7以上で動作

柔軟な順序付け

プレースホルダーの簡単な並び替えを許可

ダイナミックフォーマット

フォーマット指定子がダイナミックな場合に機能

{}ブレースをよりよく処理

余分な手動エスケープを回避

辞書とよく組み合わさる

辞書のキーを使いやすく

一般的な落とし穴とベストプラクティス

以下に、Python文字列補間のトラブルシューティング方法やトップのヒントをいくつか見つけることができます。

中括弧の構文エラーを回避

中括弧を用いた文字列補完を使用する際に犯す可能性のある構文エラーは多くあります。

  • すべての { に対して対応する } があることを確認してください。
print('Hello, my name is {name!'}
Cell In[96], line 1 print('Hello, my name is {name!'} ^ SyntaxError: closing parenthesis '}' does not match opening parenthesis '('

幸運なことに、エラーは単純で、修正も簡単です。

  • リテラル {} を表示するには {{ と }} を使用してください。

補完された文字列内で中括弧を印刷したい場合はどうなりますか? 中括弧内のものはすべて(評価されることを)試みられます。

print(f'Set notation: {a, b, c}')
--------------------------------------------------------------------------- NameError Traceback (most recent call last) Cell In[101], line 1 ----> 1 print(f'Set notation: {a, b, c}') NameError: name 'c' is not defined

Python は中括弧内の a, b, c をタプルとして解釈し、a に関連付けられた値を探そうとします。そのような変数が存在しないため、KeyError が発生します。修正するにはダブル中括弧 {{}} を使用します。.

print("Set notation: {{a, b, c}}")

集合表記: {{a, b, c}}

パフォーマンス比較: f-strings と .format() の比較

f-strings と .format() のパフォーマンスを比較してみましょう。.

import timeit name = "Alice" age = 30 pi = 3.1415926535 # f-stringのパフォーマンスを測定 f_string_time = timeit.timeit('f"My name is {name} and I am {age} years old."', globals=globals(), number=1000000) # .format()のパフォーマンスを測定 format_time = timeit.timeit('"My name is {} and I am {} years old.".format(name, age)', globals=globals(), number=1000000) # 式を使用したf-stringのパフォーマンスを測定 f_string_expr_time = timeit.timeit('f"Pi rounded to 2 decimal places: {pi:.2f}"', globals=globals(), number=1000000) # 式を使用した.format()のパフォーマンスを測定 format_expr_time = timeit.timeit('"Pi rounded to 2 decimal places: {:.2f}".format(pi)', globals=globals(), number=1000000) # 結果を出力 print(f"f-string (simple): {f_string_time:.6f} seconds") print(f".format() (simple): {format_time:.6f} seconds") print(f"f-string (with expression): {f_string_expr_time:.6f} seconds") print(f".format() (with expression): {format_expr_time:.6f} seconds")
f-string (simple): 0.080447 seconds .format() (simple): 0.129860 seconds f-string (with expression): 0.123171 seconds .format() (with expression): 0.146242 seconds

効率の観点から、f-stringを.format()よりも好むべきです

クリーンで読みやすい文字列補間のベストプラクティス

文字列のフォーマットが明確で効率的かつ保守可能であることを確認するには、以下のベストプラクティスに従って補間された文字列を使用してください。

  • 可読性のためにf-stringsを好む(Python 3.6以降)
# 推奨 name = "Alice" age = 30 print(f"My name is {name} and I am {age} years old.") # 非推奨(読みづらい) print("My name is {} and I am {} years old.".format(name, age)) # %フォーマットの使用を避ける(時代遅れ) print("My name is %s and I am %d years old." % (name, age))
My name is Alice and I am 30 years old. My name is Alice and I am 30 years old. My name is Alice and I am 30 years old.
  • 明確さのために名前付きプレースホルダーを使用
# 名前付きプレースホルダー(可読性が高い) user = {"name": "Alice", "age": 30} print(f"My name is {user['name']} and I am {user['age']} years old.") # .format() にインデックスを使用する(可読性が低い) print("My name is {0} and I am {1} years old.".format("Alice", 30))
My name is Alice and I am 30 years old. My name is Alice and I am 30 years old.
  • 複数行の文字列を可読性の高いものに保つ。
name = "Alice" age = 30 message = f"""Hello, {name}! We are happy to invite you to our event. At {age} years old, you are eligible for the VIP pass. Best regards, Event Team """ print(message)
Hello, Alice! We are happy to invite you to our event. At 30 years old, you are eligible for the VIP pass. Best regards, Event Team
  • ログにf-stringsを使用してより良いデバッグを行う

Python 3.8以降は、f-stringsでのデバッグのために=をサポートしています。

value = 42 # Output: value = 42 print(f"{value = }")
value = 42

結論

文字列補間は、Pythonにおける強力な機能であり、文字列のフォーマットをよりクリーンで、可読性が高く、効率的にします。利用可能なメソッドの中で、f-stringsは最も現代的で推奨されるアプローチであり、古いメソッドである.format()%フォーマットに比べて、より良いパフォーマンス、明確性、柔軟性を提供します。

命名されたプレースホルダーを使用し、小数点の精度を制御し、可読性のためにテキストを整列させ、欠落している辞書キーを適切に処理するなどのベストプラクティスに従うことで、Pythonでクリーンでプロフェッショナルかつメンテナブルな文字列フォーマットを書くことができます。

フォーマットされたレポート、複数行のメッセージ、または構造化データ出力を生成する際、f-stringsは変数や式をシームレスに統合するシンプルでありながら強力な方法を提供します。f-stringsを取り入れることで、コードの品質が向上するだけでなく、その効率も向上します。

Pythonの文字列補間に関する詳細情報は、DataCampのリソースをチェックしてください:

Source:
https://www.datacamp.com/tutorial/python-string-interpolation