web-dev-qa-db-ja.com

連結演算子+または、

var1 = 'abc'
var2 = 'xyz'

print('literal' + var1 + var2) # literalabcxyz
print('literal', var1, var2) # literal abc xyz

...「、」の付いた自動スペースを除いて、2つの違いは何ですか?どちらを通常使用するか、どちらが最速ですか?

ありがとう

11
eozzy

(Python 3.xを使用しています。ここで、printは関数です。2.xでは、printはステートメントです。メジャーPythonバージョン—2.xまたは3.x—特に助けを求めるとき。現在ほとんどの人は、特に明記されていない限り、2.xを合理的に想定しているためです。)

最初のprint('literal' + var1 + var2)は、式を評価し、単一の引数を渡して出力します。 2番目のprint('literal', var1, var2)は、3つの引数を渡して出力します。これは、まったく同じ出力です。これが、印刷の仕組みです。 2つ目は、連結を行わず、スペースで区切られた各値を出力するだけです(これはprintのデフォルトの動作です)。

明示的に言うと、式のプラスis連結を実行しますが、コンマis連結を実行します。


タイミング:以下の結果が得られました。ただし、文字列が非常に短いため(たとえば、文字列が長くなると結果が逆になる可能性があるため)、これには偏りがあると思います。いずれの場合も、質問に示されているように印刷するのにそれほど時間はかかりません(心配することでパフォーマンスが向上します代わりに多くの他のもの)。

注:timeitの使用方法については、python -m timeit --helpを使用してください。

$ python -m timeit -s 'from cStringIO import StringIO; out = StringIO(); a = "abc"; b = "def"' 'print >>out, a, b'
100000 loops, best of 3: 7.68 usec per loop
$ python -m timeit -s 'from cStringIO import StringIO; out = StringIO(); a = "abc"; b = "def"' 'print >>out, a + " " + b'
100000 loops, best of 3: 4.67 usec per loop
$ python -m timeit -s 'from cStringIO import StringIO; out = StringIO(); a = "abc"; b = "def"' 'print >>out, " ".join([a, b])'
100000 loops, best of 3: 5.37 usec per loop

特に、各コードがまったく同じ出力を提供することに注意してください(1つのメソッドが間違った結果を提供するかどうかを比較することは無意味です)。 StringIOは、これらのテストで画面にnot印刷する簡単な方法ですが、結果にも影響を与える可能性があります。

26
Roger Pate

印刷する引数として文字列を渡すと、文字列は「sep」キーワードで結合されます。デフォルトは ''(スペース)です。

セパレータのキーワードはPython 3.xのみです。それ以前は、セパレータは常にスペースです。ただし、2.5(?)以降ではfrom __future__ import print_functionまたはそのようなもの。

>>> print('one', 'two') # default ' '
one two
>>> print('one', 'two', sep=' and a ')
one and a two
>>> ' '.join(['one', 'two'])
one two
>>> print('one' + 'two')
onetwo
6
Tor Valamo

カンマを使用すると、print関数に複数の引数が与えられます(この場合、スペースで区切られてすべて印刷されます。plusを使用すると、printの引数が1つ作成され、全体が印刷されます。この場合は、+を使用するのが最適だと思います。 。

1
rael_kid