Срезы
В первом уроке темы вы брали с полочки по одной фишке. Но программе часто нужен целый кусок строки: год из даты, код города из номера телефона.
Вернёмся к полочке со словом. Представьте, что между фишками нарисованы засечки и у каждой засечки свой номер. Засечка перед первой фишкой — 0, после первой — 1, и так до засечки после последней фишки. Чтобы взять кусок, вы называете две засечки, и всё, что между ними, — ваш кусок.
В Python две границы куска пишут в квадратных скобках через двоеточие:
date = "2026-10-14"
year = date[0:4]
month = date[5:7]
print(year, month) # 2026 10
print(date[8:]) # 14Давайте разберём пример по строкам:
date[0:4]— символы между засечками0и4, то есть с индексами от0до3: год2026.date[5:7]— символы с индексами5и6: месяц10.date[8:]— от индекса8до конца строки: день14.
Начало и конец
Запись s[start:stop] называют срезом. Она возвращает новую строку из символов с индексами от start до stop, причём stop в неё не входит, как и в range. На полочке это видно сразу: засечка stop стоит перед фишкой с тем же номером, и эта фишка в кусок не попадает.
Пока обе границы неотрицательные, не выходят за строку и start не больше stop, длина среза равна stop - start. У date[0:4] это четыре символа.
Пропущенная граница
Любую границу можно пропустить:
- без
startсрез начинается с первого символа; - без
stopсрез идёт до конца строки.
Границы бывают и отрицательными, как индексы:
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]— отрицательный шаг идёт справа налево, и строка выходит задом наперёд.
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 в конце:
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 и подпишись на канал — откроются все уроки.