Python: разница между range и xrange
В программировании на Python у нас есть две функции range() и xrange(), которые генерируют целые числа из заданного начального и конечного значений. Здесь мы обсуждаем основные различия между функциями xrange и range.
Что такое range и xrange?
В Python 2.x у нас было два основных метода для генерации списка целых чисел в заданном диапазоне.
- range()
- xrange ()
Однако в Python 3 xrange() переименован в range().
Следовательно, в Python 3 мы получаем единственную функцию, которая может производить числа из заданного диапазона.
Функция range() в python 3.x — это просто повторная реализация xrange() в python 2.x и она на самом деле работает так же, как xrange.
Если вы используете Python 2.x, тогда разница между xrange() и range () значима для вас.
В чем же была разница в Python 2.x
Две функции диапазона имеют много разных черт. Они могут относиться к производительности, потреблению памяти, скорости и внутреннему дизайну. Каждый из них имеет свою реализацию. Теперь давайте рассмотрим каждое из этих отличий по одному.
Операционная разница
В большинстве случаев и xrange, и range работают одинаково. Они оба дают возможность составить список чисел.
Следовательно, мы можем сказать, что оба схожи с точки зрения функциональности. Давайте сейчас посмотрим несколько примеров:
Выражение range(1, 7, 2) даст результат [1, 3, 5], а xrange(1, 7, 2) — [1, 3, 5]. Следовательно, вы можете сделать вывод, что они имеют сходную схему исполнения и выходные данные.
Возвращаемые значения и тип
Это основной источник различий между функциями xrange и range.
Range() возвращает объект типа list. Например, выражение range(1, 100, 1) создаст диапазон чисел от 0 до 99 и вернет все цифры за один раз.
С другой стороны, xrange() предоставляет результаты в виде объекта xrange. Он выполняет ленивую оценку. Он сохраняет аргументы и возвращает числа по запросу. В отличие от range(), он позволяет избежать получения всех чисел за один раз.
Объект xrange допускает итерацию, индексацию и метод len(). Вы можете использовать его в цикле for, чтобы обойти и получать числа в каждой итерации.
Python xrange vs. range — кто быстрее?
У нас есть модуль timeit в Python для захвата времени выполнения любой функции. Мы будем использовать его в нашем тесте и посмотрим, какой из них быстрее.
Мы выполнили range() в нашем тесте три раза, в пример ниже приведен результат и время, которое потребовалось для выполнения:
Мы снова провели один и тот же тест с xrange() три раза и записали время их выполнения.
Из приведенных выше тестов и результатов вы можете оценить, что xrange быстрее, чем стандартная функция диапазона.
- При использовании xrange вы могли заметить, что он не создает статический список, как функция range(). Вместо этого он больше похож на генератор, который выдает значения по запросу.
- Функция range() получает все числа сразу перед выполнением любой инструкции в цикле.
Вот некоторые факты для вашей справки:
- Основная проблема со стандартной функцией range() заключается в том, что она потребляет значительный объем памяти, особенно для большего диапазона чисел.
- Функция xrange() всегда предоставляет следующий элемент по запросу. Это означает, что в памяти одновременно существует только один элемент. Следовательно, он потребляет меньше памяти.
Что предпочесть range или xrange?
Это компромисс между мгновенным результатом и сегментированным выходом. С помощью xrange мы получаем более быстрый ответ; Кроме того, он потребляет меньше памяти.
Следовательно, очевидно, что Python xrange имеет преимущество над традиционной функцией range(). Давайте теперь посмотрим на некоторые случаи, чтобы понять, какой из этих методов подходит и где.
Где предпочтительно использовать xrange()?
- Когда диапазон имеет более широкий охват, мы рекомендуем использовать xrange(). Это улучшит скорость и потребует меньше памяти.
- Если вы планируете работать на маломощных устройствах (которые имеют ограничения памяти), тогда с xrange() вы можете не увидеть проблем с буфером.
Где предпочтительно использовать range()?
- Когда вам приходится часто просматривать список, лучше использовать range(). С xrange() было бы непросто создать экземпляр целочисленного объекта для каждого запроса на индексирование.
- Если вы используете небольшой диапазон, то использование функции range() — правильная идея.
- Так как метод range возвращает объект списка, вы можете использовать все его функции. Напротив, xrange предоставляет голый целочисленный объект, который требует индексации.
- Интересно, что если вы хотите, чтобы ваш код Python 2.x был совместим с версией 3.x, вам также следует использовать метод range.
Совместимость Между Python И Xrange
В Python 3.x функция xrange не существует, тогда как она предоставляет функцию range(). Реальность такова, что название «xrange» изменилось на «range» в Python 3.x.
Таким образом, если вы выполните вызов xrange() в Python 3.x, это вызовет приведенную ниже ошибку.
Кроме того, если вы решите импортировать xrange, даже тогда произойдет следующая ошибка.
Следовательно, вы можете решить использовать range() вместо xrange() для обеспечения совместимости между различными версиями.
Функции Range() и Xrange() в Python – в чем разница?
В этой статье мы обсудим, что такое функции range() и xrange() в Python, как они используются в Python и каковы основные особенности каждой из них и отличия.
Функции, доступные в Python, можно использовать в нескольких частях нашей программы, поскольку они уменьшают размер кода и повышают удобочитаемость кода.
Во-первых, мы рассмотрим, что такое функция range, и обсудим программы, в которых она используется. Затем мы узнаем, что такое функция xrange, и разберемся в ней с помощью некоторых программ. Наконец, мы рассмотрим особенности каждой из них.
Функция range()
Мы напечатаем первые 7 чисел, начиная с 0 до 6. Укажем значение в функции диапазона для этого же и поставим пробел в конце параметра, чтобы значения печатались с ним.
Следующая программа это проиллюстрирует.
![]()
Во втором примере мы снова сделаем то же самое, то есть напечатаем первые 7 чисел, начиная с 0 до 6. Мы указали значение в функции диапазона для этого же и предоставили пробел в конечном параметре, чтобы он печатает значения с пробелом.
После этого мы также проверим, какой тип он возвращает.
Следующая программа иллюстрирует то же самое:
![]()
В следующем примере мы определили список, содержащий 10 элементов. Мы указали значение как длину нашего списка ‘a’ в функции диапазона и предоставили пробел в конечном параметре.
![]()
В следующем примере мы напечатаем значения в обратном порядке, лежащем в диапазоне от 0 до 10, и укажем значение в функции диапазона в формате начала, остановки и конца. Давайте посмотрим на каждое из обозначений:
- start – значение, с которого мы хотели бы начать отображение элементов;
- stop – значение, на котором мы хотели бы прекратить отображение элементов;
- step – значение шага относится к значению, которое указывает тип последовательности, которую мы ожидаем в наших результатах. По умолчанию значение шага равно 0.

