文字列の書式設定: % と .format と f-string リテラルの比較 質問する

文字列の書式設定: % と .format と f-string リテラルの比較 質問する

文字列をフォーマットする方法はいくつかあります。

  • Python <2.6:"Hello %s" % name
  • Python 2.6+: "Hello {}".format(name)   (使用str.format
  • Python 3.6+: f"{name}"   (f 文字列を使用)

どちらが優れているのでしょうか、またどのような状況に適していますか?


  1. 以下の方法は同じ結果になりますが、違いは何でしょうか?

    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}"
    
  2. 文字列のフォーマットはいつ実行されますか? また、実行時のパフォーマンスの低下を回避するにはどうすればよいですか?


文字列のフォーマット方法を探しているだけの重複した質問を閉じる場合は、変数の値を文字列内に入れるにはどうすればよいですか?

ベストアンサー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()

おすすめ記事