7

次のように範囲を変数に割り当てようとするたびに:

Var1 = range(10, 50)

次に、変数を出力してみます。

Var1 = range(10, 50)
print(Var1)

範囲内のすべての数値ではなく、単に「range(10, 50)」を出力します。どうしてこれなの?

4

3 に答える 3

18

rangeこれは、Python 3 で範囲オブジェクトを返すためです。それを入れて、list必要な動作をさせます。

>>> Var1 = range(10, 50)
>>> print(list(Var1))
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,  
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49]
>>>
于 2013-08-12T00:03:21.217 に答える
11

ボンネットの下で何が起こっているかを少し理解する必要があります。

Python 3 では、期待していたようなリストではなく、オブジェクトをrange返します。range(nb python 3rangeは python 2 ですxrange)

#python 2
>>> type(range(5))
<type 'list'>

#python 3
>>> type(range(5))
<class 'range'>

どういう意味ですか?範囲オブジェクトは単純なイテレータです。その内容を取得するには、強制的に反復する必要があります。新生児にとっては煩わしく聞こえるかもしれませんが、非常に便利です。

>>> import sys
>>> sys.getsizeof(range(5))
24
>>> sys.getsizeof(range(1000000))
24

この方法の最大の利点は、一定の (小さい) メモリ フットプリントです。このため、標準ライブラリの多くは単純にイテレータを返します。トレードオフは、単純に反復範囲をたい場合は、強制的に反復する必要があることです。これを行う最も一般的なイディオムはlist(range(n)). 内包表記、forループ、およびより難解なメソッドもあります。イテレータは Python 学習の大きな部分を占めるので、慣れてください!

于 2013-08-12T00:28:08.653 に答える
-1

これは Python 3.0 で変更されたものです。次のように、Python 2.7 で同様の関数を再作成できます。

def range(low, high=None):
  if high == None:
    low, high = 0, low
  i = low
  while i < high:
    yield i
    i += 1

この利点は、使用する前にリストを作成する必要がないことです。

for i in range(1,999999):
  text = raw_input("{}: ".format(i))
  print "You said {}".format(text)

これは次のように機能します:

1: something
You said something
2: something else
You said something else
3: another thing
You said another thing

Python 3.X では、ループの最後 (999997 回の反復) に到達しない場合、すべての項目が計算されることはありません。Python 2.7 では、最初に範囲全体を構築する必要があります。一部の古い Python 実装では、これは非常に低速でした。

于 2013-08-12T00:16:51.747 に答える