Что такое срезы в Python
Срезы — это одна из самых часто используемых механик в языках программирования. Что они делают в Python, зачем нужны и как ими пользоваться читайте в нашей статье!
Срез (slice) — механизм, который позволяет выбирать определенную часть последовательности, такой как строка, список или кортеж. Срезы формируются при помощи квадратных скобок «[]» и двоеточия «:». Синтаксис среза выглядит так:
i_object[start:stop:step]
Где:
- i_object — это итерируемый объект (последовательность)
- start — индекс начала среза. Выбираются элементы начиная с него, включая сам элемент под этим индексом. Если он не указывается, то отсчет начинается с 0 индекса
- stop — индекс окончания среза. Выбираются элементы до него, при этом элемент под этим индексом не включается результат среза. Если он не указывается, то автоматически считается последний элемент в итерируемом объекте
- step — шаг. Если он не указывается, то по умолчанию равен 1.
Важно! Срез в Python не изменяет исходный итерируемый объект, а создает новый объект, содержащий выбранные элементы исходного объекта. При этом исходный объект остается неизменным.
Для чего нужны срезы
С помощью срезов можно извлекать подстроки из строк, подмножества из списков, а также производить другие операции над последовательностями. Вот полный список того, что можно делать с помощью срезов:
- Получать часть данных из последовательности
- Выбирать элементы последовательности с определенным интервалом
- Изменять порядок элементов, в том числе разворачивать элементы в обратном порядке
- Создавать копии последовательности.
Срез списка
Список (англ. list) в Python — это структура данных, представляющая собой упорядоченную коллекцию элементов, которые могут быть различных типов данных: числа, строки, другие списки. Давайте рассмотрим как делать срез списка на примере:
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8]
# Извлечем числа от 3 до 6 (не включая 6)
result_1 = numbers[3:6]
print(result_1) # Выведет [3, 4, 5]
# Извлечем числа начиная с 0 до 3 (включительно)
result_2 = numbers[:4]
print(result_2) # Выведет [0, 1, 2, 3]
# Извлечем числа с 3 и до конца
result_3 = numbers[3:]
print(result_3) # Выведет [3, 4, 5, 6, 7, 8]
Срез кортежа
Кортеж (англ. tuple) в Python — это упорядоченная неизменяемая коллекция элементов. Основное отличие кортежей от списков заключается в том, что кортежи не могут быть изменены после создания. Элементы кортежа могут быть любого типа данных, таких как числа, строки, списки и другие кортежи. Но так как срезы не изменяют итерируемые объекты, то принцип работы с кортежами такой же, как и со списками:
my_tuple = ('апельсин', 'банан', 'вишня', 'финик', 'голубика')
new_slice = my_tuple[1:4]
print(new_slice) # Выведет (',банан', 'вишня', 'финик')
Срез строки: как извлекать подстроку из строки
Срезы удобно использовать для извлечения подстрок из строки. Например, для разбиения текста на слова или выделения ключевых фраз. Для этого указывается диапазон индексов через двоеточие:
- Ситуация 1: давайте извлечем срез строки text с индекса 1 по индекс 3. То есть возьмем символы с индексами 1, 2 и 3.
text = "привет"
print(text[1:4]) # Выведет рив
Важно помнить, что в срез попадают символы от первого указанного индекса (включительно) до второго (не включая его).
- Ситуация 2: опустим первый индекс при срезе, чтобы получить срез от самого начала до 4 индекса:
text = "привет"
print(text[:4]) # прив - срез от начала до 4
- Ситауация 3: опустим второй индекс при срезе, чтобы получить срез от 3 индекса до самого конца:
text = "привет"
print(text[3:]) # вет - срез от 3 до конца
- Ситуация 4: можно сделать срез всей строки целиком, не указывая границы:
text = "привет"
print(text[:]) # Выведет привет
Шаг извлечения среза
Шаг извлечения среза в Python — это необязательный параметр, который определяет интервал между элементами, которые будут выбраны при создании среза. Он позволяет выбирать каждый n-ный элемент из последовательности.
Например, если у нас есть список numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], то мы можем использовать шаг, чтобы извлечь только четные числа:
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
even_numbers = numbers[::2]
print(even_numbers) # Выведет [0, 2, 4, 6, 8]
Тонкости использования шага среза на примере работы со строками
При извлечении срезов из строки можно указывать шаг, с которым будут выбираться символы. Это позволяет получить не всю подстроку подряд, а каждый N-ый символ. Шаг указывается после двоеточия через второе двоеточие:
- Прямой шаг: давайте сделаем срез всей строки текста с шагом 2. То есть возьмем символы с четными индексами:
text = "привет"
print(text[::2]) # Выведет пие
Указывая начальный, конечный индекс и шаг, можно гибко управлять результирующим срезом:
text = "привет"
print(text[1:6:2]) # рвт
# Здесь из строки взят срез с индекса 1 по 5 с шагом 2.
- Отрицательный шаг: теперь извлечем срез в обратном порядке c шагом -1:
text = "привет"
print(text[::-1]) # тевирп
Результат эквивалентен развороту строки.