107

ウェブ上の誤った情報の犠牲になったのかもしれませんが、何かを誤解した可能性が高いと思います。私がこれまでに学んだことに基づいて、range()はジェネレーターであり、ジェネレーターはイテレーターとして使用できます。ただし、このコード:

myrange = range(10)
print(next(myrange))

私にこのエラーを与えます:

TypeError: 'range' object is not an iterator

ここで何が欠けていますか?これが0を出力し、の次の値に進むことを期待していましたmyrange。私はPythonを初めて使用するので、かなり基本的な質問について謝罪しますが、他の場所で適切な説明を見つけることができませんでした。

4

1 に答える 1

135

range不変の反復可能なオブジェクトのクラスです。それらの反復動作はsと比較できます。それらを直接list呼び出すことはできません。nextを使用してイテレータを取得する必要がありますiter

いいえ、rangeジェネレータではありません。

「なぜ彼らはそれを直接反復可能にしなかったのか」とあなたは考えているかもしれませんか?そうですね、rangesには、その方法では不可能ないくつかの便利なプロパティがあります。

  • それらは不変であるため、辞書のキーとして使用できます。
  • それらにはstart、、属性(Python 3.3以降)、stopおよびメソッドがあり、、、および操作をサポートします。stepcountindexinlen__getitem__
  • range同じことを複数回繰り返すことができます。

>>> myrange = range(1, 21, 2)
>>> myrange.start
1
>>> myrange.step
2
>>> myrange.index(17)
8
>>> myrange.index(18)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: 18 is not in range
>>> it = iter(myrange)
>>> it
<range_iterator object at 0x7f504a9be960>
>>> next(it)
1
>>> next(it)
3
>>> next(it)
5
于 2012-10-26T18:21:23.453 に答える