Конкатенация строк
Все способы конкатенации строк в Python: +, +=, join(), f-строки и * — с примерами, подводными камнями и советами по производительности.
Конкатенация строк — это процесс объединения двух или более строк в одну. Python предлагает несколько подходов — от простого оператора + до эффективного метода join() — и выбор правильного важен для читаемости и производительности.
В этой главе рассматривается:
- Операторы
+и+= - Объединение списка строк с помощью
join() - Встраивание значений с помощью f-строк
- Повторение строки с помощью
* - Конкатенация не-строковых значений (и распространённая ошибка
TypeError) - Когда использовать
join()вместо+
Связанные главы: Строки Python · Изменение строк · Форматирование строк · Методы строк
Использование оператора +
Оператор + — самый прямой способ объединить две строки. Python создаёт новую строку, содержащую все символы обоих операндов по порядку.
Конкатенация двух строк с помощью +
Hello WorldВы можете объединять сколько угодно строк в одном выражении:
greeting = "Good" + " " + "morning" + ", " + "Python!"
print(greeting)Good morning, Python!Важно — допускаются только строки. Оператор + не конвертирует другие типы автоматически. Попытка конкатенировать строку и число вызовет TypeError:
age = 30
# This raises TypeError: can only concatenate str (not "int") to str
# message = "I am " + age + " years old."
# Correct: convert the number to a string first
message = "I am " + str(age) + " years old."
print(message)I am 30 years old.Всегда вызывайте str() для не-строкового значения перед использованием +.
Использование оператора +=
Оператор += добавляет строку к существующей переменной. Это сокращение для variable = variable + new_string и удобно при пошаговом построении строки.
Построение предложения по шагам с помощью +=
Hello, World!Распространённый случай — накопление строк внутри цикла:
words = ["one", "two", "three"]
result = ""
for word in words:
result += word + " "
print(result.strip())one two threeПримечание о производительности. Многократное использование += внутри цикла создаёт новый строковый объект на каждой итерации. Для небольших списков это приемлемо, но для больших коллекций join() (см. ниже) значительно быстрее.
Использование join() для конкатенации списка строк
str.join(iterable) объединяет все строки в итерируемом объекте, помещая строку, для которой вызван метод, между каждой парой. Это идиоматический способ Python для построения строки из коллекции.
Объединение слов с пробелом в качестве разделителя
Hello WorldРазделителем может быть что угодно — запятая, символ новой строки или даже пустая строка:
letters = ["P", "y", "t", "h", "o", "n"]
print(", ".join(letters)) # comma-separated
print("".join(letters)) # no separator — merges into one word
print("\n".join(letters)) # one letter per lineP, y, t, h, o, n
Python
P
y
t
h
o
nПочему предпочесть join() вместо + в циклах?
Каждый вызов + выделяет совершенно новую строку. join() вычисляет общую длину один раз, выделяет память один раз и копирует все части за один проход — это O(n) вместо O(n²) для больших входных данных.
# Slow for large collections
parts = ["a"] * 10_000
result = ""
for p in parts:
result += p # 10,000 allocations
# Fast — single allocation
result = "".join(parts)Использование f-строк для конкатенации значений
f-строки (доступны начиная с Python 3.6) позволяют встраивать переменные и выражения непосредственно в строковый литерал без явных вызовов + или str().
first_name = "Ada"
last_name = "Lovelace"
birth_year = 1815
bio = f"{first_name} {last_name} was born in {birth_year}."
print(bio)Ada Lovelace was born in 1815.f-строки часто чище, чем +, когда вы смешиваете несколько переменных с текстом. Смотрите главу Форматирование строк для полного синтаксиса f-строк и параметров форматирования.
Повторение строки с помощью *
Оператор * повторяет строку заданное количество раз — это лаконичная альтернатива циклу конкатенации.
line = "-" * 20
print(line)
echo = "ha" * 3
print(echo)--------------------
hahahaКонкатенация многострочных строк
Python автоматически объединяет соседние строковые литералы, расположенные на последовательных строках внутри скобок — + не нужен. Это удобно для длинных жёстко заданных строк.
message = (
"This is the first part. "
"This is the second part. "
"And this is the third."
)
print(message)This is the first part. This is the second part. And this is the third.Можно также разбить длинную конкатенацию по строкам с помощью обратного слеша:
long_url = "https://example.com/products" \
"?category=books" \
"&sort=price"
print(long_url)https://example.com/products?category=books&sort=priceВыбор подходящего метода
| Ситуация | Лучший выбор |
|---|---|
| Объединение двух или трёх литералов | + |
| Построение строки в цикле | join() |
| Смешивание переменных с текстом | f-строка |
| Объединение списка или любого итерируемого объекта | join() |
| Повторение строки N раз | * |
| Длинные жёстко заданные строки | Соседние литералы в () |
Для получения дополнительных строковых операций смотрите Изменение строк, Срезы строк и Методы строк.