2013-08-12 14 views
5

を割り当てます。は、変数の範囲(パイソン)

Var1 = range(10, 50) 

次に変数を印刷しよう:

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

それは単に「印刷します範囲内のすべての数字の代わりに範囲(10、50) 'を入力します。どうしてこれなの?

+0

これはPython 3ですか? –

+0

@David Zはい。そうです。 – Justin

答えて

11

ザッツrangeは、それはあなたがやりたいことにするlistに入れてのPython 3の範囲オブジェクトを返すので:

>>> 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] 
>>> 
+0

ありがとう。これは機能します。だから私はあなたが適切に印刷できるようにするためのリストとして数値の範囲を表現しなければならないと思います。 – Justin

+0

はい。 Python 2.xでは、 'range'があなたの望むようなリストを返しました。 3.xでは、範囲オブジェクトを返すようにしました。 – iCodez

-1

これはPython 3.0で変更されたものです。あなたは

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

、そのようにはPython 2.7でこの利点を同様の機能を再作成することができ、リストは、その使用の前に作成する必要がないことです。このように動作します

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

:Pythonの3.Xで

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

我々はループ(999997回のイテレーション)の最後に取得することはありませんならば、それはすべての項目を計算することはありません。 Python 2.7では、最初は範囲全体を構築する必要があります。古いPython実装の中には、これは非常に遅いものでした。

7

おそらく、ボンネットの下で何が起こっているのか分かります。

python 3では、rangeは、あなたが期待していたようなリストではなく、rangeオブジェクトを返します。

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

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

それは何を意味するのでしょうか?(n.b.のpython 3のrangeは2のxrangeパイソンですか)さて、レンジオブジェクトは単にイテレータにすぎません。コンテンツを取得するには反復処理を強制する必要があります。それは新生児に迷惑をかけるかもしれませんが、それは非常に有用であることが判明しています。

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

このようにすることの最大の利点は、一定の(小さな)メモリフットプリントです。この理由から、多くの標準ライブラリのはイテレータを返すだけです。トレードオフは、単ににする場合は、反復範囲であるを参照してください。反復範囲を強制する必要があります。これを行う最も一般的なイディオムはlist(range(n))です。また、理解、forループ、およびより難解な方法があります。イテレータは、Pythonを学ぶ上で非常に重要な部分ですので、慣れてください!