Методы строк
Вернёмся к полочке с фишками, только теперь фишки на ней приклеены. Их можно разглядывать и называть по номерам, но ни одну нельзя снять или заменить. Чтобы получить другое слово, вы ставите рядом новую полочку с нужными фишками.
Имя переменной здесь — бирка, как в теме о переменных. Бирку можно перевесить на новую полочку, а старая полочка останется такой же, какой была.
Так устроены строки в Python. Символ строки можно прочитать по индексу, но заменить его так нельзя. Попытка записать в строку новый символ останавливает программу:
name = "anna"
print(name) # anna
name[0] = "A" # ✗
print(name)TypeError: 'str' object does not support item assignmentДавайте разберём, что здесь происходит:
- Первый
printуспевает напечататьanna. - Проверка файла перед запуском эту ошибку не находит: она возникает, когда выполняется строка с присваиванием.
- Программа останавливается на
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.
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Разберём пример по строкам:
text.strip()возвращает строку без пробелов по краям, и её связывают сclean.upperиlowerпечатаютHELLO, WORLDиhello, world.replaceзаменяетWorldнаAnna. Он заменяет все вхождения, а не только первое:"a-b-c".replace("-", "")даётabc.- Длина
textпосле всех вызовов по-прежнему16: ни один метод его не изменил.
Вызовы можно соединять в цепочку: text.strip().lower() сначала убирает пробелы, а затем меняет регистр у результата.
Новая строка вместо старой
Каждый метод и каждый срез строит новую строку, а s остаётся прежней, пока вы не присвоите ей результат. Нажмите «Следующий шаг» и следите за s: она меняется только на строке s = s.upper().
1s = "lemon"2t = s.upper()3print(s, t)4s.replace("l", "m")5print(s)6u = s[1:]7print(s, u)8s = s.upper()9print(s, t)
Имя s связано со строкой 'lemon'.
Правило одно: результат метода или среза нужно сохранить — в новую переменную или в ту же через =. Вызов без присваивания, как s.replace("l", "m") в четвёртой строке, строит строку и тут же её теряет.
Поиск и подсчёт
Другие методы не строят строку, а отвечают на вопрос о ней:
find(sub)— индекс первого вхожденияsubили-1, если его нет;count(sub)— сколько разsubвстречается в строке;startswith(prefix)иendswith(suffix)— начинается ли строка сprefixи заканчивается ли наsuffix.
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 Truefind и count, как и оператор in, различают регистр: "Banana".count("b") равно 0. Чтобы регистр не мешал, строку сначала переводят в один регистр, например s.lower().count("b").
Частая ошибка
Метод вызвали, а результат никуда не записали:
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 и подпишись на канал — откроются все уроки.