Программирование и IT
Python: срезы
Срез вырезает из последовательности кусок по правилу «с какого индекса, до какого, с каким шагом». Запись компактная, но у неё два места, где почти все ошибаются: правая граница не включается, а при отрицательном шаге границы меняются местами. Разберём оба.
В этой статье
Как читается запись#
Полная форма — последовательность[начало:конец:шаг]. Начало включается,
конец — нет. Любую часть можно опустить.
=
# [1, 2, 3]
# [0, 1, 2]
# [3, 4, 5]
# [0, 1, 2, 3, 4, 5]
# [0, 2, 4]
Правило «конец не входит» кажется неудобным, пока не заметишь два следствия:
длина среза равна конец - начало, а a[:i] и a[i:] вместе дают исходный
список без нахлёста и без пропусков.
= 2
# True
# 3
Отрицательные индексы и отрицательный шаг#
Отрицательный индекс считает с конца: -1 — последний элемент, -2 —
предпоследний.
# 5
# [4, 5] последние два
# [0, 1, 2, 3] всё, кроме последних двух
Отрицательный шаг идёт справа налево, и тогда начало должно быть правее конца:
# [5, 4, 3, 2, 1, 0]
# [4, 3, 2]
# [] — пусто: идём влево, а конец правее начала
Запись a[::-1] — идиоматичный разворот. Для списка есть и метод reverse(),
меняющий список на месте; срез же возвращает новый.
Срезы строк#
Строка — такая же последовательность, поэтому правила те же, но результат —
строка, а не список символов.
=
# програм
# вание
# еинавориммаргорп
# пгмрае
# пустая строка
Срезом удобно резать записи фиксированного формата: date[:4] — год из
"2026-09-21", date[5:7] — месяц. Для форматов переменной длины надёжнее
split — это разобрано в статье про строки.
Срез как копия и присваивание срезу#
a[:] создаёт новый список с теми же элементами — это поверхностная копия:
=
# 6 7
Вложенные объекты при этом остаются общими, как и при a.copy(). Подробнее —
в статье про списки.
Срезу можно присваивать, и длина куска при этом меняться не обязана:
=
=
# [0, 'a', 'b', 'c', 3, 4]
= # удаление куска
# ['b', 'c', 3, 4]
del
# ['c', 4]
Со строками так нельзя: строки неизменяемы, s[0:2] = "ab" даёт TypeError.
Почему получается пусто#
Срез никогда не бросает IndexError — за границами он просто отдаёт то, что
есть, вплоть до пустоты. Это удобно, но прячет ошибки:
# [] индексов нет — пусто, без исключения
# IndexError: list index out of range
# [] начало правее конца при шаге +1
# ValueError: slice step cannot be zero
Если срез неожиданно пуст, проверь по порядку: не перепутаны ли границы, не
нужен ли отрицательный шаг, не считал ли ты конец включительно. Быстрая
самопроверка — напечатать len(результат) рядом с ожидаемым числом.
Практика: возьми список из двадцати чисел и одной строкой получи каждый
третий элемент с конца, а затем разбей список на куски по пять через
[a[i:i + 5] for i in range(0, len(a), 5)] — эта идиома пригодится часто.
План по этапам
- Три простых срезаНа списке из шести элементов получить первые три, последние два и весь список копией.
- Шаг и разворотВывести каждый второй элемент и развернуть последовательность через [::-1].
- Отрицательные границыПолучить «всё, кроме последних двух» и «последние два», сравнить с длиной исходного.
- Присваивание срезуЗаменить два элемента тремя и удалить кусок через nums[i:j] = [].
- Разбить на частиРазрезать список из двадцати чисел на куски по пять списочным выражением со срезом.
Начать изучать эту тему у себя
План ляжет в твой репозиторий: отмечай этапы, веди конспект — история изменений покажет, как ты продвинулся.
Проверь себя
1.Чему равно len([0, 1, 2, 3, 4, 5][1:4])?
2.Что выведет print("питон"[::-1])?
3.Чему равно len([0, 1, 2, 3, 4, 5][3:1])?
4.Что выведет print([0, 1, 2, 3, 4][1:3])?
Источники
-
Последовательности и срезы в документацииТаблица операций над последовательностями, правила границбесплатно
-
Учебник Python: списки и строкиПервое знакомство со срезами на строках и спискахбесплатно
-
StepikЗадачи на срезы с автопроверкойбесплатно
Было полезно?