文字列をフォーマットする方法はいくつかあります。
- Python <2.6:
"Hello %s" % name
- Python 2.6+:
"Hello {}".format(name)
(使用str.format
) - Python 3.6+:
f"{name}"
(f 文字列を使用)
どちらが優れているのでしょうか、またどのような状況に適していますか?
以下の方法は同じ結果になりますが、違いは何でしょうか?
name = "Alice" "Hello %s" % name "Hello {0}".format(name) f"Hello {name}" # Using named arguments: "Hello %(kwarg)s" % {'kwarg': name} "Hello {kwarg}".format(kwarg=name) f"Hello {name}"
文字列のフォーマットはいつ実行されますか? また、実行時のパフォーマンスの低下を回避するにはどうすればよいですか?
文字列のフォーマット方法を探しているだけの重複した質問を閉じる場合は、変数の値を文字列内に入れるにはどうすればよいですか?。
ベストアンサー1
最初の質問に答えると....format
いろいろな意味でより洗練されているように思えます。 の厄介な点%
は、変数またはタプルのいずれかを取ることができることです。 次のようなコードは常に機能すると思われます。
"Hello %s" % name
しかし、name
が である場合(1, 2, 3)
、 がスローされますTypeError
。常に が印刷されることを保証するには、次のようにする必要があります。
"Hello %s" % (name,) # supply the single argument as a single-item tuple
これは単に醜いだけです。.format
これらの問題はありません。また、あなたが挙げた 2 番目の例では、.format
例の見た目がはるかにきれいです。
Python 2.5 との下位互換性のためだけに使用してください。
2 番目の質問にお答えすると、文字列のフォーマットは他の操作と同時に、つまり文字列フォーマット式が評価されるときに行われます。また、Python は遅延言語ではないため、関数を呼び出す前に式を評価するため、式はlog.debug("some debug info: %s" % some_info)
最初に文字列を 、たとえば に評価し"some debug info: roflcopters are active"
、次にその文字列が に渡されますlog.debug()
。