Справочник по Python · модуль 3 · списки и циклы
Глава 3.4
Функция range()
range() задаёт последовательность целых чисел. Начало включается, правая граница не включается, а шаг определяет направление и расстояние между соседними значениями.
- Категория
- Числовые диапазоны
- Уровень
- Начальный
- Связанные темы
- for, целые числа, индексы
- Зачем это знать
- Управлять количеством повторений и шагом цикла
§1Что создаёт range()
range() создаёт объект диапазона целых чисел. Чаще всего этот объект передают циклу for, чтобы выполнить действие для каждого числа.
range(start, stop, step)
start— первое значение диапазона, оно включается;stop— граница, при достижении которой диапазон заканчивается, она не включается;step— величина изменения, по умолчанию равна1.
§2Граница stop не включается
Главное правило range(): значение stop не попадает в диапазон. Поэтому range(2, 6) заканчивается числом 5.
range(2, 6) → 2, 3, 4, 5 start ┘ └ stop
При шаге 1 правую границу часто записывают как n + 1. Например, числа от 1 до 5 задаются выражением range(1, 6).
§3Форма range(stop)
Если передан один аргумент, start считается равным 0, а шаг — 1.
for number in range(5): print(number)
0 1 2 3 4
Количество значений равно 5, но последнее значение равно 4, потому что отсчёт начался с нуля.
§4Форма range(start, stop)
Два аргумента позволяют задать первое значение и невключаемую правую границу.
for number in range(2, 6): print(number)
2 3 4 5
§5Форма range(start, stop, step)
Третий аргумент задаёт шаг. После каждого значения к нему прибавляется step.
for number in range(0, 10, 2): print(number)
0 2 4 6 8
Последнее значение не обязано быть на единицу меньше stop. Диапазон заканчивается перед первым значением, которое достигло бы границы или перешло через неё.
§6Обратный диапазон
Для движения вниз нужен отрицательный шаг. При шаге -1 каждое следующее значение уменьшается на единицу.
for number in range(5, 0, -1): print(number)
5 4 3 2 1
§7Направление шага
Знак шага должен вести от start к stop. Иначе диапазон окажется пустым, и тело цикла не выполнится.
| Диапазон | Результат | Почему |
|---|---|---|
range(1, 5, 1) | 1, 2, 3, 4 | положительный шаг ведёт к большей границе |
range(5, 1, -1) | 5, 4, 3, 2 | отрицательный шаг ведёт к меньшей границе |
range(1, 5, -1) | пусто | отрицательный шаг уводит от границы |
range(5, 1, 1) | пусто | положительный шаг уводит от границы |
§8range — не готовый список
Объект range хранит правила диапазона, а не создаёт заранее обычный список со всеми числами.
print(range(5)) print(list(range(5)))
range(0, 5) [0, 1, 2, 3, 4]
Для цикла преобразование в список не требуется: for умеет перебирать объект range напрямую.
§9Перебор индексов
Если нужен номер позиции, можно создать диапазон от нуля до длины списка.
numbers = [10, 20, 30] for index in range(len(numbers)): print(index, numbers[index])
0 10 1 20 2 30
Если индекс не используется, проще перебирать сами элементы: for number in numbers. Специальный способ одновременно получать индекс и значение будет рассмотрен вместе с коллекциями.
§10Частые ошибки
| Что написано | Что произойдёт | Как правильно |
|---|---|---|
range(1, 5) для чисел от 1 до 5 | число 5 не войдёт | range(1, 6) |
range(5, 0) для обратного отсчёта | получится пустой диапазон | range(5, 0, -1) |
range(0, 10, 0) | ValueError: шаг не может быть нулём | указать положительный или отрицательный шаг |
range(0, 5, 0.5) | TypeError: range() работает с целыми числами | использовать целочисленные аргументы |
print(range(5)) и ожидание пяти строк | выведется представление объекта range(0, 5) | перебрать диапазон или преобразовать его в список |
range(len(numbers) + 1) | последний индекс выйдет за границы списка | range(len(numbers)) |
§11Проверьте себя
Какие значения создаёт range(3, 8)?
3, 4, 5, 6, 7. Значение 8 является границей и не включается.
Почему range(5, 0) пуст?
Шаг по умолчанию равен 1 и ведёт вверх, а от 5 к 0 нужно двигаться вниз с отрицательным шагом.
Нужно ли писать list(range(100)) перед циклом?
Нет. Цикл for умеет работать с объектом range напрямую.
§12Шпаргалка
range(stop)range(start, stop)range(start, stop, step)range(5, 0, -1)Итог главы
range() задаёт последовательность целых чисел. start включается, stop не включается, а step задаёт величину и направление изменения. Для обратного диапазона нужен отрицательный шаг.