12

range()そしてxrange()10桁の数字のために働きます。しかし、13桁の数字はどうですか?フォーラムには何も見つかりませんでした。

4

9 に答える 9

12

あなたはこれを試すことができます。範囲と同じセマンティクス:

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

于 2010-02-02T20:12:45.760 に答える
6

整数を列挙する必要がある場合は、itertoolsを使用してみてください。

itertools.count(1000000000000)

1000000000000要素のリストにメモリを割り当てるべきではありません

于 2010-02-02T20:11:45.847 に答える
6

10**13 個の要素を必要としない限り、範囲の作成に問題はありません。

range(10**14,10**15,10**14)

与える

[100000000000000, 200000000000000, 300000000000000, 400000000000000, 500000000000000, 600000000000000, 700000000000000, 800000000000000, 900000000000000]
于 2010-02-02T19:53:58.800 に答える
2

64 ビット Python の場合:

>>> xrange(9999999999999)
xrange(9999999999999)

range()13 桁の数字には使用しません。私の貧弱なマシンでは、結果のリストを保持できません。

于 2010-02-02T19:52:07.757 に答える
2

うまくいかないと思います。のような関数lenは、cPython 実装の制限により、結果が 4 バイトの整数に収まることを期待しています。

Python 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

関連する質問については、こちらを参照してください。

于 2010-02-02T19:52:52.403 に答える
1

range(x) はリストを返します。Python リストには多くの要素を含めることはできません。何兆ものサイクルを実行する必要がある場合は、xrange() を使用してこれらの数字を反復処理する必要があります。

于 2010-02-02T20:03:27.687 に答える
1

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

これは完全な解決策ではありません (負のステップは処理しません) が、うまくいくはずです。

于 2010-02-02T20:08:08.833 に答える
0

range()とxrange()の違いは、最初の値はリスト全体を返し、2番目の値は必要に応じて各数値を生成するジェネレーターを返すことです。2つ目は、いくら大きくても、任意の数で機能するはずです。

Python 3.0では、xrange()はなくなり、range()は以前のxrange()と同じように動作します。

于 2010-02-02T20:14:53.373 に答える