В следующем примере мы напечатаем числа от 21 до 31, но на этот раз используя обратный метод Python. Укажем значение в функции диапазона и предоставим пробел в конечном параметре, чтобы он печатал значения с пробелом.
![]()
Функция Xrange()
Функция xrange() имеет ту же цель и возвращает объект-генератор, но использовалась в версиях, предшествующих Python 3.
Синтаксис xrange такой же, как и range(), что означает, что в xrange мы также должны указать начало, остановку и шаг.
Если вы используете Python 3 и выполняете программу с использованием xrange, она выдаст ошибку, поскольку в этой версии и позже используется range().
Давайте посмотрим, что произойдет, когда мы запустим следующую программу на Python.

Сравнение Range() и Xrange()
Здесь мы сравним обе функции на основе потребления памяти, типа возвращаемого значения, скорости и операций.
Описание функции range с примерами для Python 3
Если вы опытный разработчик, или даже новичок, вы, несомненно, слышали о функции Python range() . Но что же она делает? В двух словах, она генерирует список чисел, который обычно используется для работы с циклом for . Существует много вариантов использования. Зачастую, ее используют, когда нужно выполнить действие X раз, где вы можете использовать индекс. В других случаях вам, возможно, понадобится сделать итерацию по списку (или по другому итерируемому объекту), имея доступ к индексу.
Функция range() имеет небольшие отличия в работе на версии Python 2.x и 3.x , тем не менее у них остается одинаковая концепция. К этому вопросу мы доберемся немного позже.
Параметры range: star, stop, шаг
Функция range() принимает три параметра, например:
- stop: количество целых чисел для генерации, начиная с нуля. Например, range(3) == [0, 1, 2] .
- start: число начала последовательности.
- stop: генерирует число до данного числа, но не включая его.
- step: разница между каждым числом из последовательности.
- Все параметры должны быть целыми числами.
- Каждый из параметров может быть положительным или отрицательным.
- range() (и Python в целом) основана на индексе 0, означая, что список индексов начинается с 0, а не 1, например. Синтаксис, предоставляющий доступ к первому элементу в списке — mylist[0] . Поэтому, последнее целое число, сгенерированное функцией range() зависит от stop , но не будет включать его. Например, range(0, 5) генерирует целые числа 0, 1, 2, 3, 4, но не включая 5.
Примеры функции range()
Простое применение с циклом for:
А это пример итерации по списку.
В качестве параметра stop мы передали длину списка (5).
Range полезна в итерации с условиями. Рассмотрим примере песни “99 Bottles of Beer on the Wall…” со следующим кодом:
Мы получаем следующий результат:
Прекрасно! Наконец-то вы видите настоящую силу Python. Если вы еще немного в замешательстве, рекомендую прочитать статью 99 бутылок пива (Википедия).
range против функций xrange в python
Вы должно быть слышали о функции, известной как xrange() . Эта функция представлена в Python 2.x, и была переименована в range() в Python 3.x. Так в чем же разница? В Python 2.x range() создавала список, а xrange() возвращала итератор — объект последовательности. Мы можем увидеть это в следующем примере:
В Python 3.x. у функции range() есть свой собственный тип. Говоря языком простых терминов, если вы хотите воспользоваться range() в цикле for , вы сделаете это с легкостью. Однако вы не можете использовать его как объект списка. Например, вы не можете разбить на срезы тип range .
Когда вы используете итератор, каждый цикл оператора for выдает мгновенно последующий номер на лету. В то время как исходная функция range() производит все числа мгновенно, прежде чем цикл for начнет выполняться.
Проблема с исходной функцией range() (в Python 2.x) заключалась в том, что она требовала очень большой объем памяти при создании большого количества чисел. Однако в нем, как правило, можно работать быстрее с небольшим количеством чисел.
Обратите внимание, что в Python 3.x вы все равно можете создать список, передав генератор, возвращенный функции list() . Следующим образом: