Elvis, начнем вот с чего: в питоне ранних версий функция range фактически возвращала список. Этот хак был простым, но неоптимальным - список мог долго создаваться и отжирал много памяти. Поэтому во второй питон ввели функцию xrange, создающую элементы по мере необходимости. В третьем питоне было принято решение от имени xrange отказаться, переименовав её в range. И вот тут для совместимости результат вызова range() (это что-то вроде генератора, но не совсем, со своеобразным типом), так вот, результат вызова range() снабдили некоторыми свойствами и методами типа list, в частности магическим методом __contains__, который фактически вызывается оператором in. Много всякой фигни туда напихали, например можно print(range(10)[5]) - бессмысленно, но можно.
Итого, проверка твоим способом создаёт целый объект range и вызывает у него __contains__, что медленно и накладно по сравнению с цепочечным сравнением. А уж если ты учудишь это во втором питоне - тебе можнт прилететь ещё круче.