web-dev-qa-db-ja.com

%sが+よりも優れているのはなぜですか?

Pythonでは%sではなく+を使用して文字列を連結する必要があることを理解しています。

私は次のいずれかを行うことができます:

hello = "hello"
world = "world"

print hello + " " + world
print "%s %s" % (hello, world)
print "{} {}".format(hello, world)
print ' '.join([hello, world])

しかし、なぜ+以外のものを使用する必要があるのですか?単純な+を使用して連結を記述する方が高速です。次に、フォーマット文字列を見る場合、タイプを指定します。 %sおよび%dなど。型について明示する方がよい場合があることを理解しています。

しかし、次に、タイプする方が簡単ですが、連結に+を使用することは避けてください。文字列を他の方法のいずれかで連結する必要がある明確な理由はありますか?

91
Niklas
  1. 読みやすさ。書式文字列の構文は、スタイルとデータを区別するため、より読みやすくなっています。また、Pythonでは、_%s_構文はstr以外の型をstrに自動的に強制変換します。一方、連結はstrでのみ機能し、strintで連結することはできません。

  2. パフォーマンス。 Python strは不変であるため、連結のペアごとに、左右の文字列を新しい文字列にコピーする必要があります。長さ10の4つの文字列を連結する場合、 (10 + 10)+((10 + 10)+10)+(((10 + 10)+10)+10)= 90文字をコピーします。40文字だけではありません。文字列のサイズが増加します。Javaは、一連の連結を変換してStringBuilderを使用することにより、このケースを最適化しますが、CPythonは最適化しません。

  3. 一部の使用例では、ロギングライブラリは、フォーマット文字列を使用してログエントリ文字列を遅延して作成するAPI(logging.info("blah: %s", 4))を提供します。これは、ログライブラリが現在のログエントリをログフィルターによって破棄することを決定した場合にパフォーマンスを向上させるのに最適であるため、文字列をフォーマットする必要はありません。

93
Lie Ryan

左から右に読むのは私だけですか?

私にとっては、%sはドイツ語の話者の話を聞くようなもので、私は動詞が何であるかを聞くために非常に長い文の終わりまで待たなければなりません。

これらのどれが一目ではっきりしますか?

"your %s is in the %s" % (object, location)

または

"your " + object + " is in the " + location  

可読性の引数を明確にする例:

print 'id: ' + id + '; function: ' + function + '; method: ' + method + '; class: ' + class + ' -- total == ' + total

print 'id: %s; function: %s; method: %s; class: %s --total == %s' % \
   (id, function, method, class, total)

(2番目の例の方が読みやすいだけでなく編集も簡単であることに注意してください。1つの行でテンプレートを変更し、別の行で変数のリストを変更できます)

別の問題は、%sコードも文字列に変換されることです。それ以外の場合は、%sコードよりも読みにくいstr()呼び出しを使用する必要があります。

13
Rainy

_+_の使用はnotを一般的に回避する必要があります。多くの場合、これが正しいアプローチです。 _%s_または.join()の使用は、特定の場合にのみ推奨され、通常、それらがより良い解決策である場合は非常に明白です。

あなたの例では、3つの文字列を連結しているので、_+_を使用する例は明らかに最も単純で最も読みやすいため、推奨されます。

_%s_または.format()は、より大きな文字列のmiddleの文字列または値を補間する場合に便利です。例:

_print "Hello %s, welcome to the computer!" % name
_

この場合、_%s_を使用すると、最初の文字列を複数のセグメントに分割しないため、読みやすくなります。特に、複数の値を補間する場合。

.join()は、可変サイズの文字列シーケンスがある場合や、複数の文字列を同じセパレータで連結したい場合に適しています。

7
JacquesB

Wordの順序は言語によって異なる場合があるため、%sは、ソフトウェアで文字列の翻訳を適切にサポートする場合に不可欠です。

2
martjno