Срезы в Python — как работают
В этом уроке вы узнаете о срезах в Python и о том, как их использовать для извлечения данных из последовательности и назначения ей данных.
- Обзор нарезки Python
- Тип slice в Python
- Python Slicing: границы start и stop
- Отрицательные границы start и stop
- Значение step
- Метод indexes
Обзор нарезки Python
Ранее мы уже говорили о нарезке, например нарезке списка.
Технически нарезка основана на индексации. Поэтому нарезка работает только с типами последовательностей. Для изменяемых типов sequence, таких как списки, вы можете использовать срезы для извлечения и назначения данных. Например:
colors = ['red', 'green', 'blue', 'orange'] # extract data print(colors[1:3]) # assign data colors[1:3] = ['pink', 'black'] print(colors)
Выход:
['green', 'blue'] ['red', 'pink', 'black', 'orange']
Однако вы можете использовать срезы для извлечения данных из неизменяемых последовательностей. Например:
topic = 'Python Slicing' # Extract data print(topic[0:6])
Выход:
Python
Если вы попытаетесь использовать нарезку для присвоения данных неизменяемой последовательности, вы получите сообщение об ошибке. Например:
topic[0:6] = 'Java'
Ошибка:
TypeError: 'str' object does not support item assignment
Срез seq[start:stop] возвращает элементы, начиная с начала индекса до остановки индекса — 1. Таким образом, при слайсинге последовательности легче визуализировать, так как индексы находятся между элементами:
Тип slice в Python
Все в Python является объектом, включая срез. Срез на самом деле является объектом типа slice. Когда вы используете обозначение среза:
seq[start:stop]
start:stop — это объект среза.
slice(start, stop)
Например:
s = slice(1, 3) print(type(s)) print(s.start, s.stop)
Выход:
<class 'slice'> 1 3
Поэтому вместо использования обозначения слайсинга:
colors[1:3]
…вы можете использовать объект среза:
colors = ['red', 'green', 'blue', 'orange'] s = slice(1, 3) print(colors[s])
Выход:
['green', 'blue']
Python Slicing: границы start и stop
Срез seq[start:stop] выбирает элементы, начиная с начала индекса и заканчивая концом индекса(исключая элемент в конце индекса).
Другими словами, он возвращает все элементы последовательности с индексом n, где n удовлетворяет следующему выражению:
start <= n < stop
Когда start или stop превышает длину последовательности:
len(seq)
… Python использует len(seq) для начала и остановки.
И start, и stop не являются обязательными. По умолчанию значение start равно 0, а значение stop — len(seq), если вы его не укажете.
Следующий пример возвращает весь список:
colors = ['red', 'green', 'blue', 'orange'] print(colors[0:100])
Выход:
['red', 'green', 'blue', 'orange']
Поскольку граница stop равна 100, Python использует len(colors) для границы stop.
Следующий пример возвращает пустой список:
colors = ['red', 'green', 'blue', 'orange'] print(colors[10:])
Поскольку start равно 10, Python присваивает ему len(colors).
Отрицательные границы start и stop
Объект среза также принимает отрицательные границы start и stop. Они используются в следующем примере для разделения списка:
colors = ['red', 'green', 'blue', 'orange'] print(colors[-4:-2])
Выход:
['red', 'green']
Чтобы получить «blue» и «orange» элементы из списка цветов, вы можете объединить отрицательные и положительные границы:
colors = ['red', 'green', 'blue', 'orange'] print(colors[-2:4])
Выход:
['blue', 'orange']
Значение step
Срезы поддерживают третий аргумент, который является значением шага. Значение step по умолчанию равно 1, если вы его не укажете:
seq[star:stop:step]
Это эквивалентно:
s = slice(start, stop, step) seq[s]
См. следующий пример:
colors = ['red', 'green', 'blue', 'orange'] print(colors[0:4:2])
Выход:
['red', 'blue']
Метод indexes
Объект среза по существу определяет последовательность индексов для выбора элементов последовательности.
Для удобства тип среза имеет метод indexes, который возвращает эквивалентный диапазон (start, stop, step) для любого среза последовательности указанной длины:
slice(start, stop, step).indices(length)
Он возвращает новый кортеж:
(i, j, k)
И вы можете использовать значения этого кортежа для создания списка индексов с помощью функции диапазона. Например:
colors = ['red', 'green', 'blue', 'orange'] s = slice(0, 4, 2) t = s.indices(len(colors)) for index in range(*t): print(colors[index])
Выход:
red blue
Как это работает.
- Сначала создайте объект среза, start которого равен 0, stop — 4 и step — 2.
- Во-вторых, верните кортеж индексов среза последовательности, длина которого равна длине списка цветов.
- В-третьих, передайте кортеж результатов в функцию диапазона, чтобы выбрать элементы из списка цветов.