Конкатенация строк без оператора "+"
Я играл с 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
Теперь у меня есть два вопроса:
- Почему утверждение 3 не работает, а утверждение 1 работает?
- Есть ли какие-либо технические различия, такие как скорость расчета и т.д. Между утверждениями 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"
явно и нормально. Почти всегда явное лучше, чем неявное.