Строки: индексы, срезы и методы
Литералы
a = 'одинарные'
b = "двойные — удобно, если внутри есть 'апостроф'"
c = """многострочная
строка сохраняет переводы строк"""
d = "табуляция:\tперевод строки:\nконец"
e = r"C:\new\table" # сырая строка: обратный слэш не экранирует
print(a, b, c, d, e, sep="\n")
print(len("привет")) # длина — в символах, а не в байтах
| Последовательность | Значение |
|---|---|
\n |
перевод строки |
\t |
табуляция |
\\ |
обратный слэш |
\' \" |
кавычка |
\u0436 |
символ Unicode по коду (ж) |
Сырые строки
r"..." используют для путей Windows и регулярных выражений: r"\d+" вместо "\\d+".
Индексы и срезы
s = "Python"
print(s[0], s[5], s[-1], s[-2])
print(s[1:4]) # с 1 по 3 включительно (конец не входит)
print(s[:2], s[2:]) # начало / конец по умолчанию
print(s[::2]) # каждый второй
print(s[::-1]) # задом наперёд
print(s[100:]) # срез за границей — пустая строка, не ошибка
Срез s[start:stop:step]: start входит, stop не входит. Это удобно: s[:k] + s[k:] == s для любого k, а длина среза s[a:b] равна b - a.
s = "Python"
print(s[10]) # IndexError: индекс за границей — ошибка (в отличие от среза)
Строки неизменяемы
Строку нельзя изменить «на месте» — все методы возвращают новую строку.
s = "hello"
t = s.upper()
print(s, t) # s не изменилась
s = "H" + s[1:] # «изменить» = создать новую и перепривязать имя
print(s)
Важнейшие методы
s = " Hello, World! "
print(repr(s.strip()), repr(s.lstrip()), repr(s.rstrip()))
print(s.strip().lower(), s.strip().upper(), "hello world".title(), "hello".capitalize())
print("a,b,,c".split(",")) # ['a', 'b', '', 'c']
print(" много пробелов ".split()) # ['много', 'пробелов'] — без аргумента
print("-".join(["2024", "01", "15"]))
print("banana".replace("a", "o"), "banana".replace("a", "o", 1))
print("banana".find("an"), "banana".find("x"), "banana".rfind("an"))
print("banana".count("a"))
print("report.pdf".endswith(".pdf"), "https://x".startswith(("http://", "https://")))
print("42".isdigit(), "abc".isalpha(), "ab12".isalnum(), " ".isspace())
print("7".zfill(3), "hi".center(8, "*"), "hi".ljust(5, ".") + "|")
print("data.tar.gz".partition("."), "data.tar.gz".rpartition("."))
print("Привет".removeprefix("При"), "file.txt".removesuffix(".txt"))
| Задача | Метод |
|---|---|
| убрать пробелы по краям | strip(), lstrip(), rstrip() |
| регистр | lower(), upper(), title(), capitalize(), casefold() |
| разбить / склеить | split(sep), rsplit, splitlines(), sep.join(iterable) |
| найти | find (−1 если нет), index (ошибка если нет), count, in |
| проверить | startswith, endswith, isdigit, isalpha, isspace |
| заменить | replace(old, new[, count]), removeprefix, removesuffix |
find против index
s.find(x) возвращает −1, если не нашёл, а s.index(x) бросает ValueError. Для простой проверки наличия используйте x in s.
Проверка подстроки и сравнение
print("World" in "Hello, World") # True
print("apple" < "banana") # True — лексикографически по кодам символов
print("Zebra" < "apple") # True — заглавные «меньше» строчных
print("Straße".casefold() == "STRASSE".casefold()) # True — сравнение без учёта регистра
Перебор и сборка строк
word = "кот"
for ch in word:
print(ch, ord(ch)) # ord — код символа, chr — обратно
parts = []
for i in range(5):
parts.append(str(i))
print(", ".join(parts)) # правильный способ собрать строку из кусков
Квадратичная сборка
result += piece в цикле на тысячах кусков может работать за O(n²): каждый раз создаётся новая строка. Собирайте части в список и делайте "".join(parts).
Итог
- Индексы с 0, отрицательные — с конца; срез
[start:stop:step],stopне входит;[::-1]— разворот. - Строки неизменяемы: методы возвращают новые строки.
- Главные методы:
strip,split,join,replace,find,startswith,lower. - Склеивайте много кусков через
"".join(...).
Практика решено 0 из 6
s = "Python". Что вернёт выражение?
| 'P' | 'n' | 'yth' | 'nohtyP' | 'Pto' | |
|---|---|---|---|---|---|
s[0] |
|||||
s[-1] |
|||||
s[1:4] |
|||||
s[::-1] |
|||||
s[::2] |
Напишите функцию is_palindrome(text): вернуть True, если строка читается одинаково
в обе стороны без учёта регистра и пробелов. Например, "А роза упала на лапу Азора" — палиндром.
Какие тесты проверяют код (4)
assert is_palindrome("А роза упала на лапу Азора") is True
assert is_palindrome("level") is True
assert is_palindrome("Python") is False
assert is_palindrome("") is True
def is_palindrome(text):
cleaned = text.replace(" ", "").lower()
return cleaned == cleaned[::-1]
Что произойдёт при s = "hello"; s[0] = "H"?
Напишите функцию normalize_name(raw): убрать пробелы по краям, а каждое слово
начать с заглавной буквы, остальные строчные; между словами — ровно один пробел.
" иВАН петров " → "Иван Петров".
Какие тесты проверяют код (3)
assert normalize_name(" иВАН петров ") == "Иван Петров"
assert normalize_name("anna") == "Anna"
assert normalize_name(" ") == ""
split() без аргументов делит по любым пробельным символам и выбрасывает пустые части.
def normalize_name(raw):
return " ".join(word.capitalize() for word in raw.split())
Напишите функцию count_vowels(text), которая возвращает количество гласных
(русских и английских, регистр не важен) в строке. Гласные: аеёиоуыэюяaeiou.
Какие тесты проверяют код (3)
assert count_vowels("Привет, World!") == 3
assert count_vowels("") == 0
assert count_vowels("ЁЖИК") == 2
def count_vowels(text):
vowels = "аеёиоуыэюяaeiou"
return sum(1 for ch in text.lower() if ch in vowels)
Почему для склейки большого числа строк используют "".join(parts), а не s += part в цикле?
Войдите, чтобы отмечать пройденные уроки.