В Python 2 были две отдельные функции:
range() — сразу же генерировала и возвращала полный список в памятиxrange() — возвращала ленивый итератор, генерирующий значения по одному по мере необходимостиВ Python 3 функция xrange() была полностью удалена, а range() переделана так, чтобы работать как старая xrange().
range() в Python 3range() в Python 3 возвращает ленивый объект range — специальный тип последовательности, который не хранит все значения в памяти одновременно. Значения вычисляются только при обращении к ним.
r = range(1_000_000) # Никакой список не создаётся в памяти
Это делает её значительно более экономной по памяти, особенно для больших диапазонов.
Подход range() в Python 2 был расточительным — создание списка из миллиона целых чисел только для того, чтобы один раз пройтись по нему, потребляло лишнюю память. Модель ленивого вычисления из xrange() была предпочтительнее почти всегда, поэтому в Python 3 она стала поведением по умолчанию.
range() в Python 3 поддерживает срезы, индексирование и len(), в отличие от обычного итератораlist(range(10))xrange(), нужно обновить — в Python 3 достаточно просто заменить на range()| Возможность | range() в Python 2 | xrange() в Python 2 | range() в Python 3 |
|---|---|---|---|
| Возвращает | list | итератор | объект range |
| Память | жадное вычисление | ленивое вычисление | ленивое вычисление |
| Существует в Python 3 | ✗ | ✗ | ✓ |
Python 3's range() возвращает ленивый range-объект, который вычисляет значения по требованию, а не хранит все значения в памяти сразу, что функционально эквивалентно Python 2's xrange().
Новый — ещё не проверен сообществом
Вы