Python: Конкатенация
В веб-разработке программы постоянно оперируют строками. Все, что мы видим на сайтах, так или иначе представлено в виде текста. Этот текст чаще всего динамический — то есть он получается из разных частей, которые соединяются вместе.
Чтобы соединить строки, нужно выполнить конкатенацию:
# Оператор такой же, как и при сложении чисел, # но здесь он имеет другой смысл (семантику) print('Dragon' + 'stone') # => Dragonstone
Склеивание строк всегда происходит в том же порядке, в котором записаны операнды. Левый операнд становится левой частью строки, а правый — правой. Вот еще несколько примеров:
print('Kings' + 'wood') # => Kingswood print('Kings' + 'road') # => Kingsroad print("King's" + 'Landing') # => King'sLanding
Как видите, строки можно склеивать, даже если их записали с разными кавычками.
Пробел — такой же символ, как и другие, поэтому сколько пробелов поставите в строке, столько и получится в итоговой строке:
# Ставим пробел в левой части print("King's " + 'Landing') # => King's Landing # Ставим пробел в правой части print("King's" + ' Landing') # => King's Landing
Задание
Выведите на экран
Winter came for the House of Frey.
используя конкатенацию слов.
Упражнение не проходит проверку — что делать?
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
- Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Мой код отличается от решения учителя
Это нормально , в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Прочитал урок — ничего не понятно
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Полезное
- Если в редакторе есть запись # BEGIN и # END , то код нужно писать между этими строчками.
Определения
- Конкатенация — операция соединения двух строк. Например, print(«King’s » + ‘ Landing’)
Как работает конкатенация строк в Python 3? Примеры.
Конкатенация строк — самая распространенная операция в программировании на Python. Есть несколько варинатов как сложить две строки.
Конкатенация строк в Python
Варианты обьединения строк:
- + operator
- метод join()
- % оператор
- функция format()
- f-string (форматированные строковые литералы)
Конкатенация строк с помощью оператора ‘+’
Это самый простой способ. Давайте рассмотрим на примере:
s1 = 'Apple' s2 = 'Pie' s3 = 'Sauce' s4 = s1 + s2 + s3 print(s4)
Результат: «Pythonist.ru нужен Питонисту»
Давайте рассмотрим другой пример, где мы получаем 2 строки от пользователя и потом конкатенируем их.
s1 = input('Введите первую строку :\n') Введите первую строку : pythonist.ru s2 = input('Введите вторую строку:\n') Введите вторую строку: сайт для программистов print('Конкатенированная строка =', s1 + s2)
>>> s1 = input('Введите первую строку :\n') Введите первую строку : pythonist.ru >>> s2 = input('Введите вторую строку:\n') Введите вторую строку: сайт для программистов >>> print('Конкатенированная строка =', s1 + s2)
Результат: Конкатенированная строка = pythonist.ru сайт для программистов
Очень удобный способ использование оператора «+». Единственный момент, который надо учитывать это то, что обе вводные должны быть строками.
>>>'Hello' + 4 Traceback (most recent call last): File "", line 1, in TypeError: can only concatenate str (not "int") to str
Мы можем использовать str() function для представленя объекта в виде строки.
Давайте посмотрим как конкатенировать строку и число или другой объект.
print('Питонист' + str(4)) class Data: def __init__(self, i): self.id = i def __str__(self): return 'Номер[' + str(self.id) + ']' print('Питонист ' + str(Data(10)))
Основная проблема оператора «+» в том, что используя его мы не можем добавить разделитель между строками. Например если мы хотим сконкатенировать строки “Hello” и “World” и поставить между ними пробел, то нам надо писать так «Hello» + » » + «World»
Конкатенация строк используя функцию join().
Мы можем использовать функцию join() для конкатенации строк и одновременного добавления разделителя между ними. Это полезная функция, когда мы имеем последовательность строк, например List или tuple строк.
Если вам не нужен разделитель, то можно использовать join() с пустой строкой.
s1 = 'Hello' s2 = 'World' print('Concatenated String using join() =', "".join([s1, s2])) print('Concatenated String using join() and whitespaces =', " ".join([s1, s2]))
Результат:
Concatenated String using join() = HelloWorld
Concatenated String using join() and spaces = Hello World
Конкатенация строк используя оператор %
Мы можем использовать оператор % как для форматирования строк, так и для конкатенации. Он полезен когда нам нужно сложить две строки и вдобавок отфарматировать.
s1 = 'Hello' s2 = 'World' s3 = "%s %s" % (s1, s2) print('String Concatenation using % Operator =', s3) s3 = "%s %s from JournalDev - %d" % (s1, s2, 2018) print('String Concatenation using % Operator with Formatting =', s3)
String Concatenation using % Operator = Hello World
String Concatenation using % Operator with Formatting = Hello World from JournalDev — 2018
Конкатенация строк с помощью функции format()
Можно использовать функцию строк format() для конкатенации и форматирования.
s1 = 'Hello' s2 = 'World' s3 = "<>-<>".format(s1, s2) print('String Concatenation using format() =', s3) s3 = " ".format(in1=s1, in2=s2) print('String Concatenation using format() =', s3)
String Concatenation using format() = Hello-World
String Concatenation using format() = Hello World
Функция format() очень мощная и использовать ее только для сложения строк не самый лучший и быстрый вариант.
Конкатенация с использованием f-строк
Если вы используете Python3.6+ то вы можете использовать f-строки для конкатенации. Это новый способ форматирования строк. Он был представлен в PEP 498 – Literal String Interpolation.
s1 = 'Hello' s2 = 'World' s3 = f' ' print('String Concatenation using f-string =', s3) name = 'Pankaj' age = 34 d = Data(10) print(f' age is and d=')
String Concatenation using f-string = Hello World
Pankaj age is 34 and d=Data[10]
Python f-строки более чистый и легкий способ по сравнению с format()
Заключение
Форматирование строк в Python может быть сделано разными способами. Используйте один из них, в зависимости, что вам нужно сделать со строками. Если надо сконкатенировать и добавить разделитель, тогда используйте Join(). Если надо еще и отформатировать, тогда format() или f-строки. Учитывайте что f-строки можно использовать с версии Python3.6 или выше.
Как быстро конкатенировать строки в Python
Как вы, наверное, знаете один из принципов в Python: “Должен быть один и только один способ сделать что-либо”. Можете убедиться в этом, выполнив в в интерпретаторе import this (вы увидите Дзен Python). Несмотря на это, иногда вам всё равно приходится выбирать между несколькими способами сделать что-то, и не всегда очевидно, какой способ лучше. Недавно один студент спросил меня, какой способ конкатенации строк в Python самый эффективный. Я решил поделиться результатом своего маленького исследования и с вами.
Для начала вспомним, какие способы объединения строк предоставляет нам Python. Во-первых, это оператор + :
>> 'abc' + 'def' 'abcdef'
Также мы можем использовать оператор % , который, конечно, может использоваться не только для соединения строк, но и для этого тоже:
>>> "%s%s" % ('abc', 'def') 'abcdef'
Есть и ещё более современная замена % — это str.format :
>>> ''.format('abc', 'def') 'abcdef'
Так же, как и % , этот метод гораздо мощнее, чем обычный + , но тем не менее строки соединяют и с его помощью.
Как же мы будем замерять время? В Jupyter (так же известном, как IPython) мы можем использовать магическую команду timeit для запуска кода. Для запуска я подготовил четыре функции, каждая из которых складывает строки разным образом. Исходные строки хранятся в глобальных переменных ( x и y ), а локальная (для каждой функции) переменная z содержит результат сложения. Затем функция возвращает результат.
def concat1(): z = x + y return z def concat2(): z = "%s%s" % (x, y) return z def concat3(): z = "<><>".format(x, y) return z def concat4(): z = "".format(x, y) return z
Конечно concat3() и concat4() фактически одинаковы, но я решил проверить и то, влияет указание порядка строк на скорость или нет. Затем я определил наши глобальные переменные:
x = 'abc' y = 'def'
И запустил наши функции:
%timeit concat1() %timeit concat2() %timeit concat3() %timeit concat4()
Результат оказался следующим:
- concat1: 153 наносекунды;
- concat2: 275 наносекунд;
- concat3: 398 наносекунд;
- concat4: 393 наносекунды.
Здесь мы можем видеть, что concat1() , который использует оператор + , выполняется гораздо быстрее остальных. Это немного расстроило меня, потому что мне очень нравится str.format , однако теперь в задачах, которые требуют огромного количества обработки строк, от него придётся отказаться.
Возможно, такие результаты могут быть связаны с тем, что короткие строки не создаются в Python каждый раз снова, а хранятся в специальной таблице? Давайте попробуем изменить наши глобальные переменные следующим образом:
x = 'abc' * 10000 y = 'def' * 10000
Теперь мы получим следующие результаты:
- concat1: 2.64 микросекунды;
- concat2: 3.09 микросекунды;
- concat3: 3.33 микросекунды;
- concat4: 3.48 микросекунды;
Да, каждый из методов теперь работал гораздо дольше, однако общий результат не изменился — оператор + по прежнему лидирует. Заметим так же, что разница во времени между третьим и четвёртым методом, как и ожидалось, пренебрежимо мала.
После этого я попробовал не объявлять переменные глобальными, а задавать их в теле метода, но на результаты это всё равно не повлияло. Разумеется, можно проводить ещё много разных опытов (например, попробовать сложить больше, чем две строки), однако этого уже достаточно, чтобы иметь примерное представление о скоростях работы различных способов сложения строк в языке Python.
Как объединить строки в Python: использование .join() вместо +

