range()
и xrange()
работают для 10-значных чисел. А как насчет 13-значных чисел? на форуме ничего не нашел.
диапазон и xrange для 13-значных чисел в Python?
Ответы (9)
Вы можете попробовать это. Та же семантика, что и у диапазона:
import operator
def lrange(num1, num2 = None, step = 1):
op = operator.__lt__
if num2 is None:
num1, num2 = 0, num1
if num2 < num1:
if step > 0:
num1 = num2
op = operator.__gt__
elif step < 0:
num1 = num2
while op(num1, num2):
yield num1
num1 += step
>>> list(lrange(138264128374162347812634134, 138264128374162347812634140))
[138264128374162347812634134L, 138264128374162347812634135L, 138264128374162347812634136L, 138264128374162347812634137L, 138264128374162347812634138L, 138264128374162347812634139L]
Другим решением может быть использование itertools.islice
, как это предлагается в документации от xrange
.
Нет проблем с созданием диапазона, если вам не нужны 10 ** 13 элементов, например.
range(10**14,10**15,10**14)
дает
[100000000000000, 200000000000000, 300000000000000, 400000000000000, 500000000000000, 600000000000000, 700000000000000, 800000000000000, 900000000000000]
если вам нужно перечислить целое число, попробуйте использовать itertools:
itertools.count(1000000000000)
он не должен выделять память для списка из 1000000000000
элементов
Я не думаю, что это сработает. Такие функции, как len
, ожидают, что результат уместится в 4-байтовое целое из-за ограничений в реализации cPython.
В Питоне 3.0:
>>> range(9999999999999)
range(0, 9999999999999)
Вроде работает, но...
>>> len(range(9999999999999))
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
len(range(9999999999999))
OverflowError: Python int too large to convert to C ssize_t
См. здесь связанный вопрос.
На 64-битном Python:
>>> xrange(9999999999999)
xrange(9999999999999)
Я бы не стал использовать range()
для 13-значного числа. Моя бедная машина не смогла бы удержать полученный список.
OverflowError
в 2.6.2.
- person MAK; 02.02.2010
range(x) возвращает список. Списки Python не могут содержать столько элементов. Вы должны использовать xrange() для перебора этих цифр, если вам нужно выполнить триллионы циклов.?
range() и xrange() работают в достаточно последних версиях Python; однако в версии 2.5 или младше вам нужно будет обойти преобразование int в long.
def irange(start, stop=None, step=1):
if stop is None:
stop = long(start)
num = 1L
else:
stop = long(stop)
num = long(start)
step = long(step)
while num < stop:
yield num
num += step
Это не полное решение (оно не обрабатывает отрицательные шаги), но оно должно помочь вам.
Разница между range() и xrange() заключается в том, что первый возвращает весь список, а второй возвращает генератор, который генерирует каждое число по мере необходимости. Второй должен работать для любого числа, независимо от того, насколько оно велико.
В Python 3.0 функция xrange() исчезла, а функция range() ведет себя так же, как раньше.
xrange
(в Python 2.7) также не поддерживает long
целых чисел. Например: выражение xrange(sys.maxint, sys.maxint+10)
вызывает OverflowError: Python int too large to convert to C long
- person typeracer; 01.07.2020
Для решения этой задачи вам не нужны такие длинные числа, потому что вам нужны только простые множители, вы можете использовать квадратный корень:
for i in xrange(2, int((n+1)**0.5)):