SkillPy

Почему range() не включает последнее число в Python

Время чтения8 мин чтения
Опубликовано9 сентября 2026 г.
Легко
Python
Циклы
Синтаксис
Начинающим
Почему range() не включает последнее число в Python

Новички часто удивляются: range(1, 5) в Python даёт 1, 2, 3, 4, а 5 не появляется. Это не баг — верхняя граница range() намеренно не включается. Разберём, почему так задумано и как получить последнее число, если оно нужно.

Коротко

range(a, b) перебирает числа от a до b, не включая b (это называется полуинтервал). Хочешь, чтобы 5 попало в перебор — пиши range(1, 6). Верхнюю границу всегда бери на единицу больше нужного числа.

print(list(range(1, 5)))   # 5 не входит
print(list(range(1, 6)))   # теперь входит
[1, 2, 3, 4]
[1, 2, 3, 4, 5]

Почему так задумано

Полуинтервал (включая начало, исключая конец) выбран не случайно — он даёт три удобных свойства:

  • range(n) даёт ровно n чисел. range(5) — это 0, 1, 2, 3, 4: пять чисел, как и ожидаешь от «пяти повторений».
  • range(len(data)) даёт ровно индексы списка. У списка из 3 элементов индексы 0, 1, 2 — именно их вернёт range(3), без выхода за границу.
  • Диапазоны стыкуются без нахлёста. range(0, 5) и range(5, 10) вместе покрывают 0..9 без пропусков и повторов.

Про сам range(), циклы for и перебор — в гайде Циклы в Python: for, while, break и continue.

Где та же логика встретится снова

Тот же полуинтервал работает в срезах: data[1:5] берёт элементы с индексами 1, 2, 3, 4, но не 5. Стоит один раз понять правило «конец не включается» — и оно закроет сразу и range(), и срезы. Про срезы списков подробно — в гайде Списки в Python: создание, методы и срезы.

Короткие ответы на вопросы

Как включить последнее число в range?

Увеличь верхнюю границу на единицу. Чтобы получить числа до 10 включительно, пиши range(1, 11).

Сколько чисел даёт range(a, b)?

Ровно b - a штук. range(2, 7) даёт 5 чисел: 2, 3, 4, 5, 6. Верхняя граница не входит.

Это правило работает для срезов?

Да. Срез data[a:b] тоже не включает индекс b — та же логика полуинтервала, что и у range().

Кот-наставник

— Правило простое: range(a, b) доходит до b, но само b не берёт. Нужно включить — прибавь единицу к границе.

— И то же самое в срезах. Один раз понял «конец не входит» — и range, и [a:b] перестанут удивлять.

range понятнее, когда пробуешь сам

На SkillPy ты крутишь границы range() руками и сразу видишь, какие числа вошли, а какие нет. AI-наставник подскажет, где полуинтервал сыграл против тебя. Он понимает твой код, а не сверяет с шаблоном.