Индексы и срезы
Сегодня мы поговорим об операциях взятия индекса и среза.
Взятие элемента по индексу
Как и в других языках программирования, взятие по индексу:
>>> a = [1, 3, 8, 7] >>> a[0] 1 >>> a[3] 7 >>> a[4] Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: list index out of range
Как и во многих других языках, нумерация элементов начинается с нуля. При попытке доступа к несуществующему индексу возникает исключение IndexError.
В данном примере переменная a являлась списком, однако взять элемент по индексу можно и у других типов: строк, кортежей.
В Python также поддерживаются отрицательные индексы, при этом нумерация идёт с конца, например:
>>> a = [1, 3, 8, 7] >>> a[-1] 7 >>> a[-4] 1 >>> a[-5] Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: list index out of range
Срезы
В Python, кроме индексов, существуют ещё и срезы.
item[START:STOP:STEP] - берёт срез от номера START, до STOP (не включая его), с шагом STEP. По умолчанию START = 0, STOP = длине объекта, STEP = 1. Соответственно, какие-нибудь (а возможно, и все) параметры могут быть опущены.
>>> a = [1, 3, 8, 7] >>> a[:] [1, 3, 8, 7] >>> a[1:] [3, 8, 7] >>> a[:3] [1, 3, 8] >>> a[::2] [1, 8]
Также все эти параметры могут быть и отрицательными:
>>> a = [1, 3, 8, 7] >>> a[::-1] [7, 8, 3, 1] >>> a[:-2] [1, 3] >>> a[-2::-1] [8, 3, 1] >>> a[1:4:-1] []
В последнем примере получился пустой список, так как START < STOP, а STEP отрицательный. То же самое произойдёт, если диапазон значений окажется за пределами объекта:
>>> a = [1, 3, 8, 7] >>> a[10:20] []
Также с помощью срезов можно не только извлекать элементы, но и добавлять и удалять элементы (разумеется, только для изменяемых последовательностей).
>>> a = [1, 3, 8, 7] >>> a[1:3] = [0, 0, 0] >>> a [1, 0, 0, 0, 7] >>> del a[:-3] >>> a [0, 0, 7]