Срезы в Python — как работают

В этом уроке вы узнаете о срезах в Python и о том, как их использовать для извлечения данных из последовательности и назначения ей данных.

Содержание

Обзор нарезки 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. Таким образом, при слайсинге последовательности легче визуализировать, так как индексы находятся между элементами:

Нарезка в Python

Тип 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']

Отрицательные границы start и stop для объекта среза в Python

Значение 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.
  • Во-вторых, верните кортеж индексов среза последовательности, длина которого равна длине списка цветов.
  • В-третьих, передайте кортеж результатов в функцию диапазона, чтобы выбрать элементы из списка цветов.
Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *