Подтвердить что ты не робот

Python.join или конкатенация строк

Я понимаю, что если у вас есть итерабельность, вы всегда должны использовать .join(iterable) вместо for x in y: str += x. Но если существует только фиксированное число переменных, которые еще не находятся в итерабельном, использует .join() еще рекомендуемый способ?

Например, у меня есть

user = 'username'
host = 'host'

должен ли я делать

ret = user + '@' + host

или

ret = '@'.join([user, host])

Я не так много спрашиваю с точки зрения производительности, так как оба будут довольно тривиальными. Но я читал, что люди здесь говорят, всегда используют .join(), и мне было интересно, есть ли какая-то конкретная причина для этого или вообще просто хорошая идея использовать .join().

4b9b3361

Ответ 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)