Одна из самых простых и полезных концепций в Python — это срезы. Разбираем вместе с Гигачат, что это, как работает и какие ошибки допускают новички.
Срезы (slices) — это механизм языка Python, который используют для получения части последовательности без изменения исходного объекта (возвращается новый объект). Его можно применять к разным типам данных, например, к строкам, спискам, кортежам, диапазонам, байтовым строкам.
Идея срезов состоит в выборе диапазона элементов по индексам — это позволяет сразу получить нужный фрагмент последовательности, поэтому механизм удобен для обработки данных, работы с текстом, копирования структур.
Синтаксис можно представить так: sequence[start:stop:step], где:
Если не указать ни одного параметра, Python сделает копию всей последовательности. Все три параметра могут быть отрицательными.
Индекс в Python — это позиция элемента внутри последовательности. Индексация начинается с нуля — первый элемент имеет индекс 0. Если обратиться к элементу по индексу, Python вернет его значение:
letters = ["A", "B", "C", "D", "E"]
letters[2]
# "C"
Принцип работы срезов аналогичен:
letters = ["A", "B", "C", "D", "E"]
letters[1:4]
# ["B", "C", "D"]
Иногда новичкам непривычно, что последний индекс не включается в выборку, однако на практике это удобнее. Например, такой диапазон всегда означает выбор первых трех элементов:
a[0:3]
Также эта особенность позволяет быстрее вычислять длину среза: достаточно вычесть из конечного индекса начальный. Для примера выше длина составляет 3, а для диапазона 2:6 — 4.
Иногда нужно обращаться к элементам с конца последовательности. Для этого используют отрицательные индексы:
letters = ["A", "B", "C", "D", "E"]
letters[-1]
# "E"
letters[-4:-1]
# ["B", "C", "D"]
Шаг позволяет выбирать каждый n-элемент, переворачивать последовательность и пропускать элементы. По умолчанию он равен единице — Python берет все элементы без пропусков, как в нашем предыдущем примере.
Если шаг больше единицы, часть элементов пропускается:
numbers = [0, 1, 2, 3, 4, 5]
numbers[0:6:2]
# [0, 2, 4]
Выбираются элементы с индексом 0, 2, 4 — шаг равен двум.
Чтобы перевернуть последовательность, нужно указать отрицательный шаг:
text = "Python"
text[::-1]
# nohtyP
Если значение параметра stop выходит за пределы объекта, Python не вызывает ошибку, а выбирает все доступные элементы. Если за рамки выходит весь диапазон значений, получится пустой объект.
Наиболее простой пример — извлечение части строки:
text = "Programming"
result = text[0:8]
print(result)
# Programm
То же самое можно было получить, не указывая первый параметр:
result = text[:8]
print(result)
# Programm
Разворот строки с помощью среза делают так:
result = text[::-1]
print(result)
# gnimmargorP
Чтобы перевернуть только часть строки, нужно дополнительно указать диапазон:
text = "abcdefgh"
result = text[6:2:-1]<br/
print(result)
# gfed
Частые ошибки при работе со срезами
text = "Python"
text[0:5:-1]
Но результатом будет пустая строка. Это происходит потому, что с отрицательным шагом Python должен двигаться слева направо, но указанный диапазон (0:5) предполагает движение в обратном порядке. Чтобы все работало правильно, нужно исправить код:
text = "Python"
text[5:0:-1]
numbers = [1,2,3,4]
copy = numbers[:]
Такой код позволяет скопировать строку, но numbers и copy — это разные объекты. Проверим это:
print(numbers == copy)
# True
# списки содержат одинаковые элементы
print(numbers is copy)
# False
# number и copy не ссылаются на один объект
ГигаЧат — это нейросеть, которая работает бесплатно, умеет вести диалоги, генерировать текст, картинки, видео и код. Она полезна как для начинающих разработчиков, так и для опытных специалистов. Как конкретно помогает ГигаЧат:
Попросим ГигаЧат решить небольшую задачу, связанную с темой статьи: «Объясни, что такое срезы в Python и зачем они нужны. Добавь 1–2 примера их использования».
Ответ нейросети: