Программирование и IT

Python: срезы

Срез вырезает из последовательности кусок по правилу «с какого индекса, до какого, с каким шагом». Запись компактная, но у неё два места, где почти все ошибаются: правая граница не включается, а при отрицательном шаге границы меняются местами. Разберём оба.

Обновлено
В этой статье

Как читается запись#

Полная форма — последовательность[начало:конец:шаг]. Начало включается,
конец — нет. Любую часть можно опустить.

a = [0, 1, 2, 3, 4, 5]
print(a[1:4])    # [1, 2, 3]
print(a[:3])     # [0, 1, 2]
print(a[3:])     # [3, 4, 5]
print(a[:])      # [0, 1, 2, 3, 4, 5]
print(a[::2])    # [0, 2, 4]

Правило «конец не входит» кажется неудобным, пока не заметишь два следствия:
длина среза равна конец - начало, а a[:i] и a[i:] вместе дают исходный
список без нахлёста и без пропусков.

i = 2
print(a[:i] + a[i:] == a)    # True
print(len(a[1:4]))           # 3

Отрицательные индексы и отрицательный шаг#

Отрицательный индекс считает с конца: -1 — последний элемент, -2
предпоследний.

print(a[-1])     # 5
print(a[-2:])    # [4, 5]   последние два
print(a[:-2])    # [0, 1, 2, 3]   всё, кроме последних двух

Отрицательный шаг идёт справа налево, и тогда начало должно быть правее конца:

print(a[::-1])    # [5, 4, 3, 2, 1, 0]
print(a[4:1:-1])  # [4, 3, 2]
print(a[1:4:-1])  # []  — пусто: идём влево, а конец правее начала

Запись a[::-1] — идиоматичный разворот. Для списка есть и метод reverse(),
меняющий список на месте; срез же возвращает новый.

Срезы строк#

Строка — такая же последовательность, поэтому правила те же, но результат —
строка, а не список символов.

s = "программирование"
print(s[:7])        # програм
print(s[-5:])       # вание
print(s[::-1])      # еинавориммаргорп
print(s[::3])       # пгмрае
print(s[4:4])       # пустая строка

Срезом удобно резать записи фиксированного формата: date[:4] — год из
"2026-09-21", date[5:7] — месяц. Для форматов переменной длины надёжнее
split — это разобрано в статье про строки.

Срез как копия и присваивание срезу#

a[:] создаёт новый список с теми же элементами — это поверхностная копия:

b = a[:]
b.append(99)
print(len(a), len(b))    # 6 7

Вложенные объекты при этом остаются общими, как и при a.copy(). Подробнее —
в статье про списки.

Срезу можно присваивать, и длина куска при этом меняться не обязана:

nums = [0, 1, 2, 3, 4]
nums[1:3] = ["a", "b", "c"]
print(nums)          # [0, 'a', 'b', 'c', 3, 4]
nums[0:2] = []       # удаление куска
print(nums)          # ['b', 'c', 3, 4]
del nums[::2]
print(nums)          # ['c', 4]

Со строками так нельзя: строки неизменяемы, s[0:2] = "ab" даёт TypeError.

Почему получается пусто#

Срез никогда не бросает IndexError — за границами он просто отдаёт то, что
есть, вплоть до пустоты. Это удобно, но прячет ошибки:

print(a[10:20])   # []   индексов нет — пусто, без исключения
print(a[10])      # IndexError: list index out of range
print(a[3:1])     # []   начало правее конца при шаге +1
print(a[::0])     # ValueError: slice step cannot be zero

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

Практика: возьми список из двадцати чисел и одной строкой получи каждый
третий элемент с конца, а затем разбей список на куски по пять через
[a[i:i + 5] for i in range(0, len(a), 5)] — эта идиома пригодится часто.

План по этапам

  1. Три простых срезаНа списке из шести элементов получить первые три, последние два и весь список копией.
  2. Шаг и разворотВывести каждый второй элемент и развернуть последовательность через [::-1].
  3. Отрицательные границыПолучить «всё, кроме последних двух» и «последние два», сравнить с длиной исходного.
  4. Присваивание срезуЗаменить два элемента тремя и удалить кусок через nums[i:j] = [].
  5. Разбить на частиРазрезать список из двадцати чисел на куски по пять списочным выражением со срезом.

Начать изучать эту тему у себя

План ляжет в твой репозиторий: отмечай этапы, веди конспект — история изменений покажет, как ты продвинулся.

Начать план

Проверь себя

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])?

Источники

Было полезно?

Ещё темы

Программирование и IT Python: списки Список — изменяемый упорядоченный набор значений произвольных типов. Он же главный источник неожиданностей у начинающих: присваивание не копирует список, sort ничего не возвращает, а удаление элементов прямо в цикле пропускает половину. Разберём по порядку. Программирование и IT Python: строки Строка в Python — неизменяемая последовательность символов. Из этого следуют почти все её особенности: методы не меняют строку, а возвращают новую, а быстрая сборка текста идёт через join, а не через сложение в цикле. Ниже — рабочий минимум с примерами и выводом. Программирование и IT Как изучить Python с нуля Python хорош для первого знакомства с программированием: код читается почти как текст, а стандартная библиотека закрывает большинство бытовых задач. Этот план ведёт от установки интерпретатора до собственных скриптов, покрытых тестами, — примерно за четыре месяца при занятиях около часа в день. Программирование и IT Python: задачи с решениями Подборка задач по возрастанию сложности — от разворота строки до генератора и декоратора-счётчика. Сначала решай сам и только потом открывай разбор: сравнение своего кода с чужим даёт больше, чем чтение готового. Все решения проверены на Python 3. Программирование и IT Python: генераторы Генератор выдаёт значения по одному и только тогда, когда их просят. Он не хранит всю последовательность в памяти, поэтому подходит для больших файлов и бесконечных потоков. Плата за это — генератор одноразовый: пройти по нему дважды не получится. Программирование и IT Python: декораторы Декоратор — это функция, которая принимает другую функцию и возвращает новую, с добавленным поведением. Знак `@` перед определением — просто короткая запись присваивания. Если держать это в голове, вся тема разбирается за один вечер.

Ещё сценарии