Range()関数は、括弧内に入力した引数を含むリストを返すと思いました。しかし、IDLEにrange(4)
と入力すると、出力としてrange(0, 4)
が得られます。同様に、print(range(4))
と入力すると、出力としてrange(0, 4)
も取得されます。現在、python3.5を使用しています。
私は現在、次のeBookでpythonを勉強しています:「コンピューター科学者のように考える方法」そしてそのeBookでは、pythonコードを実行できるアクティブなコードブロックを提供します。そこでprint(range(4))
を実行すると、期待したリスト、つまり[0, 1, 2, 3]
が表示されます。
誰かが私にこれを説明できますか?
前もって感謝します!
あなたが読んでいる本はおそらくPython 2を使用しています。ここで range
はリストを返します。
In Python 3、 range
は、代わりに 不変のシーケンスタイプ を返します。
あなたの本はおそらくPython 2.xを使用して書かれました。Python 2.xでは、範囲関数は実際にforループが繰り返すリストを返しました。 Python 3.x、範囲関数はそれ自体の型であり、実際にはジェネレーター関数であるため、forループの実行中にその場で数値が生成されます。
このようにリストに渡すと、範囲関数からリストを作成できます。
list(range(4))
これにより、次の内容のリストが出力されます。
[0,1,2,3]
print(range(10))はrange(0、10)を出力として返します
多くの点で、range()によって返されるオブジェクトは、リストであるかのように動作しますが、実際にはそうではありません。これは、繰り返し処理したときに目的のシーケンスの連続するアイテムを返すオブジェクトですが、実際にはリストを作成しないため、スペースを節約できます。
このようなオブジェクトは反復可能である、つまり、供給がなくなるまで連続するアイテムを取得できるものを期待する関数や構造のターゲットとして適していると言います。 forステートメントはそのようなイテレーターであることがわかりました。関数list()は別のものです。 iterablesからリストを作成します。
list(range(5))は、出力として[0、1、2、3、4]を返します
range(a, b)
はクラスrange
のインスタンスを返します。 print(type(range(1, 5)))
で確認できます。
そして、あなたが期待するものはprint(list(range(a, b)))
によって得ることができます。
this によると:
したがって、Python 3.xでは、range()関数は独自の型を取得しました。基本的に、forループでrange()を使用する場合は、これで問題ありません。 。ただし、純粋にリストオブジェクトとして使用することはできません。たとえば、範囲タイプをスライスすることはできません。
ただし、その上でprint()
を呼び出すと、print
関数は範囲オブジェクトの文字列表現を作成しようとします。この文字列表現は、リストの文字列表現と同等です。
リストが必要な場合は、list(range(<parameters>))
を実行できます。