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

Срезы

В первом уроке темы вы брали с полочки по одной фишке. Но программе часто нужен целый кусок строки: год из даты, код города из номера телефона.

Вернёмся к полочке со словом. Представьте, что между фишками нарисованы засечки и у каждой засечки свой номер. Засечка перед первой фишкой — 0, после первой — 1, и так до засечки после последней фишки. Чтобы взять кусок, вы называете две засечки, и всё, что между ними, — ваш кусок.

В Python две границы куска пишут в квадратных скобках через двоеточие:

Python
date = "2026-10-14"
year = date[0:4]
month = date[5:7]
print(year, month)  # 2026 10
print(date[8:])  # 14

Давайте разберём пример по строкам:

  1. date[0:4] — символы между засечками 0 и 4, то есть с индексами от 0 до 3: год 2026.
  2. date[5:7] — символы с индексами 5 и 6: месяц 10.
  3. date[8:] — от индекса 8 до конца строки: день 14.

Начало и конец

Запись s[start:stop] называют срезом. Она возвращает новую строку из символов с индексами от start до stop, причём stop в неё не входит, как и в range. На полочке это видно сразу: засечка stop стоит перед фишкой с тем же номером, и эта фишка в кусок не попадает.

Пока обе границы неотрицательные, не выходят за строку и start не больше stop, длина среза равна stop - start. У date[0:4] это четыре символа.

Пропущенная граница

Любую границу можно пропустить:

  • без start срез начинается с первого символа;
  • без stop срез идёт до конца строки.

Границы бывают и отрицательными, как индексы:

Python
s = "abcdef"
print(s[:3], s[3:], s[-2:])  # abc def ef
print(s[2:100], s[10:20] == "")  # cdef True

Что видно в первой строке:

  • s[:3] — первые три символа, s[3:] — все остальные, s[-2:] — последние два;
  • срезы с общей границей стыкуются без потерь: s[:3] + s[3:] всегда равно s.

Граница за концом строки

Граница за концом строки, в отличие от индекса, не вызывает ошибку: срез урезает её до длины строки. Поэтому s[2:100] возвращает символы до конца, а s[10:20] — пустую строку. При этом s[100] по-прежнему вызывает IndexError.

Шаг

Третье число в срезе s[start:stop:step] — шаг: срез берёт каждый step-й символ. На полочке это как брать фишки через одну. Шаг бывает и отрицательным:

  • s[::2] — каждый второй символ с начала;
  • s[1::2] — каждый второй, начиная с индекса 1;
  • s[::-1] — отрицательный шаг идёт справа налево, и строка выходит задом наперёд.
Python
s = "abcdef"
print(s[::2], s[1::2])  # ace bdf
print(s[::-1])  # fedcba
print(s[4:1:-1])  # edc

При отрицательном шаге start стоит правее stop. Срез s[4:1:-1] берёт индексы 4, 3 и 2, а 1 снова не входит.

Здесь картинка с засечками перестаёт работать: между засечками 4 и 1 стоят символы с индексами 1, 2 и 3. При отрицательном шаге считайте по индексам самих символов: от start включительно до stop, не включая его.

Без границ срез с шагом -1 проходит всю строку, от последнего символа до первого. Этот приём часто спрашивают на собеседовании: «Как перевернуть строку в Python?» Ответ — s[::-1].

Исходная строка при этом не меняется: срез всегда возвращает новую строку. Фишки остаются на полочке, а вы получаете их копии.

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

Последние три символа берут срезом с -1 в конце:

Python
code = "ID-2048"
last = code[-3:-1]  # ✗
print(last)  # 04

Ошибки нет, но вместо 048 получилось 04. Граница stop в срез не входит, поэтому индекс -1, то есть последний символ, отброшен. До конца строки срез доходит без stop: code[-3:] даёт 048.

Главное

  • s[start:stop] берёт символы от start до stop, не включая stop.
  • Пропущенная граница — это начало или конец строки, а граница за концом ошибки не вызывает.
  • s[::step] берёт каждый step-й символ, а s[::-1] переворачивает строку.
  • Срез возвращает новую строку и не меняет исходную.

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

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

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