Модуль 3 · Списки и циклы

Справочник по Python · модуль 3 · списки и циклы

Глава 3.4

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
Чтобы включить число n

При шаге 1 правую границу часто записывают как n + 1. Например, числа от 1 до 5 задаются выражением range(1, 6).

§3Форма range(stop)

Если передан один аргумент, start считается равным 0, а шаг — 1.

main.pyпять значений
for number in range(5):
    print(number)
Выводот 0 до 4
0
1
2
3
4

Количество значений равно 5, но последнее значение равно 4, потому что отсчёт начался с нуля.

§4Форма range(start, stop)

Два аргумента позволяют задать первое значение и невключаемую правую границу.

main.pyот 2 до 5
for number in range(2, 6):
    print(number)
Вывод6 не включается
2
3
4
5

§5Форма range(start, stop, step)

Третий аргумент задаёт шаг. После каждого значения к нему прибавляется step.

main.pyчётные числа меньше 10
for number in range(0, 10, 2):
    print(number)
Выводшаг равен 2
0
2
4
6
8

Последнее значение не обязано быть на единицу меньше stop. Диапазон заканчивается перед первым значением, которое достигло бы границы или перешло через неё.

§6Обратный диапазон

Для движения вниз нужен отрицательный шаг. При шаге -1 каждое следующее значение уменьшается на единицу.

main.pyобратный отсчёт
for number in range(5, 0, -1):
    print(number)
Вывод0 не включается
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 хранит правила диапазона, а не создаёт заранее обычный список со всеми числами.

main.pyобъект и список
print(range(5))
print(list(range(5)))
Выводдва представления
range(0, 5)
[0, 1, 2, 3, 4]

Для цикла преобразование в список не требуется: for умеет перебирать объект range напрямую.

§9Перебор индексов

Если нужен номер позиции, можно создать диапазон от нуля до длины списка.

main.pyиндекс и элемент
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 задаёт величину и направление изменения. Для обратного диапазона нужен отрицательный шаг.

Глава 3.4 · Функция range() · Справочник по Python Автор: Макаров Максим Николаевич