Главная / Курсы / Python / Глава 13. Диапазоны
# Глава 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 r = range(2, 5) s = r[1:3] print(s) ``` ``` range(3, 5) ``` ## Диапазоны и циклы Наверное, наиболее часто диапазон встречается в контексте итерирования внутри цикла `for`: ```python 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 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` применимы такие операции как проверка элемента на вхождение, обращение по индексу, взятие среза, сравнение диапазонов между собой.
Отправка...

Если вам нравится проект, вы можете поддержать его!

Задонатить