Программирование и IT

Python: строки

Строка в Python — неизменяемая последовательность символов. Из этого следуют почти все её особенности: методы не меняют строку, а возвращают новую, а быстрая сборка текста идёт через join, а не через сложение в цикле. Ниже — рабочий минимум с примерами и выводом.

Обновлено
В этой статье

Что такое строка и почему её нельзя изменить#

Строка записывается в одинарных, двойных или тройных кавычках — разницы между
'a' и "a" нет, тройные кавычки нужны для многострочного текста. Отдельного
типа «символ» в языке нет: "кот"[0] — это строка длиной один.

Главное свойство — неизменяемость. Попытка записать символ на место даёт ошибку:

s = "кот"
s[0] = "р"
  # TypeError: 'str' object does not support item assignment

Поэтому все методы строк возвращают новое значение, а исходное оставляют как
было. Частая ошибка новичка — вызвать метод и забыть присвоить результат:

name = "  Анна  "
name.strip()
print(repr(name))   # '  Анна  '
name = name.strip()
print(repr(name))   # 'Анна'

Разрезать и собрать: split и join#

Две самые нужные операции — разбить строку на части и склеить части в строку.

line = "яблоко,груша,,слива"
print(line.split(","))      # ['яблоко', 'груша', '', 'слива']
print("  a   b  ".split())  # ['a', 'b']

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

Обратная операция — join. Метод вызывается у разделителя, а не у списка, и
требует, чтобы все элементы уже были строками:

print(", ".join(["a", "b", "c"]))  # a, b, c
print(", ".join([1, 2]))
  # TypeError: sequence item 0: expected str instance, int found
print(", ".join(str(x) for x in [1, 2]))  # 1, 2

Поиск, замена, проверка#

text = "мама мыла раму"
print("мыла" in text)          # True
print(text.find("раму"))       # 10
print(text.find("папу"))       # -1
print(text.count("ма"))        # 2
print(text.replace("ма", "МА", 1))  # МАма мыла раму

find возвращает индекс первого вхождения или -1, если его нет; index
делает то же самое, но при отсутствии подстроки бросает ValueError. У
replace третий аргумент ограничивает число замен.

Для проверок годятся startswith, endswith и семейство is*:
"2026".isdigit() даёт True, а "12.5".isdigit() — уже False, потому что
точка не цифра. Проверять число этим методом надёжно только для целых без знака.

f-строки вместо сложения#

Собирать текст сложением неудобно и легко забыть про типы: "итого " + 5 падает
с TypeError. f-строка подставляет любое значение и сразу умеет форматировать:

price = 1234.5678
name = "чай"
print(f"{name}: {price:.2f} руб.")   # чай: 1234.57 руб.
print(f"{name!r}{len(name)} букв")  # 'чай' — 3 букв
print(f"{42:>6}|")                    # "    42|"

Внутри фигурных скобок — обычное выражение, после двоеточия — формат: .2f
два знака после точки, >6 — выравнивание вправо по ширине шесть, ,
разделитель тысяч. Символ !r печатает значение так, как его показал бы
repr, — это удобно для отладки, потому что видно кавычки и пробелы.

Ловушки, на которых спотыкаются все#

strip принимает набор символов, а не подстроку. Это самая популярная
ошибка:

print("report.txt".strip(".txt"))        # repor
print("report.txt".removesuffix(".txt"))  # report

strip(".txt") срезает с краёв любые символы из множества {'.', 't', 'x'}
и не останавливается на расширении, а съедает ещё и t в конце слова report.
Чтобы отрезать именно окончание, есть removesuffix и removeprefix (доступны
начиная с Python 3.9).

Склейка в цикле. result += chunk внутри длинного цикла каждый раз создаёт
новую строку. Правильнее накопить части в списке и один раз вызвать join.

Регистр и сравнение. "Привет".lower() даёт "привет", но для
регистронезависимого сравнения текстов лучше casefold() — он аккуратнее
работает с нелатинскими алфавитами.

Небольшое задание напоследок: возьми строку "Иванов; 35; Москва", разбери
её на три поля, убери лишние пробелы и собери обратно в виде
"Москва | Иванов (35)" — одной f-строкой, без сложения через плюс.

Дальше стоит посмотреть срезы — на строках они работают
так же, как на списках, — и регулярные выражения,
когда обычных методов поиска перестаёт хватать.

План по этапам

  1. Проверить неизменяемостьВ интерактивной оболочке присвоить s[0] и увидеть TypeError; затем сделать то же через замену.
  2. Прогнать десять методовupper, lower, strip, split, join, replace, find, count, startswith, removesuffix — каждый с печатью результата.
  3. Собрать таблицу f-строкамиВывести пять строк с выравниванием по ширине и двумя знаками после точки.
  4. Разобрать строку данныхВзять строку «имя;возраст;город», разрезать split, собрать обратно join с другим разделителем.
  5. Поймать ловушку stripСравнить strip(".txt") и removesuffix(".txt") на имени report.txt и записать разницу.

Начать изучать эту тему у себя

План ляжет в твой репозиторий: отмечай этапы, веди конспект — история изменений покажет, как ты продвинулся.

Начать план

Проверь себя

1.Что выведет print(", ".join(["a", "b", "c"]))?

2.Что делает вызов "report.txt".strip(".txt")?

3.Чему равно len("abc" * 3)?

4.Что вернёт "мама мыла раму".find("папу")?

Источники

Было полезно?

Ещё темы

Программирование и IT Python: списки Список — изменяемый упорядоченный набор значений произвольных типов. Он же главный источник неожиданностей у начинающих: присваивание не копирует список, sort ничего не возвращает, а удаление элементов прямо в цикле пропускает половину. Разберём по порядку. Программирование и IT Python: словари Словарь хранит пары «ключ — значение» и находит значение по ключу за постоянное время независимо от размера. Это рабочая лошадка для подсчётов, группировок и настроек. Разберём создание, безопасный доступ, перебор и места, где словарь ведёт себя не так, как ожидают. Программирование и IT Python: срезы Срез вырезает из последовательности кусок по правилу «с какого индекса, до какого, с каким шагом». Запись компактная, но у неё два места, где почти все ошибаются: правая граница не включается, а при отрицательном шаге границы меняются местами. Разберём оба. Программирование и IT Как изучить Python с нуля Python хорош для первого знакомства с программированием: код читается почти как текст, а стандартная библиотека закрывает большинство бытовых задач. Этот план ведёт от установки интерпретатора до собственных скриптов, покрытых тестами, — примерно за четыре месяца при занятиях около часа в день. Программирование и IT git branch Ветка в git — это подвижный указатель на коммит, а не копия файлов. Поэтому завести её ничего не стоит, а команда git branch отвечает за список веток, их создание, переименование и удаление. Программирование и IT Python: генераторы Генератор выдаёт значения по одному и только тогда, когда их просят. Он не хранит всю последовательность в памяти, поэтому подходит для больших файлов и бесконечных потоков. Плата за это — генератор одноразовый: пройти по нему дважды не получится.

Ещё сценарии