# Механизм срезов

При работе с индексированными последовательностями (среди которых мы знаем списки, кортежи и строки) кроме извлечения одного элемента по целочисленному индексу вы можете воспользоваться **срезом** (**slice**) для извлечения последовательности. Срез может содержать начальный индекс, необязательный конечный индекс и необязательное приращение (все значения разделяются двоеточиями).

Приведем пример среза для извлечения первых двух элементов списка

```python
>>> fruits = ["apple", "pineapple", "pear", "banana"]

>>> fruits[0:2]
['apple', 'pineapple']
```

{% hint style="info" %}
Напомним, что в Python используются **полуоткрытые интервалы**. Список доходит до конечного индекса, но не включает его.
{% endhint %}

При определении среза с двоеточием первый индекс не является обязательным. Если первый индекс не указан, то срез по умолчанию начинается с нулевого индекса.

```python
>>> fruits = ["apple", "pineapple", "pear", "banana"]

>>> fruits[0:2]
['apple', 'pineapple']

>>> fruits[:2]
['apple', 'pineapple']
```

В срезах также могут использоваться отрицательные индексы. Отрицательной может быть как начальная, так и конечная позиция. Напоминаем, что индекс `-1` представляет последний элемент. Если срез распространяется до последнего элемента, вы получите все, кроме этого элемента.

```python
>>> fruits = ["apple", "pineapple", "pear", "banana"]

>>> fruits[:-1]
['apple', 'pineapple', 'pear']

>>> fruits[:-2]
['apple', 'pineapple']
```

Последний индекс также не является обязательным. Если последний индекс отсутствует, срез по умолчанию распространяется до конца списка

```python
>>> fruits = ["apple", "pineapple", "pear", "banana"]

>>> fruits[1:]
['pineapple', 'pear', 'banana']

>>> fruits[2:]
['pear', 'banana']

>>> fruits[-2:]
['pear', 'banana']

>>> fruits[-1:]
['banana']
```

Наконец, для начального и конечного индекса могут использоваться значения по умолчанию. Если оба индекса отсутствуют, то возвращаемый срез проходит от начала до конца (и содержит копию списка). Эта конструкция может использоваться для быстрого копирования списков

```python
>>> fruits = ["apple", "pineapple", "pear", "banana"]

>>> fruits[:]
['apple', 'pineapple', 'pear', 'banana']
```

### Приращения в срезах

После начального и конечного индекса срез также может получать **приращение** (его еще называют **шагом** или **страйдом** - **stride**).. Если приращение не задано, по умолчанию используется значение `1`. Приращение `1` означает, что из последовательности извлекается каждый элемент между индексами. С приращением `2` берется каждый второй элемент, с приращением `3` - каждый третий и так далее.

```python
>>> fruits = ["apple", "pineapple", "pear", "banana"]

>>> fruits[1::2]
['pineapple', 'banana']

>>> fruits[::3]
['apple', 'banana']
```

Приращение может быть отрицательным. Приращение `-1` означает, что вы двигаетесь в обратном направлении справа налево. Чтобы использовать отрицательное приращение, укажите значение начального индекса больше конечного. Исключением является ситуация, в которой опущен как начальный, и так и конечный индекс: приращение `-1` переставляет элементы последовательности в обратном порядке.

```python
>>> fruits = ["apple", "pineapple", "pear", "banana"]

>>> fruits[3:1:-1]
['banana', 'pear']

>>> fruits[:1:-1] # началом считается последний элемент
['banana', 'pear']

>>> fruits[:2:-1] # началом считается последний элемент
['banana']

>>> fruits[::-1] # обратный порядок элементов
['banana', 'pear', 'pineapple', 'apple']

>>> fruits[-4:-2:-1] # начальный индекс меньше конечного
[]

>>> fruits[2::-1] # конечным индексом считается 0
['pear', 'pineapple', 'apple']

>>> fruits[2:4:-1] # начальный индекс меньше конечного
[]
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://opu.gitbook.io/101/sprint-1.-bazovye-znaniya-i-osnovy-programmirovaniya/2.-osnovy-python/mekhanizm-srezov.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
