$ sudo teach IT
Модуль 2 · Первые шаги · Урок 2.4

Строки: основы

Склейка строк, f-строки, спецсимволы и методы, без которых не обходится ни одна программа.

Теория + Практика~30 минутНовичок

Вы уже умеете хранить текст в переменных и выводить его на экран. Но по-настоящему полезной строка становится, когда вы умеете её собирать из кусочков, вставлять в неё значения других переменных и приводить к нужному виду — убирать лишние пробелы, менять регистр, разбивать на части. Именно этому и посвящён урок.

Склейка и повторение строк

Представьте, что у вас есть два листочка бумаги: на одном написано «Иван», на другом — «Петров». Чтобы получить полное имя, вы просто кладёте листочки рядом. В Python то же самое делает оператор +: он ставит одну строку сразу после другой.

Такое соединение строк называется конкатенацией — в документации Python вы встретите именно это слово. Оно означает буквально «склеивание в одну цепочку».

first = "Иван"
last = "Петров"
full_name = first + " " + last
print(full_name)

Разбор: first и last — переменные со строками. В третьей строке три куска склеиваются подряд: first, пробел " ", затем last. Результат — новая строка "Иван Петров" в full_name. Пробел между именем и фамилией мы добавили сами: Python никогда не добавляет пробелы за вас, строки склеиваются ровно так, как вы написали.

Важно. Оператор + работает только между строками. Если слева или справа от него окажется число, Python выдаст ошибку — строку и число нужно сначала привести к одному типу через str().
age = 20
# print("Мне " + age + " лет")   # ОШИБКА: строка + число
print("Мне " + str(age) + " лет")  # Мне 20 лет

Строку string можно ещё и умножить на число — Python повторит её нужное количество раз подряд. Это оператор *, и работает он только с парой «строка и число».

line = "-" * 20
print(line)

Строка «минус» умножается на 20 — Python берёт символ "-" и повторяет его 20 раз подряд, склеивая результаты в одну строку: --------------------. Такой приём удобен для разделителей и рамок — не нужно печатать чёрточки вручную.

f-строки — вставляем значения прямо в текст

Склеивать плюсами удобно, пока кусочков мало. А если в одном предложении нужно подставить имя, возраст и город, из плюсов и кавычек получается каша, в которой легко ошибиться. Гораздо удобнее оставить готовый текст и просто сделать в нём «окошки», куда сами подставятся значения.

Именно так работают f-строки (f-string, от «formatted string literal») — способ форматирования строк, который в Python считается основным. Перед открывающей кавычкой пишется буква f, а внутри текста в фигурных скобках {} указывается переменная или любое выражение.

name = "Анна"
age = 24
greeting = f"Привет! Меня зовут {name}, мне {age} лет."
print(greeting)

Буква f перед кавычкой говорит Python: «в этой строке ищи фигурные скобки и подставляй в них значения». {name} заменяется на содержимое переменной name, {age} — на содержимое age. Всё остальное — обычный текст, он остаётся без изменений. Результат: Привет! Меня зовут Анна, мне 24 лет.

Внутри фигурных скобок можно писать не только имя переменной, но и любое выражение: математику или вызов метода строки. Python сначала вычислит выражение, а уже потом подставит готовый результат в текст.
price = 1500
discount = 300
print(f"Цена со скидкой: {price - discount} руб.")

name = "иван"
print(f"Добро пожаловать, {name.upper()}!")

В первом примере внутри скобок — выражение price - discount: Python вычислит 1500 - 300 и подставит число 1200. Во втором внутри скобок вызывается метод name.upper() — сначала Python получит "ИВАН", потом вставит эту строку вместо скобок. Про сам метод upper() поговорим чуть ниже.

Спецсимволы: как напечатать то, что нельзя напечатать

Если внутри кавычек нажать Enter, Python решит, что строка закончилась раньше времени, и выдаст ошибку. А как тогда получить перенос строки внутри текста, который печатается одной командой print()? Для таких случаев в строке используют особый «код» — сочетание из обратной косой черты и буквы.

Такие сочетания называются управляющими последовательностями, или escape-последовательностями (от английского «escape» — «сбежать, вырваться»: символ как будто вырывается из обычного текста и получает особый смысл). Python видит \n не как два обычных символа «слеш» и «n», а как один специальный символ переноса строки.

Символ Что делает Пример
\n Переносит текст на новую строку print("Раз\nДва") выведет два слова на разных строках
\t Добавляет отступ, как нажатие клавиши Tab print("Имя:\tИван")
\\ Печатает сам символ обратного слеша print("C:\\Users") выведет C:\Users
\" Печатает кавычку внутри строки в таких же кавычках print("Он сказал \"привет\"")

Разбор первого примера: "Раз\nДва" — это одна строка из пяти видимых символов и одного спецсимвола. Когда print() её печатает, вместо \n курсор переходит на новую строку, поэтому «Раз» и «Два» оказываются на разных строчках экрана, хотя в коде это одна строка.

len() и методы строк

Строка в Python — это не просто текст, а объект, у которого есть набор готовых «умений»: посчитать длину, перевести буквы в верхний регистр, убрать лишние пробелы. Такие встроенные умения называются методами. Метод вызывается через точку сразу после строки: строка.метод().

