Конкатенация строк без оператора "+"

Я играл с python и понял, что нам не нужно использовать оператор "+" для объединения строк, если он не используется со значениями.

Например:

string1 = 'Hello'   'World'  #1 works fine
string2 = 'Hello' + 'World'  #2 also works fine

string3 = 'Hello'
string4 = 'World'
string5 = string3   string4  #3 causes syntax error
string6 = string3 + string4  #4 works fine

Теперь у меня есть два вопроса:

  1. Почему утверждение 3 не работает, а утверждение 1 работает?
  2. Есть ли какие-либо технические различия, такие как скорость расчета и т.д. Между утверждениями 1 и 2?

Ответ 1

Из docs:

Разрешены несколько соседних строковых литералов (ограниченных пробелами), возможно, с использованием разных соглашений о цитировании, и их значение совпадает с их конкатенацией. Таким образом, "привет" "мир" эквивалентен "helloworld".


Заявление 3 не работает, потому что:

Оператор '+ должен использоваться для конкатенации строковых выражений во время выполнения.

Обратите внимание, что заголовок подзаголовка в документах также является "конкатенацией строковых литералов". Это работает только для строковых литералов, а не для других объектов.


Вероятно, нет никакой разницы. Если это так, это, вероятно, чрезвычайно мало и ничего, о чем никто не должен беспокоиться.


Кроме того, поймите, что это может быть опасно:

>>> def foo(bar, baz=None):
...     return bar
... 
>>> foo("bob"
... "bill")
'bobbill'

Это прекрасный пример того, где ошибки никогда не должны проходить молча. Что, если бы я хотел, чтобы "bill" был аргументом baz? Я забыл запятую, но ошибки не возникает. Вместо этого произошла конкатенация.

Ответ 2

Чтобы ответить на второй вопрос: нет никакой разницы (по крайней мере, с реализацией, которую я использую). Разбирая оба утверждения, они отображаются как LOAD_CONST STORE_FAST. Они эквивалентны.

Ответ 3

Вы можете использовать %s, поскольку это более эффективно, чем использование знака +.

>>> string2 = "%s %s" %('Hello', 'World')
>>> string2
'Hello World'

(ИЛИ)


еще один метод: .format

>>> string2 = "{0} {1}".format("Hello", "World")
>>> string2
'Hello World'
>>> 

Ответ 4

Это неявное строковое литералирование конкатенации. Это происходит только с строковыми литералами, а не с переменными или другими выражениями, которые оценивают строки. Раньше существовала (крошечная) разница в производительности, но в наши дни оптимизатор подглядывания должен визуализировать формы по существу эквивалентными.

Ответ 5

Оператор 3 не работает, так как когда вы объединяете два строковых выражения для создания новой строки, вам нужен оператор "+".

в то время как в случае строк 1, 2 и 4 смежные литералы, разделенные пробелами, используют разные соглашения о кавычках. Поэтому им разрешено печатать их так же, как их конкатенацию.

кроме того, при выполнении этих двух операций не будет существенной или заметной разницы во времени.

%%timeit -n 1
s1='ab'
s2='ba'
print(s1+s2)

о/р Самый медленный пробег длился в 17,08 раза дольше, чем самый быстрый. Это может означать, что промежуточный результат кэшируется. 57,8 мкс ± 92,5 мкс на цикл (среднее ± стандартное отклонение из 7 циклов, по 1 циклу каждый)

%%timeit -n 1
s3='ab' 'ba'
print(s3)

о/р Самый медленный пробег длился в 4,86 раза дольше самого быстрого. Это может означать, что промежуточный результат кэшируется. 25,7 мкс ± 21 мкс на цикл (среднее ± стандартное отклонение из 7 циклов, по 1 циклу каждый)

Ответ 6

Почему утверждение 3 не работает, а утверждение 1 -

Потому что в первом утверждении мы присваиваем некоторую константу переменной. Присвоение переменной достаточно просто, так что мы можем продолжать помещать несколько констант в одну переменную, и присвоение все равно будет проходить. Термины "hello" и "world" являются двумя константами одного типа. Итак, выражение сработало.

Если мы сделаем следующее, мы получим SyntaxError

string1 = "Hello" 1

Причина в том, что мы указали несколько констант в одном назначении переменной. Этот запутанный питон выбросил его как ошибку.

Утверждение 3 - это назначение переменной на основе двух переменных. Это создаст SyntaxError, так как python не знает, что он может делать с 2 переменными, прежде чем присваивать его переменной.

Есть ли какие-либо технические различия, такие как скорость расчета и т.д. Между утверждениями 1 и 2?

Да. Единственным техническим отличием является удобочитаемость, а не все остальное. Читаемость важнее всего в Python. На первый взгляд, "hello" "world" может выглядеть так, будто компилятор добавляет пространство в строки. Что не так.

Тем не менее,

"hello" + "world"

явно и нормально. Почти всегда явное лучше, чем неявное.