Строки: индексы, срезы и методы

⏱ 35 мин · 🧩 заданий: 6

Литералы

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+".

Индексы и срезы

символ: P y t h o n индекс: 0 1 2 3 4 5 с конца: -6 -5 -4 -3 -2 -1
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

Вы не вошли — ответы проверяются, но прогресс не сохранится. Войти или зарегистрироваться.
Задание 1 Заполнить таблицу

s = "Python". Что вернёт выражение?

'P''n''yth''nohtyP''Pto'
s[0]
s[-1]
s[1:4]
s[::-1]
s[::2]
Отметьте ячейку — «+», пустая — «−».
Задание 2 Программа на Python

Напишите функцию 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
Задание 3 Один вариант ответа

Что произойдёт при s = "hello"; s[0] = "H"?

Задание 4 Программа на Python

Напишите функцию normalize_name(raw): убрать пробелы по краям, а каждое слово начать с заглавной буквы, остальные строчные; между словами — ровно один пробел. " иВАН петров " → "Иван Петров".

Какие тесты проверяют код (3)
assert normalize_name("  иВАН   петров ") == "Иван Петров"
assert normalize_name("anna") == "Anna"
assert normalize_name("   ") == ""
Задание 5 Программа на Python

Напишите функцию count_vowels(text), которая возвращает количество гласных (русских и английских, регистр не важен) в строке. Гласные: аеёиоуыэюяaeiou.

Какие тесты проверяют код (3)
assert count_vowels("Привет, World!") == 3
assert count_vowels("") == 0
assert count_vowels("ЁЖИК") == 2
Задание 6 Один вариант ответа

Почему для склейки большого числа строк используют "".join(parts), а не s += part в цикле?

Войдите, чтобы отмечать пройденные уроки.