Python 3.6では、文字列をフォーマットする新しい方法としてf-Stringが導入されました。
これはPythonの他の文字列フォーマット方法よりも高速で、文字列の中でPython式を評価することができます。
この記事では、Pythonで文字列をフォーマットするさまざまな方法について見ていきます。
そして、f-Stringをより深く見て、異なるデータを表示するときにどのように使用できるかを見ていきます。
Pythonの伝統的な文字列フォーマット
f-Stringに入る前に、Pythonで利用できるより「伝統的な」文字列書式オプションを見てみましょう。
もしf-Stringについて学びたいだけなら、この記事の「f-Stringを使った文字列書式設定」のセクションをチェックしてください。
文字列の連結
文字列の連結は、2つの文字列を組み合わせて新しい文字列を作ることを意味します。
Pythonでは、文字列の連結は通常 +
演算子で行います。
Python インタープリターで、文字列の中に変数を含めるために連結を使ってみましょう。
name = "Python"
print("I like " + name + " very much!")
次のような出力が表示されるでしょう。
I like Python very much!
文字列の連結は文字列に対してのみ働きます。
文字列以外のデータを含めたい場合は、手動で変換する必要があります。
数字と文字列を連結する例を見てみましょう。
age = (10 + 5) * 2
print("You wouldn't believe me, but I am only " + age + " years old")
これを実行すると、次のようなエラーが表示されます。
Traceback (most recent call last):
File "<stdin", line 1, in <module
TypeError: can only concatenate str (not "int") to str
では、age
を文字列に変換してみましょう。
age = (10 + 5) * 2
print("You wouldn't believe me, but I am only " + str(age) + " years old")
インタープリタは正しく次のように表示します。
You wouldn't believe me, but I am only 30 years old
この方法は、Pythonが常に最速で評価できるわけではありませんし、人間が多くの変数を管理するのも簡単ではありません。
Pythonの専用の文字列フォーマットメソッドを使う方がよいでしょう。
C-Styleの文字列フォーマット
C スタイルの文字列フォーマットは printf スタイルとも呼ばれ、文字列をテンプレートとして使用し、変数に代入できるように %
でマークされます。
例えば、 %d
は Python に数値を代入していることを伝え、 %s
は Python に文字列を代入していることを伝えています。
例えば、 %02d
は数値が少なくとも2桁であることを保証し、そうでない場合は残りをゼロで埋めるというような、いくつかの制御メカニズムも用意されています。
また、 %.4f
のようなマーカーを使用すると、文字列中の浮動小数点数がちょうど4桁の小数を代入することができます。
Pythonインタプリタで、次のコードをタイプして、C言語スタイルの文字列書式が実際に使われているところを見ましょう。
print('Here is an integer %02d' % 4)
print('And a float: %.2f' % 3.141592)
print("And a %s with %d replacements" % ("mess", 2))
あなたの出力は次のようになります。
Here is an integer 04
And a float: 3.14
And a mess with 2 replacements
このように、引数を増やしていくと、かなり複雑でわかりにくくなります。
そこでPythonはこれをさらに一歩進めて、%
フォーマットで辞書を使うことができるようにしました。
全体的な美観はあまり改善されませんが、読みやすさの面では少しは役に立つかもしれません。
C言語の文字列を辞書でフォーマットしてみましょう。
print('Using %(dictionary)s format in C-style string formatting, here is %(num)d number to make it more interesting!' % {'dictionary': "named", "num": 1})
見ての通り、%
と残りの識別子の間にある括弧の中で名前を指定することができます。
インタプリタはこう表示するはずです。
Using named format in C-style string formatting, here is 1 number to make it more interesting!
もしあなたが過去42年間をC言語で開発した経験がないのであれば、上記の構文は好みに合わないかもしれません。
そのため、Pythonでは文字列の format()
メソッドを使って別の選択肢を用意しています。
Python format() 関数
format()関数は C スタイルのフォーマットと似たような動作をしますが、より可読性に優れています。
この関数は、文字列に対してformat()メソッドを呼び出すと同時に、テンプレート内の置換候補を中括弧 -
{}` 内に記述することで動作します。
Pythonインタプリタを使って、文字列をフォーマットするために format()
メソッドを使用します。
まず、文字列を一つ置き換えてみましょう。
print("This is a first {}".format("attempt!"))
出力は次のようになります。
This is a first attempt!
中括弧を複数回使って、順番に変数を代入していきます。
print("And {} can add {} string too.".format("we", "more"))
出力は
And we can add more string too.
フォーマットしている変数に名前を付けることもできます。
print("String format also supports {dictionary} arguments.".format(dictionary="named"))
上記のコードは次のように表示されます。
String format also supports named arguments.
この方法はとても読みやすいのですが、Pythonはf-Stringを使うことでより効率的に、しかも読みやすくすることができます。
f-Stringをもっと詳しく見てみましょう。
f-Stringを使った文字列フォーマット
F-String、またはフォーマットされた文字列リテラルは、接頭辞に f
を持ち、中括弧で囲まれた置換フィールドを含みます。
これらは実行時に評価されるので、(少なくともCPythonの標準実装では)Pythonで最も高速な文字列フォーマットオプションとなります。
まず、Pythonのバージョンが3.6以上であることを確認してください。
$ python3 --version
Python 3.6.0
もしPythonのバージョンが3.6未満であれば、この機能を使うにはアップグレードする必要があります。
F-Stringリテラルはf
で始まり、その後に任意の文字列(シングルクォート、ダブルクォート、トリプルクォート)が続き、中括弧で囲まれた文字列の中にPythonの式を記述することができます。
f-StringをPythonシェルで使ってみましょう。
name = "f-String"
print(f"hello {name}!")
そして、それを実行すると、魔法を見ることができます。
hello f-String!
これは format()
関数を使うのと非常によく似ています。
しかし、他の書式設定方法にはない多くの機能がついています。
それらの機能を、複数行の文字列から見ていきましょう。
複数行のf文字列
F-Strings では、複数行の文字列を括弧で囲むだけで、複数行の文字列を作成することができます。
name = "World"
message = (
f"Hello {name}. "
"This is from a multi-lined f-string. "
f"Have a good day, {name}"
)
print(message)
印刷するとこのようになります。
Hello World. This is from a multi-lined f-string. Have a good day, World
置換を行う行の前に f
リテラルを置くことを忘れないでください。
そうしないと置換がうまくいきません。
Python の式を f-文字列で評価する
Python の f-Strings では、文字列の中で直接式を書くことができます。
次のような文字列が有効です。
number = 10
print(f"{number} + 1 = {number+1}")
そして出力します。
10 + 1 = 11
特殊文字でない限り、どんな有効な式でも入れることができます。
例えば、関数呼び出しができる。
def func():
return 42
print(f"func() = {func()}")
これは以下を返します。
func() = 42
f文字列を使ったクラスの書式設定
クラスから生成されたオブジェクトをf-Stringに含めることができます。
すべてのクラスはオブジェクトを文字列に変換するための2つの異なるメソッドを持っています。
- オブジェクトの
__str__()
メソッドは、ユーザが表示でき、かつ、ユーザが理解できるような文字列を返す必要があります。つまり、ユーザーから隠されるべき秘密の情報を持ってはいけませんし、デバッグメッセージも持ってはいけません。 - オブジェクトの
__repr__()
メソッドはより詳細な文字列を返すべきで、おそらくデバッグ情報を含むでしょう。
f-Strings は提供されたオブジェクトに対して自動的に __str__()
を呼び出します。
それでは、このf-Stringをクラスで試してみましょう。
ここでは、私たちの名前と、私たちの想像上のシステムが使用するデータベースIDを格納する User
クラスを作成することにします。
新しいファイル fstring_classes.py
を作成し、以下を追加してください。
# fstring_classes.py
class User:
def __init__(self, name, db_id):
self.name = name
self.db_id = db_id
def __str__(self):
return f"User with name: {self.name}"
my_user = User("Sajjad", 12)
print(f"{my_user}")
ターミナルで、このファイルを Python で実行します。
$ python fstring_classes.py
このプログラムは次のように表示されます。
User with name: Sajjad
オブジェクトの __repr_()
メソッドで f-String を使いたい場合は、代入するオブジェクトの前に !r
をつければいいのです。
fstring_classes.py` ファイルを編集して、最後の行を変更してください。
print(f"{my_user}")
この行には !r
という接尾辞が含まれています。
print(f"{my_user!r}")
これで、このプログラムを再び実行することができます。
$ python fstring_classes.py
そして、出力は次のようになります。
User with name: Sajjad with id 12
f-文字列の特殊文字の扱いについて
F-Stringは他のPythonの文字列と同様に、バックスラッシュを使用して文字をエスケープすることをサポートしています。
以下のものはすべて有効なPythonのf-Stringです。
print(f'escaping with is also possible, like: '')
これを実行すると、次のように表示されます。
escaping with is also possible, like: '
ただし、中括弧(f-Stringの式部分)の中でバックスラッシュを使用することはできません。
Pythonのインタープリターで次のようにしてみてください。
print(f'{ord("
")}')
と試すと、次のようなエラーが出ます。
File "<stdin", line 1
SyntaxError: f-string expression part cannot include a backslash
同型の引用符についても、同様の制限があります。
以下のようなコードです。
a = {"key": "value"}
print(f"the value is {a["key"]}")
このような構文エラーが発生します。
File "<stdin", line 1
print(f"the value is {a["key"]}")
^
SyntaxError: invalid syntax
これらの問題を避けるには、f-Stringの外側で計算すればよいのです。
ord_newline = ord("
")
print(f'{ord_newline}')
と表示されます。
10
または、異なる引用符の種類を使用することもできます。
a = {"key": "val"}
print(f"The value is {a['key']}")
どのように表示するか。
The value is val
結論
この記事では、Pythonで文字列をフォーマットするさまざまな方法について、f-Stringメソッドに焦点を当てて見てきました。
Pythonでは、文字列を連結したり、%でC-Styleフォーマットを使ったり、文字列に対して
format()` メソッドを使ったりと、選択肢は豊富です。
しかし、f-Stringsを使えば、Pythonが最適化した可読性の高いソリューションが得られます。
速度の利点は別として、f-Stringがクラスから式やオブジェクトを評価する際にどれだけうまくいくかを見てきました。
</module