сломался range (python)
я шарпист, который периодически использует питоном, например для форматирования текста... Тут вдруг такая ситуация, что питон (даже после переустановки) теперь считает range за класс, при этом не возвращая мне мой массив... Почему? Тута консоль
Python 3.9.1 (tags/v3.9.1:1e5d33e, Dec 7 2020, 17:08:21) [MSC v.1927 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> range(100,0,-1)
range(100, 0, -1)
>>> type(range(100))
<class 'range'>
Ответы (3 шт):
Потому что в версии 3.x. это и есть объект. Чтобы получить список, нужно:
list(range(10))
Начиная с python 3.0 часть функций, что раньше возвращали массив теперь возвращают объект итератор, а именно функции:
У любого итератора можно получить текущий элемент и перейти к следующему элементу, соответственно по итераторам можно проходиться через for цикл или применять тот же filter
Итераторы можно легко и быстро преобразовать в список с помощью конструктора списка: list(iterable)
Ещё можно пояснить - а зачем это было сделано? Для экономии. Готовый список может занимать много места в памяти. А если мы перебираем range по одному элементу, нам не нужно держать в памяти больше чем один элемент. Итератор нам позволяет такое сделать. Ну и, кроме того, мы можем проверять вхождение элемента в range также не расходуя память.
print(1_000_000_000_000 in range(1_000_000_000_000_000_000))
# True
Такая проверка просто исчерпала бы оперативную память в Python 2, а если бы и не исчерпала, то длилась бесконечно долго. В Python 3 она выполняется моментально и не занимает памяти больше, чем нужно для хранения специального объекта range, определяющегося всего тремя числами: нижней границей, верхней границей и шагом.