3

開始値から終了値までの範囲を実行したい。小さい数値では問題なく動作しますが、大きくなりすぎると、int が大きすぎて C Long に変換できないため、オーバーフロー エラーが発生します。Python 2.7.3 を使用しています。

私はここで、オーバーフローエラーPython int too large to convert to C long on the itertools.count()methodを読んでいますが、そのメソッド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)
4

1 に答える 1

4

あなたは終わり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)

Python整数を使用できるようになったことを除いて、 orを使用するirange()ように使用します。range()xrange()long

>>> import sys
>>> for i in irange(sys.maxint, sys.maxint + 10, 3):
...     print i
... 
9223372036854775807
9223372036854775810
9223372036854775813
9223372036854775816
于 2014-12-28T10:53:20.463 に答える