Python: Срезы строк

Работая со строками, мы часто сталкиваемся с задачей: извлечь часть строки. Например, получить год из даты, имя из полного ФИО или первые несколько символов из адреса электронной почты. Для таких случаев в Python существует мощный и удобный инструмент — срезы (или slices).

📍 Что такое подстрока?

Подстрока — это часть строки. То, что входит внутрь другой строки. Например, в строке '12-08-2034' подстрокой может быть '2034', '12' или даже '-'. Всё зависит от того, какую информацию нам нужно извлечь.

Допустим, у нас есть строка с датой '12-08-2034'. Мы хотим получить из неё только год — '2034'. В этой строке каждый символ имеет индекс (позицию), начиная с нуля:

'1' '2' '-' '0' '8' '-' '2' '0' '3' '4'
 0   1   2   3   4   5   6   7   8   9

Получается, год начинается с индекса 6 и заканчивается на 9. Чтобы извлечь его, мы используем срез:

value = '12-08-2034'
year = value[6:10]
print(year)  # => 2034

Срез value[6:10] берёт символы с индекса 6 по 9 включительно. Формат среза:

строка[начало:конец]

Важно: символ с индексом, указанным как "конец", не включается.

📘 Срез — это тоже строка

value = '01-12-9873'

value[1:2]   # => '1'
value[3:5]   # => '12'

Срез всегда возвращает строку, даже если в ней только цифры. Это значит, что результат можно использовать, как обычную строку: конкатенировать, печатать, передавать в функции и так далее.

⬅️ Срез до конца или с начала

Иногда нужно взять часть строки до конца или от начала — такие ситуации тоже легко обрабатываются срезами:

value = 'Hexlet'

value[3:]   # => 'let'     # С 3 символа до конца
value[:3]   # => 'Hex'     # От начала до 3 символа

Если не указать границу, Python сам подставит нужное значение: начало строки или её конец.

↩️ Срезы с отрицательными индексами

Python позволяет считать не только слева направо, но и с конца строки. Для этого используются отрицательные индексы:

value = 'Hexlet'

value[-1]      # => 't'      # Последний символ
value[3:-1]    # => 'le'     # От 3 до предпоследнего
value[-5:3]    # => 'ex'     # С 1 до 3 включительно

Это удобно, когда заранее неизвестна длина строки, но нужно взять «хвост» или «середину» строки относительно конца.

⏩ Шаг в срезах

У среза есть третий параметр — шаг. По умолчанию шаг равен 1, то есть символы идут подряд. Но шаг можно изменить, например, взять каждый второй символ:

value = 'Hexlet'

value[1:5:2]   # => 'el'
# Индексы 1, 3 → символы 'e', 'l'

В этом примере:

  • 1:5 — это срез 'exle'
  • шаг 2 — означает, что мы берём через один символ: 'e' и 'l'

Можно комбинировать с открытыми границами:

value[:5:2]    # => 'Hxe'
value[1::2]    # => 'elt'

🔄 Переворот строки

Одна из самых популярных «фишек» с шагом — реверс строки. Для этого используют отрицательный шаг:

value = 'Hexlet'

value[::-1]    # => 'telxeH'

Это полностью переворачивает строку — с конца к началу. Очень удобно и лаконично.

⚠️ Срезы с отрицательным шагом

Если вы используете отрицательный шаг, помните: индексы тоже нужно указывать в обратном порядке. Иначе срез не сработает (возвратит пустую строку):

value = 'Hexlet'

value[4:1:-1]  # => 'elx'
# Индексы: 4, 3, 2 → 'e', 'l', 'x'

Python начнёт с индекса 4 и пойдёт влево до индекса 2 включительно. Индекс 1 — не включается.

📦 Срез с переменными

Срезы не обязаны быть жёстко зафиксированы числами. Можно использовать переменные:

start = 1
end = 5

value = 'Hexlet'
print(value[start:end])  # => 'exle'

Это особенно полезно, когда границы вычисляются во время работы программы.

🧪 Быстрая шпаргалка

value = 'Hexlet'

value[::]       # 'Hexlet'  — вся строка
value[:]        # 'Hexlet'
value[::2]      # 'Hxe'     — чётные символы
value[1::2]     # 'elt'     — нечётные символы
value[::-1]     # 'telxeH'  — строка в обратном порядке
value[5:]       # 't'
value[:5]       # 'Hexle'
value[-2:1:-1]  # 'elx'     — с предпоследнего до третьего

Когда делаете срез от большего индекса к меньшему, не забудьте задать отрицательный шаг — иначе срез не сработает.

Не переживайте, если сейчас не запомните все комбинации — вы быстро начнёте использовать их на практике. Главное — понимать, как работает базовая структура строка[начало:конец:шаг].

Задание

В переменной value лежит значение Hexlet. Извлеките из него и выведите на экран срез, который получит подстроку xle. Это задание можно сделать разными способами.

Определения

Срезы для строк
механизм, с помощью которого извлекается подстрока по указанным параметрам.
Как с вами связаться? 🙃

Команда проекта находится в телеграм-сообществе по ссылке https://ttttt.me/HexletLearningBot. Там можно задать любой вопрос и повлиять на проект

Упражнение не проходит проверку — что делать? 😶

Если вы зашли в тупик, то самое время поговорить с нашим асситентом Тота во вкладке "ИИ-помощник". Как правильно задать вопрос:

В моей среде код работает, а здесь нет 🤨

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Мой код отличается от решения учителя 🤔

Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи. В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Прочитал урок — ничего не понятно 🙄

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в обратной связи нашего сообщества

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются

Привет! Я Тота и моя задача помочь в обучении. Чтобы активировать меня, нужно зарегистрироваться или залогиниться, если у вас уже есть аккаунт

Loading...

Ваше упражнение проверяется по этим тестам

1from hexlet.test import expect_output
2
3
4def test(capsys):
5    expected = "xle"
6    expect_output(capsys, expected)
7

Решение учителя откроется через:

20:00
waiting_clock