Python.join или конкатенация строк
Я понимаю, что если у вас есть итерабельность, вы всегда должны использовать .join(iterable)
вместо for x in y: str += x
. Но если существует только фиксированное число переменных, которые еще не находятся в итерабельном, использует .join()
еще рекомендуемый способ?
Например, у меня есть
user = 'username'
host = 'host'
должен ли я делать
ret = user + '@' + host
или
ret = '@'.join([user, host])
Я не так много спрашиваю с точки зрения производительности, так как оба будут довольно тривиальными. Но я читал, что люди здесь говорят, всегда используют .join()
, и мне было интересно, есть ли какая-то конкретная причина для этого или вообще просто хорошая идея использовать .join()
.
Ответы
Ответ 1
Если вы создаете такую строку, вы обычно хотите использовать форматирование строк:
>>> user = 'username'
>>> host = 'host'
>>> '%[email protected]%s' % (user, host)
'[email protected]'
Python 2.6 добавил еще одну форму, которая не полагается на перегрузку оператора и имеет некоторые дополнительные функции:
>>> '{0}@{1}'.format(user, host)
'[email protected]'
В качестве общего руководства большинство людей будут использовать +
для строк только в том случае, если они добавят две строки прямо там. Для большего количества деталей или более сложных строк они либо используют форматирование строк, как и выше, либо собирают элементы в списке и объединяют их вместе (особенно, если они связаны с какой-либо формой цикла). Причина использования str.join()
заключается в том, что добавление строк вместе означает создание новой строки (и, возможно, уничтожение старых) для каждого добавления. Python иногда может оптимизировать это, но str.join()
быстро становится яснее, более очевидным и значительно быстрее.
Ответ 2
Я задаю вопрос: "Можно ли это сделать:"
ret = user + '@' + host
.. и ответ - да. Это прекрасно.
Вы должны, конечно, знать о том, что вы можете делать в Python, и вы должны знать, что для длинных списков "присоединиться" - это путь, но для простой ситуации вроде этого, что у вас все в порядке. Это просто и понятно, и производительность не будет проблемой.
Ответ 3
(Я уверен, что все люди, указывающие на форматирование строк, полностью не задают вопрос.)
Создание строки путем построения массива и присоединения к ней производится только по соображениям производительности. Если вам не нужна эта производительность, или, если это не будет естественным способом ее реализации, в любом случае нет никакой выгоды для этого, а не для простой конкатенации строк.
Высказывание '@'.join([user, host])
неинтуитивно. Меня удивляет: почему он это делает? Есть ли тонкости к нему; есть ли случай, когда может быть больше одного "@"? Ответ - нет, конечно, но для этого нужно больше времени, чем если бы оно было написано естественным образом.
Не сворачивайте свой код, чтобы избежать конкатенации строк; в этом нет ничего неправильного. Объединение массивов - это просто оптимизация.
Ответ 4
Я просто хочу отметить, что я всегда использовал конкатенацию на месте, пока не перечитал часть общего стиля Python PEP PEP-8 Руководство по стилю для кода Python.
- Код должен быть написан таким образом, чтобы это не ущемляло другие реализации Python (PyPy, Jython, IronPython, Pyrex, Psyco, и тому подобное). Например, не полагайтесь на эффективную реализацию CPython конкатенация строки на месте для операторов в форме a + = b или = a + b. Эти утверждения работают медленнее в Jython. В чувствительных к производительности то часть библиотеки должна использоваться вместо этого. '.join(). Эта будет гарантировать, что конкатенация происходит в линейном реализации.
Следуя этому, я перехожу к практике использования объединений, чтобы сохранить привычку как более автоматическую практику, когда эффективность является чрезвычайно критичной.
Итак, я заложу свой голос за:
ret = '@'.join([user, host])
Ответ 5
Я использую следующий:
ret = '%[email protected]%s' % (user, host)