Новички часто удивляются: 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-наставник подскажет, где полуинтервал сыграл против тебя. Он понимает твой код, а не сверяет с шаблоном.
