Что такое range в Python и как он используется в качестве аргумента?
Что проверяют
Знаете ли вы, что range в Python 3 это ленивая неизменяемая последовательность, а не функция и не генератор, и умеете ли применять её там, где она уместна. Для работы с данными важнее второе: индексный цикл по длине обычно признак того, что человек пишет циклами то, что считается пачками.
Как отвечать
range(stop) либо range(start, stop, step): правая граница не входит, шаг может быть отрицательным, аргументы только целые. Объект хранит три числа, поэтому память не зависит от размера диапазона.
Ключевое отличие от генератора: это последовательность. У неё есть длина, индексация и срезы, срез снова даёт range, её можно развернуть и пройти сколько угодно раз. Генератор исчерпывается после первого прохода. Проверка вхождения целого числа считается арифметикой, а не перебором.
Как аргумент range уходит туда, где ждут итерируемое: sum(range(n)), list(range(n)), random.sample(range(n), k), срез датасета по индексам. В инженерии данных чаще всего он нужен для нарезки батчей.
for start in range(0, len(frame), batch_size):
chunk = frame[start:start + batch_size]
process(chunk)Полезно сразу обозначить границу применимости: дробный шаг и векторные диапазоны это numpy.arange или linspace, диапазоны дат строятся своими средствами, а для перебора самих элементов есть прямая итерация, enumerate и zip.
Где спотыкаются
Называют range генератором. Разница проверяется одной строкой: у диапазона можно спросить длину и пройти его дважды, у генератора нельзя. Из той же путаницы растёт ошибка обернуть его в list ради длины.
Пишут цикл по индексам там, где нужна итерация по значениям. Это длиннее, ошибается на границах и в библиотеках для данных отменяет векторизацию: поэлементный цикл по кадру работает на порядки медленнее операции над столбцом.
Ждут дробного шага или передают вещественное число и получают ошибку типа. Рядом живёт тихая версия той же ошибки: при отрицательном шаге начало должно быть больше конца, иначе получается пустая последовательность, цикл не выполняется ни разу и никакой ошибки при этом нет.