次のように範囲を変数に割り当てようとするたびに:
Var1 = range(10, 50)
次に、変数を出力してみます。
Var1 = range(10, 50)
print(Var1)
範囲内のすべての数値ではなく、単に「range(10, 50)」を出力します。どうしてこれなの?
次のように範囲を変数に割り当てようとするたびに:
Var1 = range(10, 50)
次に、変数を出力してみます。
Var1 = range(10, 50)
print(Var1)
範囲内のすべての数値ではなく、単に「range(10, 50)」を出力します。どうしてこれなの?
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]
>>>
ボンネットの下で何が起こっているかを少し理解する必要があります。
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 学習の大きな部分を占めるので、慣れてください!
これは 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 実装では、これは非常に低速でした。