Оператор конкатенации + или, - PullRequest
11 голосов
/ 09 января 2010
var1 = 'abc'
var2 = 'xyz'

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

... за исключением автоматических пробелов с ',' какая разница между ними? Какой использовать нормально, а также самый быстрый?

Спасибо

Ответы [ 3 ]

25 голосов
/ 09 января 2010

(Вы используете Python 3.x, где print - это функция & mdash; в 2.x print - это оператор. Рекомендуется упомянуть основную версию Python & mdash; 2.x или 3.x & mdash; особенно когда с просьбой о помощи, потому что в настоящее время большинство людей разумно принимают 2.x, если это не указано.)

Первый, print('literal' + var1 + var2), оценивает выражение и передает единственный аргумент для печати. Второй, print('literal', var1, var2), просто передает три аргумента на печать. Это почти тот же результат, чисто случайно: так работает печать. Второй не выполняет никакой конкатенации, а просто выводит каждое значение, разделенное пробелом (что является поведением печати по умолчанию).

Чтобы быть явным: плюс в выражении означает выполнение конкатенации, но запятая не выполнение конкатенации.


Сроки: Я получил результаты ниже; однако, я считаю, что это предвзято, потому что строки очень короткие (например, более длинные строки могут изменить результат), и в любом случае печать, представленная в вопросе, не займет много времени (вы получите лучшую производительность, беспокоясь о многие другие вещи вместо этого).

Примечание: Используйте 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

В частности, обратите внимание, что каждый код будет выдавать один и тот же вывод (сравнивать бессмысленно, если один метод дает неправильные результаты ). StringIO - это простой способ печати , а не на экране в этих тестах, но это также может повлиять на результаты.

6 голосов
/ 09 января 2010

Передача строк в качестве аргументов для печати объединяет их с ключевым словом '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
1 голос
/ 09 января 2010

Использование запятой дает функции печати несколько аргументов (которые в этом случае печатаются все, разделенные пробелом. Использование плюса создаст один аргумент для печати, который будет напечатан полностью). Я думаю, что использование + лучше в этом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...