xrange против itertools.count Python 2.7

Я хочу запустить диапазон от начального до конечного значения. Он отлично работает с маленькими числами, но когда он становится слишком большим, возникает ошибка переполнения, поскольку int слишком велик для преобразования в C Long. Я использую Python 2.7.3.

Я прочитал здесь OverflowError Python int слишком большой для преобразования в C long при использовании метода itertools.count(), за исключением того, что этот метод работает иначе, чем метод xrange, путем пошагового выполнения, а не объявления значения конечного диапазона.

Можно ли настроить itertools.count() на работу как xrange()?

print "Range start value"
start_value = raw_input('> ')
start_value = int(start_value)

print "Range end value"
end_value = raw_input('> ')
end_value = int(end_value)

for i in xrange(start_value, end_value):
    print hex(i)

person Python_newbie    schedule 28.12.2014    source источник
comment
Связано это с предоставлением различных альтернатив xrange() без использования itertools.count(): range и xrange для 13-значных чисел в Python?   -  person Martijn Pieters    schedule 28.12.2014


Ответы (1)


Вы можете использовать itertools.islice(), чтобы положить count конец:

from itertools import count, islice

for i in islice(count(start_value), end_value - start_value):

islice() поднимается StopIteration после повторения end_value - start_value значений.

Поддержка размера шага, отличного от 1, и объединение всего этого в функции:

from itertools import count, islice

def irange(start, stop=None, step=1):
    if stop is None:
        start, stop = 0, start
    length = 0
    if step > 0 and start < stop:
        length = 1 + (stop - 1 - start) // step
    elif step < 0 and start > stop:
        length = 1 + (start - 1 - stop) // -step
    return islice(count(start, step), length)

затем используйте irange(), как если бы вы использовали range() или xrange(), за исключением того, что теперь вы можете использовать Python long целые числа:

>>> import sys
>>> for i in irange(sys.maxint, sys.maxint + 10, 3):
...     print i
... 
9223372036854775807
9223372036854775810
9223372036854775813
9223372036854775816
person Martijn Pieters    schedule 28.12.2014
comment
Это сработало отлично, поэтому кажется, что @Martijn, мне нужно было использовать только часть кода (вокруг islice), и он обрабатывает гораздо большие числа. Единственное, что я вижу на значениях, - это суффикс L, отображаемый в конце каждого значения, но исходя из того, что я могу сказать, он работает должным образом. - person Python_newbie; 28.12.2014
comment
@Python_newbie: В Python long целые числа имеют L добавленное при представлении (repr(value)), чтобы показать, что они являются длинными целыми числами, отличая их от "маленьких" целых чисел. - person Martijn Pieters; 29.12.2014