1. ホーム
  2. python

[解決済み] Python 3.3でrange()がジェネレータなら、なぜnext()をレンジで呼べないのですか?

2022-11-16 08:49:46

質問

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

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

はこのようなエラーを出します。

TypeError: 'range' object is not an iterator

私はここで何を見逃しているのでしょうか? 私はこれが0を表示し、次の値に進んで myrange . 私はPythonに新しいので、かなり基本的な質問で申し訳ありませんが、私はどこにも良い説明を見つけることができませんでした。

どのように解決するのですか?

range は、イミュータブルな反復処理可能オブジェクトのクラスです。その反復動作は list と比較できます。 next を直接呼び出すことはできません。 iter .

だからダメなんだよ。 range はジェネレータではありません。

なぜ直接反復可能なものにしなかったのだろう?そうですね。 range には、その方法では不可能ないくつかの便利な特性があります。

  • 不変であるため、辞書のキーとして使用することができます。
  • これらは start , stopstep 属性があります (Python 3.3 以降)。 countindex メソッドがあり、それらは in , len__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