range(3) и range(0, 3) эквивалентны. В обоих случаях создается последовательность чисел от 0 до 2 (не включая 3). Второй вариант просто явно указывает начальное значение 0, которое является значением по умолчанию для функции range().
На собеседовании на позицию Python-разработчика, вопрос о различиях между range(3) и range(0, 3) направлен на проверку понимания работы функции range() и ее аргументов по умолчанию.
Фактически, никакой разницы между range(3) и range(0, 3) нет. Обе эти конструкции создают объект range, который представляет последовательность чисел, начинающуюся с 0 и заканчивающуюся непосредственно перед 3.
range() принимает от одного до трех аргументов:
stop (обязательный):  Число, до которого (исключительно) генерируется последовательность.  Если указан только один аргумент, он интерпретируется как stop, а значение start по умолчанию равно 0, а значение step по умолчанию равно 1.start (необязательный): Число, с которого начинается последовательность.  Если не указан, по умолчанию равно 0.step (необязательный): Шаг между числами в последовательности. Если не указан, по умолчанию равен 1.Таким образом, range(3) неявно использует значения по умолчанию для start (0) и step (1), что эквивалентно range(0, 3, 1).  range(0, 3) явно указывает начало последовательности как 0, используя значение по умолчанию для step (1), что также эквивалентно range(0, 3, 1).
В итоге, оба варианта создают одинаковый объект range(0, 3), который при итерации выдаст значения 0, 1 и 2.  Оба выражения идентичны по функциональности и производительности.
Пример:
    
    for i in range(3):
      print(i)  # Выводит: 0, 1, 2
    for i in range(0, 3):
      print(i)  # Выводит: 0, 1, 2
    
  
  Хотя разницы в поведении нет, явное указание start (например, range(0, 3)) может повысить читаемость кода, особенно если это соответствует логике задачи.