Я понимаю, что мы должны использовать %s
для объединения строк, а не +
в Python.
Я мог сделать любое из:
hello = "hello"
world = "world"
print hello + " " + world
print "%s %s" % (hello, world)
print "{} {}".format(hello, world)
print ' '.join([hello, world])
Но почему я должен использовать что-то кроме +
? Быстрее написать объединение с простым +
. Затем , если вы посмотрите на строку форматирования, можно указать типы , например , %s
и %d
и такие. Я понимаю, что может быть лучше четко указать тип.
Но потом я прочитал, что +
следует избегать использования конкатенации, хотя ее проще набирать. Есть ли четкая причина, по которой строки должны объединяться одним из этих других способов?
%s
не для конкатенации, это спецификация преобразования для форматирования строк, полученная из Сиprintf(3)
. Существуют случаи для использования этого или оператора конкатенации; то, что вы используете, должно основываться на оценке ситуации, а не на догме. Насколько легко написать код, совершенно не имеет значения, потому что вы собираетесь сделать это только один раз.print(f"{hello} {world}")
, имеет читабельность конкатенации, поскольку переменные видны там, где они встречаются в строке, и быстрее, чемstr.format
.Ответы:
Читаемость. Синтаксис строки формата более читабелен, поскольку он отделяет стиль от данных. Кроме того, в Python
%s
синтаксис будет автоматически приводить любые не-str
типы кstr
; в то время как конкатенация работает только сstr
, и вы не можете объединитьstr
сint
.Представление. В Python
str
является неизменным, поэтому левая и правая строки должны быть скопированы в новую строку для каждой пары конкатенации. Если вы объедините четыре строки длиной 10, вы будете копировать (10 + 10) + ((10 + 10) +10) + (((10 + 10) +10) +10) = 90 символов вместо всего 40 персонажи. И все становится квадратично хуже с увеличением числа и размера строки. В некоторых случаях Java оптимизирует этот случай, трансформируя серию конкатенаций в использованиеStringBuilder
, но CPython этого не делает.В некоторых случаях библиотека ведения журнала предоставляет API, который использует строку формата для создания строки записи журнала lazily (
logging.info("blah: %s", 4)
). Это здорово для повышения производительности, если библиотека журналов решила, что текущая запись журнала будет отброшена фильтром журнала, поэтому ей не нужно форматировать строку.источник
Я единственный, кто читает слева направо?
Для меня использование
%s
- это как слушать говорящих по-немецки, где мне приходится ждать до конца очень длинного предложения, чтобы услышать, что такое глагол.Что из этого яснее с первого взгляда?
или же
источник
n
десятилетия мой ум тоже работает таким образом ;-) Но я все еще поддерживаю свой ответ, второй яснее и проще для чтения, поэтому его нужно поддерживать. И это становится более очевидным, чем больше у вас параметров. В конце концов, если это шоу для одного человека, следуйте тому, с чем вы знакомы и с которым вам удобно; если это командная работа, обеспечить согласованность и проверку кода; люди могут привыкнуть к любому.f"your {object} is in the {location}"
."your '" + object + "' is in the '" + location + "'"
... Я даже не уверен, понял ли я это прямо сейчас ...Пример, поясняющий аргумент читабельности:
(Обратите внимание, что второй пример не только более читабелен, но и проще в редактировании, вы можете изменить шаблон в одной строке и список переменных в другой)
Отдельная проблема заключается в том, что код% s также конвертируется в строку, в противном случае вам придется использовать вызов str (), который также менее читабелен, чем код% s.
источник
Использование
+
следует не избегать вообще. Во многих случаях это правильный подход. Использование%s
или.join()
являются предпочтительными только в особых случаях, и это обычно совершенно очевидно, когда они являются лучшим решением.В вашем примере вы объединяете три строки вместе, и пример использования
+
, очевидно, является самым простым и наиболее читаемым, и, следовательно, рекомендуемым.%s
или.format()
полезны, если вы хотите интерполировать строки или значения в середине большей строки. Пример:В этом случае
%s
его использование будет более читабельным, поскольку вы не будете разбивать первую строку на несколько сегментов. Особенно, если вы интерполируете несколько значений..join()
подходит, если у вас есть последовательность строк переменного размера и / или вы хотите объединить несколько строк с одним и тем же разделителем.источник
Поскольку порядок слов может меняться на разных языках, форма с
%s
обязательна, если вы хотите правильно поддерживать перевод строк в вашем программном обеспечении.источник