Кандидат философских наук, специалист по математическому моделированию. Пишет про Data Science, AI и программирование на Python.
Python ценят за его интуитивную понятность. Так, строки можно объединить простым плюсом:

Что ещё за .join() такой?
Возьмём те же строки s1 и s2 и попробуем повторить предыдущий результат с помощью .join():

- На каждой итерации цикла из списка вынимается строка.
- Интерпретатор выполняет команду result += ‘ ‘ + s, сначала запрашивая память для пробела ‘ ‘.
- Затем он запрашивает память для строки s.
- Так происходит шесть раз, и в каждой итерации есть два запроса в память — для пробела и для строки, итого 12.
А что происходит, когда мы объединяем эти же строки с помощью .join()?

- Интерпретатор подсчитывает количество строк в списке: 6.
- Подсчитывает количество нужных для объединения пробелов: 5.
- Обращается в память сразу за одиннадцатью ячейками.
- Формирует строку, выдаёт результат.
Как видим, всё происходит гораздо компактнее. Меньшее количество обращений к памяти — основная причина более высокой скорости работы функции join() по сравнению с циклом for и +.
Подытожим
Дружелюбие синтаксиса Python к начинающим — это прекрасно, без всяких преувеличений. Но если программист не хочет быть начинающим всю свою жизнь, то придётся постоянно осваивать более мощные и часто менее очевидные инструменты, подходы и приёмы.
На курсах «Профессии Python-разработчик» вы не только познакомитесь именно с такими инструментами, но и выработаете привычку к постоянному их поиску и совершенствованию. В этом, возможно, и заключается суть программирования. Приходите, и да пребудут с вами Дзен и Дух Пайтона!