Короткий ответ
Срез извлекает часть последовательности по правилу sequence[start:stop:step]: start включается, stop не включается, а step задаёт шаг выборки. Механизм работает со строками, списками, кортежами и объектами range.
Как это работает подробнее
Срез можно задать квадратными скобками или функцией slice(), а опущенные параметры получают значения по умолчанию.
- Границы. Начальный индекс включается в результат, конечный — нет, поэтому длина результата зависит от разности границ и шага.
- Значения по умолчанию. При пропуске
startберётся 0,stop— длина последовательности,step— 1. - Частые приёмы.
s[:3]— первые три элемента,s[3:]— всё после четвёртого,s[::2]— каждый второй,s[::-1]— разворот. - Копия. Срез списка создаёт новый список, а не «окно» над исходным, поэтому изменения в срезе не затрагивают оригинал.
Пример кода
Извлечение части списка
l = [10, 20, 30, 40, 50]
res = slice(1, 4)
print(l[res]) # [20, 30, 40]
print(l[1:4]) # [20, 30, 40]
print(l[::2]) # [10, 30, 50]
print(l[::-1]) # [50, 40, 30, 20, 10]
s = 'Hello World!'
print(s[2:5]) # lloЧто использовать на практике
- Крайние части. Бери начало и конец последовательности срезами
s[:n]иs[-n:], не вычисляя длину. - Разворот. Разворачивай последовательность срезом
s[::-1]. - Шаг выборки. Для выборки каждого N-го элемента используй срез с шагом вместо цикла.
Подводные камни
- Выход за границы. Срез не вызывает ошибку при выходе за границы, а просто возвращает доступные элементы — это иногда маскирует логические ошибки.
- Отрицательный шаг. С отрицательным шагом границы обрабатываются в обратном направлении, что легко понять неправильно.
- Копия, а не представление. Срез встроенного списка всегда создаёт копию элементов, поэтому он не отражает последующие изменения оригинала.
Как отвечать на собеседовании
- Начни с определения: извлечение части последовательности → опиши синтаксис
start,stop,stepи значения по умолчанию → приведи пример со списком и популярные приёмы вроде разворота → упомяни, что срез создаёт копию.