Отдельно стоит функция len(), которую вы уже видели в предыдущем уроке: это не метод, а обычная функция, поэтому вызывается снаружи — len(строка), а не строка.len(). Она возвращает количество символов в строке, включая пробелы.

name = "Александра"
print(len(name))

Python считает символы в строке "Александра" один за другим и возвращает число 10. Пробелы, если бы они были, тоже посчитались бы.

Очень важное правило про все методы строк: они не изменяют исходную строку, а возвращают новую. Строки в Python неизменяемы (immutable) — их нельзя «поправить на месте». Чтобы сохранить результат, его нужно присвоить переменной.

name = "иван"
name.upper()          # результат никуда не сохранён
print(name)            # иван — строка не изменилась

name = name.upper()   # сохранили результат в ту же переменную
print(name)             # ИВАН

В первом вызове Python создаёт строку "ИВАН", но никуда её не записывает — она тут же теряется, а name остаётся прежним. Во втором мы явно кладём результат обратно в name через =, поэтому переменная меняется.

Шесть методов, которые пригодятся сразу

Метод Что делает Пример Результат
upper() Переводит все буквы в верхний регистр "привет".upper() "ПРИВЕТ"
lower() Переводит все буквы в нижний регистр "ПРИВЕТ".lower() "привет"
strip() Убирает пробелы (и переносы строк) с обоих концов " привет ".strip() "привет"
replace(old, new) Заменяет все вхождения old на new "ха-ха".replace("ха", "хо") "хо-хо"
split(sep) Разбивает строку по разделителю, возвращает список частей "a,b,c".split(",") ['a', 'b', 'c']
count(sub) Считает, сколько раз sub встречается в строке "банан".count("ан") 2

replace() и split() принимают аргументы в скобках, как и print(). У replace("ха", "хо") два аргумента: что ищем и на что заменяем. У split(",") один аргумент — разделитель; результат — список из кусочков (списки разберём позже, пока достаточно знать, что это несколько значений в квадратных скобках через запятую).

Совет. Методы можно вызывать один за другим — результат первого сразу становится строкой для второго: " иван петров ".strip().title(). Сначала уйдут пробелы по краям, затем первая буква каждого слова станет заглавной. Метод title() работает как upper()/lower(), только приводит к виду «Каждое Слово С Большой Буквы» — удобно для имён.

Пример: проверка email

Методы строк и логические операторы часто работают вместе. Вот программа, которая проверяет, похож ли введённый адрес на email:

email = input("Введите email: ").strip().lower()
has_at = "@" in email
looks_valid = has_at and (".ru" in email or ".com" in email)
print(looks_valid)

Сначала strip() убирает случайные пробелы по краям, а lower() приводит буквы к нижнему регистру — так Ivan@Mail.RU и ivan@mail.ru проверятся одинаково. Оператор in проверяет, встречается ли один кусочек текста внутри другого, и возвращает True или False: "@" in email спрашивает, есть ли собачка в адресе. and требует, чтобы верными были обе части проверки, or — чтобы верной была хотя бы одна.

Ловушка с приоритетом. Без скобок has_at and ".ru" in email or ".com" in email Python прочитает как (has_at and ".ru" in email) or (".com" in email) — тогда любой адрес на .com засчитается верным, даже без @. Скобки выше расставлены специально: сначала проверяем оба домена вместе, потом объединяем с проверкой на @.

Частые ошибки

Склейка строки с числом без str().
"Возраст: " + 20 вызовет TypeError. Python не станет сам превращать число в текст — это нужно сделать явно: "Возраст: " + str(20).
Забыли сохранить результат метода. Строка text.strip() сама по себе ничего не меняет — нужно записать результат: text = text.strip(). Иначе «очистка» просто теряется.
Забытая буква f перед строкой. Без неё Python не станет искать фигурные скобки и вставлять значения — просто напечатает текст "Привет, {name}!" буквально, вместе со скобками.

Что важно запомнить

Строки склеиваются оператором + и повторяются оператором *. Складывать строку с числом напрямую нельзя — число нужно перевести через str().
f-строки — главный способ подставить значения в текст: буква f перед кавычкой, переменные и выражения — в фигурных скобках {}.
Спецсимволы вроде \n и \t задают перенос строки и табуляцию, которые нельзя напечатать обычными клавишами.
len(строка) — функция, считает длину. Методы upper(), lower(), strip(), replace(), split(), count() вызываются через точку и не меняют исходную строку, а возвращают новую.

Проверьте себя

3 вопроса

Форматирование имени

Дана строка full_name = " иван петров ". Уберите лишние пробелы по краям и сделайте первую букву каждого слова заглавной — примените два метода строки, которые для этого нужны, один за другим. Результат сохраните обратно в full_name и выведите его.

Пример: должно получиться Иван Петров.

Разделитель и конкатенация

Создайте строку separator из символов "=" длиной 30 символов (используйте умножение строки на число). Затем создайте строку phrase, склеив через + три слова: "Python", "это" и "круто" — через пробел. В конце выведите: разделитель, фразу и снова разделитель, каждое на отдельной строке.

Пример вывода:

==============================
Python это круто
==============================