Перейти к содержимому
Теория · Строки · урок 5 из 10

Методы строк

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

Имя переменной здесь — бирка, как в теме о переменных. Бирку можно перевесить на новую полочку, а старая полочка останется такой же, какой была.

Так устроены строки в Python. Символ строки можно прочитать по индексу, но заменить его так нельзя. Попытка записать в строку новый символ останавливает программу:

Python
name = "anna"
print(name)  # anna
name[0] = "A"  # ✗
print(name)
TEXT
TypeError: 'str' object does not support item assignment

Давайте разберём, что здесь происходит:

  1. Первый print успевает напечатать anna.
  2. Проверка файла перед запуском эту ошибку не находит: она возникает, когда выполняется строка с присваиванием.
  3. Программа останавливается на name[0] = "A", и второй print не выполняется.

Неизменяемые строки

Строки в Python неизменяемые: созданную строку нельзя поменять ни целиком, ни по одному символу. Вместо этого собирают новую строку и связывают с ней имя. После name = "A" + name[1:] имя name ссылается на "Anna".

Сама строка "anna" при этом не меняется — меняется только то, на что ссылается name. Бирку перевесили на новую полочку, а старая полочка осталась прежней.

Этот вопрос часто задают на собеседовании: «Можно ли изменить строку в Python?» Ответ:

  • нет, строки неизменяемые, и s[0] = "x" вызывает TypeError;
  • методы и срезы возвращают новую строку;
  • чтобы имя ссылалось на результат, его присваивают: s = s.upper().

Методы

Метод — функция, которая принадлежит значению и вызывается через точку: text.upper(). Методы строки не меняют её, а возвращают новую строку, число или True/False. Вот четыре метода, которые строят новую строку:

  • upper() и lower() — все буквы заглавные или строчные;
  • strip() — строка без пробелов по краям;
  • replace(old, new) — каждое вхождение old заменено на new.
Python
text = "  Hello, World  "
clean = text.strip()
print(clean.upper(), clean.lower())  # HELLO, WORLD hello, world
print(clean.replace("World", "Anna"))  # Hello, Anna
print(len(text), len(clean))  # 16 12

Разберём пример по строкам:

  1. text.strip() возвращает строку без пробелов по краям, и её связывают с clean.
  2. upper и lower печатают HELLO, WORLD и hello, world.
  3. replace заменяет World на Anna. Он заменяет все вхождения, а не только первое: "a-b-c".replace("-", "") даёт abc.
  4. Длина text после всех вызовов по-прежнему 16: ни один метод его не изменил.

Вызовы можно соединять в цепочку: text.strip().lower() сначала убирает пробелы, а затем меняет регистр у результата.

Новая строка вместо старой

Каждый метод и каждый срез строит новую строку, а s остаётся прежней, пока вы не присвоите ей результат. Нажмите «Следующий шаг» и следите за s: она меняется только на строке s = s.upper().

ВживуюМетод строит новую строкушаг 1 из 9 · рамок: 1

Имя s связано со строкой 'lemon'.

Следите за s: она меняется только после присваивания

Правило одно: результат метода или среза нужно сохранить — в новую переменную или в ту же через =. Вызов без присваивания, как s.replace("l", "m") в четвёртой строке, строит строку и тут же её теряет.

Поиск и подсчёт

Другие методы не строят строку, а отвечают на вопрос о ней:

  • find(sub) — индекс первого вхождения sub или -1, если его нет;
  • count(sub) — сколько раз sub встречается в строке;
  • startswith(prefix) и endswith(suffix) — начинается ли строка с prefix и заканчивается ли на suffix.
Python
s = "banana"
print(s.find("an"), s.find("x"))  # 1 -1
print(s.count("a"), s.count("an"))  # 3 2
print(s.startswith("ba"), s.endswith("na"))  # True True

find и count, как и оператор in, различают регистр: "Banana".count("b") равно 0. Чтобы регистр не мешал, строку сначала переводят в один регистр, например s.lower().count("b").

Частая ошибка

Метод вызвали, а результат никуда не записали:

Python
name = "anna"
name.upper()  # ✗
print(name)  # anna

Ошибки нет, но печатается anna. upper вернул новую строку ANNA, а она не попала ни в переменную, ни в print и пропала. Сама name не изменилась, потому что строки неизменяемые. Результат нужно присвоить: name = name.upper().

Главное

  • Строки неизменяемые: s[0] = "A" вызывает TypeError.
  • Методы и срезы возвращают новую строку, а исходная остаётся прежней.
  • Чтобы сохранить результат, его присваивают: s = s.upper().
  • find, count, startswith, endswith и in различают регистр.

Подпишись, чтобы пройти курс

Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.

Войти другим способом