
Срезы в Python позволяют извлекать части последовательностей, таких как строки, списки и кортежи, с помощью синтаксиса start:stop:step. Значение start определяет индекс начала, stop – индекс конца (не включительно), а step задаёт шаг обхода. Все три параметра могут быть опущены: start по умолчанию равен 0, stop – длине последовательности, step – 1.
Отрицательные индексы позволяют работать с элементами с конца последовательности. Например, list[-3:] возвращает последние три элемента, а string[::-1] создаёт обратную копию строки. При этом важно учитывать, что срез всегда создаёт новую последовательность и не изменяет исходную.
Срезы поддерживают пропуск параметров для компактного кода. Конструкция data[:5] эквивалентна data[0:5], а data[::2] возвращает каждый второй элемент. Использование отрицательного шага меняет направление обхода, что позволяет эффективно реализовывать разворот и выборку элементов с конца без циклов.
При работе с большими структурами данных следует учитывать, что срез создаёт копию, а не ссылку. Для списков это может повлечь дополнительные затраты памяти. В таких случаях полезно комбинировать срезы с генераторами или функциями типа itertools.islice, чтобы избежать ненужного дублирования элементов.
Срезы в Python: правила использования и примеры
Срезы в Python позволяют извлекать части последовательностей, таких как строки, списки и кортежи, с использованием синтаксиса sequence[start:stop:step]. Параметр start указывает индекс начала среза, stop – индекс окончания (не включая элемент с этим индексом), а step задаёт шаг.
Если start не указан, срез начинается с первого элемента. Если stop отсутствует, извлекаются все элементы до конца. При отрицательном step последовательность читается справа налево. Например, lst[::-1] возвращает список в обратном порядке.
Допустимо использовать отрицательные индексы, чтобы обратиться к элементам с конца: lst[-3:-1] вернёт два элемента, начиная с третьего с конца и до предпоследнего. Шаг, отличный от единицы, позволяет выбирать элементы через интервалы: lst[::2] вернёт каждый второй элемент.
Срезы не изменяют исходный объект, если это строка или кортеж. Для списков возможна модификация срезом: lst[1:4] = [7, 8, 9] заменит элементы с индексами 1–3. Неправильные границы среза не вызывают ошибок: Python автоматически корректирует их в пределах допустимых индексов.
Для удобства можно использовать встроенные функции и методы вместе со срезами. Например, ''.join(lst[::-1]) объединяет элементы списка в строку в обратном порядке, а my_list[:5] извлекает первые пять элементов без проверки длины списка.
При работе с многомерными структурами, такими как списки списков или numpy-массивы, срезы применяются к каждой размерности отдельно: matrix[:, 1:3] выберет второй и третий столбцы всех строк.
Как задать диапазон индексов для среза списка
Срез списка в Python задаётся через квадратные скобки с указанием начального и конечного индекса в формате список[start:stop]. Элемент с индексом start включается в результат, а элемент с индексом stop не включается.
Если start не указан, срез начинается с первого элемента. Если stop не указан, срез продолжается до последнего элемента списка.
Индексы могут быть отрицательными. -1 обозначает последний элемент, -2 – предпоследний и так далее. Это позволяет задавать диапазоны с конца списка без вычисления длины.
Пример использования диапазона с положительными индексами: numbers[2:5] извлечёт элементы с индексами 2, 3 и 4.
Пример с отрицательными индексами: numbers[-4:-1] вернёт элементы, начиная с четвёртого с конца до последнего, не включая его.
Можно комбинировать отрицательные и положительные индексы: numbers[1:-2] выберет элементы от второго до третьего с конца.
Важно, что если start больше или равен stop, срез вернёт пустой список. Для обратного порядка используется третий параметр – шаг, например numbers[5:2:-1].
При указании диапазона индексов рекомендуется проверять, что индексы находятся в пределах длины списка. Python автоматически обрезает значения за пределами допустимого диапазона без ошибки.
Использование шага в срезах: пропуск элементов

