Сколько может быть чисел в срезе (slice)?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Числа в срезе (slice) Python
Базовая структура среза
Срез (slice) в Python имеет следующую синтаксис:
sequence[start:stop:step]
Таким образом, в срезе может быть максимум 3 числа:
- start — индекс начала (включительно)
- stop — индекс конца (исключительно)
- step — шаг (по умолчанию 1)
list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# Одно число
list[5] # 5 (конкретный элемент, не срез)
# Два числа (start и stop)
list[2:7] # [2, 3, 4, 5, 6]
# Три числа (start, stop, step)
list[1:8:2] # [1, 3, 5, 7]
# Все три с явным указанием
list[0:10:1] # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Опущенные параметры
Любой из трёх параметров может быть опущен, что означает использование значений по умолчанию:
list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# start по умолчанию = 0
list[:5] # [0, 1, 2, 3, 4]
# stop по умолчанию = длина последовательности
list[3:] # [3, 4, 5, 6, 7, 8, 9]
# step по умолчанию = 1
list[::2] # [0, 2, 4, 6, 8]
# Все опущены
list[:] # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] (копия списка)
list[::] # То же самое
Отрицательные индексы
Отрицательные индексы считают с конца последовательности:
list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# Отрицательные индексы с конца
list[-1] # 9 (последний элемент)
list[-3:] # [7, 8, 9] (последние 3 элемента)
list[:-3] # [0, 1, 2, 3, 4, 5, 6] (все кроме последних 3)
list[-5:-2] # [5, 6, 7]
Отрицательный шаг (reverse)
Отрицательный step позволяет идти в обратном направлении:
list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# Полный реверс
list[::-1] # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
# Реверс с шагом -2
list[::-2] # [9, 7, 5, 3, 1]
# Реверс от индекса 7 до 2
list[7:2:-1] # [7, 6, 5, 4, 3]
# От конца до начала с шагом -3
list[-1::-3] # [9, 6, 3, 0]
Срезы со строками
Строки тоже поддерживают срезы (как и кортежи, списки):
text = "Hello, World!"
text[0:5] # "Hello"
text[7:12] # "World"
text[::-1] # "!dlroW ,olleH" (реверс)
text[::2] # "Hlowrd" (каждый второй символ)
Объект slice()
Внутри Python срез представляется объектом slice:
s = slice(2, 7, 1) # Эквивалентно [2:7:1]
list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
list[s] # [2, 3, 4, 5, 6]
# Доступ к параметрам
print(s.start) # 2
print(s.stop) # 7
print(s.step) # 1
Это полезно, когда нужно динамически создавать срезы:
def get_slice(start=None, stop=None, step=None):
return slice(start, stop, step)
my_slice = get_slice(1, 8, 2)
list = range(10)
print(list[my_slice]) # [1, 3, 5, 7]
Срезы в многомерных структурах
В numpy, pandas и других библиотеках для многомерных данных можно использовать несколько срезов:
import numpy as np
array = np.arange(20).reshape(4, 5)
# [[0, 1, 2, 3, 4],
# [5, 6, 7, 8, 9],
# [10, 11, 12, 13, 14],
# [15, 16, 17, 18, 19]]
# Но это НЕСКОЛЬКО срезов через запятую, а не один
array[1:3, 2:4] # Строки 1-2, столбцы 2-3
При этом каждый срез по-прежнему содержит максимум 3 параметра.
Особенности и граничные случаи
list = [0, 1, 2, 3, 4]
# Если start >= stop и step > 0
list[5:2] # [] (пустой список)
# Если индексы выходят за границы
list[0:100] # [0, 1, 2, 3, 4] (до конца)
list[-100:-1] # [0, 1, 2, 3] (с начала)
# Шаг не может быть 0
list[::0] # ValueError: slice step cannot be zero
Вывод
В срезе может быть максимум 3 параметра:
start— начало (по умолчанию None/0)stop— конец (по умолчанию None/длина)step— шаг (по умолчанию 1)
Любой из них может быть опущен, опущен, задан отрицательным значением. Это делает срезы Python одним из самых мощных инструментов для работы с последовательностями.