# Глава 13. Диапазоны
Диапазон (`range`) — это неизменяемая последовательность чисел, удобная для прохода по другим коллекциям или их заполнения. Рассмотрим синтаксис использования `range`.
## Создание диапазона
Создать диапазон можно двумя способами:
- Через конструктор `range()`.
- Через получение [среза](/courses/python/chapters/python_chapter_0100#block-slices) от существующего диапазона.
Конструктор `range()` принимает 3 параметра, из которых только `stop` является обязательным:
```python
range(start = 0, stop, step = 1)
```
Все параметры должны быть целыми числами. И каждый из них может быть отрицательным.
- `start` — начальное значение диапазона,
- `stop` — конечное значение **не включительно,**
- `step` — шаг инкремента для получения следующего числа из диапазона.
Так выглядит диапазон для получения ряда 0, 1, 2, 3:
```python
range(4)
```
Эта запись эквивалента вызову `range()` с перечислением всех 3-х аргументов:
```python
range(0, 4, 1)
```
Если желаемое значение аргумента совпадает со значением по умолчанию, то рекомендуется его не указывать.
А это диапазон для получения последовательности 3, 2, 1:
```python
range(3, 0, -1)
```
Вторым способом создания диапазона является взятие среза. При применении **среза** к `range` возвращается новый объект `range`.
```python {.example_for_playground}
r = range(2, 5)
s = r[1:3]
print(s)
```
```
range(3, 5)
```
## Диапазоны и циклы
Наверное, наиболее часто диапазон встречается в контексте итерирования внутри цикла `for`:
```python {.example_for_playground}
for i in range(3):
print(i)
```
```
0
1
2
```
В этом примере счетчик `i` на каждом из витков цикла последовательно принимает значения от 0 до 2.
С помощью диапазона в цикле `for` выведите в консоль только четные значения от 8 до 0 включительно: 8, 6 и т.д. Каждое число должно быть на новой строке. {.task_text}
```python {.task_source #python_chapter_0130_task_0010}
```
Старт диапазона: число 8. Конечное число: 0. Шаг: -2. {.task_hint}
```python {.task_answer}
for i in range(8, -1, -2):
print(i)
```
## Операции над диапазонами
Функции, ожидающие получить объект, по которому можно итерироваться, умеют работать и с диапазонами. К таким функциям относятся конструкторы `list()`, `tuple()` и другие. Строго говоря, диапазон является итерабельным объектом. Итерабельные объекты мы [рассмотрим](/courses/python/chapters/python_chapter_0230/) в одной из следующих глав.
Создайте список из диапазона от 10 до 14 включительно и выведите его на экран. {.task_text}
```python {.task_source #python_chapter_0130_task_0020}
```
Нужно передать в конструктор `list` диапазон. {.task_hint}
```python {.task_answer}
print(list(range(10, 15)))
```
К диапазонам, как и к другим последовательностям из стандартной библиотеки, применимы операции:
- Проверка вхождения элемента в диапазон: `x in range(8, -1, 2)`.
- Обращение к элементу диапазона по индексу: `range(8, -1, -2)[1]`.
- Взятие среза: `range(10)[1:2]`.
- Сравнение диапазонов через `==` и `!=`. Причем сравниваются именно элементы диапазона, а не параметры конструктора. Потому что два диапазона, созданные с помощью разных аргументов, могут содержать одинаковые элементы.
Что выведет этот код? {.task_text}
```python {.example_for_playground}
r_eq = range(1, 4, 2) == range(1, 5, 2)
print(r_eq)
```
```consoleoutput {.task_source #python_chapter_0130_task_0030}
```
Первый диапазон возвращает элементы от 1 до 4 не включительно с шагом 2, то есть 1, 3. Второй диапазон возвращает элементы от 1 до 5 не включительно с шагом 2: 1, 3. Эти последовательности равны между собой, поэтому вывод равен `True`. {.task_hint}
```python {.task_answer}
True
```
## Особенности реализации
У диапазона есть важное **преимущество** перед [списками](/courses/python/chapters/python_chapter_0110/) и [кортежами:](/courses/python/chapters/python_chapter_0120/) он занимает в памяти небольшое фиксированное пространство. Его размер не зависит от количества чисел, входящих в диапазон. Размер списка или кортежа, напротив, растет с ростом количества элементов.
Дело в том, что диапазон хранит только значения для `start`, `stop`, `step`, а очередное значение вычисляет по необходимости (например, при переходе на следующий шаг цикла).
## Резюмируем
- Тип `range` (диапазон) — неизменяемая последовательность чисел. Фактически это арифметическая прогрессия целых чисел.
- Чаще всего диапазоны используются в связке с циклом `for`, а также для заполнения и итерации по коллекции.
- `range` занимает в памяти существенно меньше места, чем `list` или `tuple`.
- К `range` применимы такие операции как проверка элемента на вхождение, обращение по индексу, взятие среза, сравнение диапазонов между собой.
Наша группа в telegram. Здесь можно задавать вопросы и общаться.
Задонатить. Если вам нравится курс, вы можете поддержать развитие площадки!