В Python срезы позволяют извлекать элементы последовательности, указывая начальный и конечный индексы, а также шаг. Шаг задаётся третьим параметром в формате sequence[start:stop:step] и определяет, через сколько элементов будет происходить выборка.
Например, если необходимо взять каждый второй элемент списка, используется шаг 2:
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
result = numbers[::2]
print(result) # [0, 2, 4, 6, 8]
Шаг может быть отрицательным, что позволяет получить элементы в обратном порядке:
result = numbers[::-1]
print(result) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Важно учитывать, что при отрицательном шаге индексы работают иначе: начальный индекс должен быть больше конечного, иначе срез вернёт пустой список.
Следующая таблица демонстрирует примеры использования шага:
| Срез | Описание | Результат |
|---|---|---|
| numbers[1:8:2] | Каждый второй элемент от индекса 1 до 7 | [1, 3, 5, 7] |
| numbers[8:1:-3] | Каждый третий элемент от индекса 8 до 2 в обратном порядке | [8, 5, 2] |
| numbers[::3] | Каждый третий элемент от начала до конца | [0, 3, 6, 9] |
| numbers[::-2] | Каждый второй элемент с конца | [9, 7, 5, 3, 1] |
При использовании шага важно помнить:
- Шаг не может быть равен нулю – это вызовет ошибку
ValueError. - Если шаг положительный, конечный индекс меньше начального – срез будет пустым.
- Шаг может быть любым целым числом, что позволяет гибко пропускать элементы.
- Комбинация отрицательного шага с пропусками облегчает разворот и фильтрацию последовательностей без использования циклов.
Обратные срезы: как перевернуть список или строку
В Python для переворота последовательностей используется срез с отрицательным шагом. Общий синтаксис: sequence[start:stop:step]. Чтобы полностью инвертировать список или строку, достаточно указать step=-1, а start и stop можно опустить.
Примеры переворота строк и списков:
| Объект | Срез | Результат |
|---|---|---|
| Список | [1, 2, 3, 4, 5][::-1] |
[5, 4, 3, 2, 1] |
| Строка | "Python"[::-1] |
"nohtyP" |
Важно учитывать, что шаг -1 создает новый объект, а исходная последовательность остается неизменной. Для частичного переворота используется указание индексов start и stop. Например:
| Объект | Срез | Результат |
|---|---|---|
| Список | [10, 20, 30, 40, 50][3:0:-1] |
[40, 30, 20] |
| Строка | "abcdef"[4:1:-1] |
"edc" |
Обратные срезы особенно эффективны при необходимости изменить порядок элементов без применения функций типа reverse(). Они работают со всеми типами последовательностей, включая списки, строки и кортежи.
Для наглядности: срез sequence[::-1] эквивалентен циклу с перебором в обратном порядке, но выполняется быстрее и короче по записи.
Срезы строк: извлечение подстрок и символов
Срезы в Python позволяют извлекать части строк с помощью синтаксиса string[start:stop:step]. Параметр start указывает индекс начала, stop – индекс конца (не включая символ с этим индексом), step задает шаг выборки.
Для получения подстроки с третьего по седьмой символ используется text[2:7]. Если start опущен, срез начинается с нулевого индекса; если stop отсутствует, выборка продолжается до конца строки: text[:5] и text[3:].
Отрицательные индексы позволяют считать символы с конца строки. Например, text[-4:-1] возвращает четвертый до последнего символ включительно до предпоследнего.
Шаг step задает интервалы: text[::2] выбирает каждый второй символ, text[::-1] выполняет обратный порядок символов.
Срезы применимы для извлечения отдельных символов: char = text[5] вернет шестой символ. Для изменения подстрок напрямую срезы не подходят, так как строки неизменяемы; для этого используют создание новых строк: new_text = text[:3] + "замена" + text[6:].
При работе с динамическими индексами безопаснее использовать min() и max() для ограничения диапазона среза, чтобы избежать ошибок выхода за пределы строки: text[start:min(stop, len(text))].
Многомерные срезы в списках и массивах
В Python многомерные структуры, такие как списки списков или массивы NumPy, позволяют применять срезы одновременно по нескольким осям. В стандартных списках срезы работают последовательно: сначала выбирается ряд элементов, затем внутри каждого элемента – вложенный срез.
Пример для списка списков:
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
matrix[0:2] вернёт первые два ряда: [[1, 2, 3], [4, 5, 6]]. Для получения конкретных столбцов можно применить генератор: [row[1:3] for row in matrix[0:2]] → [[2, 3], [5, 6]].
В массивах NumPy поддерживается синтаксис array[row_slice, column_slice], что упрощает многомерные срезы. Например:
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
arr[0:2, 1:3] вернёт массив [[2, 3], [5, 6]], срез сразу по строкам и столбцам.
Срезы в более высоких измерениях работают аналогично: arr[0:2, :, 1:3] для трёхмерного массива выберет первые два «слоя», все строки и столбцы с индексами 1 и 2. Использование : позволяет задать всю ось без явного перечисления индексов.
Рекомендации:
- Для списков без NumPy многомерные срезы лучше делать через генераторы или списковые включения.
- В массивах NumPy всегда использовать запятую для разделения срезов по осям.
- Проверяйте размеры срезов: несоответствие длины осей вызовет ошибку.
- Для изменения подмассива используйте slice-операции напрямую: arr[0:2, 1:3] = [[10, 11], [12, 13]].
Многомерные срезы упрощают выбор и модификацию данных, минимизируя количество циклов и повышая читаемость кода.
Изменение элементов через срезы

В Python срезы позволяют не только получать подсписки, но и напрямую изменять их содержимое. Для изменения элементов используют присваивание срезу: список[начало:конец:шаг] = новый_список. Количество элементов в новом списке может совпадать с длиной среза или отличаться, если шаг равен 1.
Пример замены части списка:
numbers = [1, 2, 3, 4, 5]
numbers[1:4] = [20, 30, 40]
После выполнения numbers станет [1, 20, 30, 40, 5]. Здесь длина среза и нового списка совпадает.
Если шаг среза больше 1, количество заменяемых элементов должно точно соответствовать длине нового списка:
numbers = [1, 2, 3, 4, 5, 6]
numbers[0:6:2] = [10, 30, 50]
Результат: [10, 2, 30, 4, 50, 6]. Попытка присвоить меньше или больше элементов вызовет ValueError.
Удаление элементов срезом выполняется присваиванием пустого списка:
numbers = [1, 2, 3, 4, 5]
numbers[1:4] = []
Результат: [1, 5]. Этот способ эффективен для удаления диапазонов элементов без вызова del напрямую.
Срезы с отрицательным шагом позволяют изменять элементы в обратном порядке:
letters = [‘a’, ‘b’, ‘c’, ‘d’]
letters[3:0:-1] = [‘x’, ‘y’, ‘z’]
После выполнения letters станет [‘a’, ‘z’, ‘y’, ‘x’]. Новый список должен точно соответствовать количеству элементов среза.
Удаление элементов с помощью срезов

Срезы позволяют удалять диапазоны элементов списка без явного цикла или метода del для каждого индекса.
del список[начало:конец]– удаляет все элементы между индексами.список[начало:конец] = []– замещает диапазон пустым списком.
Примеры:
# удаление элементов с 2 по 4 индекс (не включая 5)
данные = [10, 20, 30, 40, 50, 60]
del данные[2:5]
# результат: [10, 20, 60]
# удаление каждого второго элемента
данные = [1, 2, 3, 4, 5, 6, 7]
del данные[::2]
# результат: [2, 4, 6]
# очистка списка через срез
данные = [1, 2, 3]
данные[:] = []
# результат: []
- Используйте
del список[:]для полной очистки. - При отрицательном шаге элементы удаляются в обратном порядке, например
del список[::-1][::2]– удаление каждого второго с конца. - Срезы изменяют список на месте, не создавая копий.
Срезы с объектами типа byte и bytearray
Объекты bytes и bytearray поддерживают те же правила срезов, что и списки. Индексация начинается с нуля, отрицательные индексы отсчитываются с конца. Шаг можно задавать любым целым числом, кроме нуля.
bytesнеизменяемы: результат среза всегда новый объект.bytearrayизменяемы: срезы можно использовать не только для чтения, но и для записи.
Примеры чтения:
data = b'abcdef'
print(data[1:4]) # b'bcd'
print(data[::-1]) # b'fedcba'
Примеры записи в bytearray:
arr = bytearray(b'python')
arr[0:2] = b'Py' # заменяем первые два байта
print(arr) # bytearray(b'Python')
arr[2:6] = b'THON' # замена диапазона на строку той же длины
print(arr) # bytearray(b'PyTHON')
Особенности:
- При присвоении срезу длина заменяемого диапазона и подставляемой последовательности должна совпадать, иначе возникнет
ValueError. - Срезы поддерживают шаг:
arr[::2]выбирает каждый второй байт. - Операции со срезами не изменяют тип: результат для
bytes– новыйbytes, дляbytearray– новыйbytearray.
