1. ホーム
  2. python

[解決済み] Pythonのリストで混乱:イテレータなのかイテレータでないのか?

2023-05-21 12:20:21

質問

私が勉強しているのは Alex MarteliのPython in a Nutshell を勉強しているのですが、この本によると、オブジェクトに next() メソッドを持つオブジェクトは、少なくとも イテレータ . と呼ばれるメソッドを暗黙的あるいは明示的に呼び出すことで、ほとんどのイテレータが構築されることも示唆されています。 iter .

これを本で読んだ後、試してみたい衝動に駆られました。python 2.7.3インタプリタを立ち上げて、こんなことをやってみました。

>>> x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> for number in range(0, 10):
...     print x.next()

しかし、結果はこうなった。

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
AttributeError: 'list' object has no attribute 'next'

混乱する中、xオブジェクトの構造を調べるために dir(x) を使用していることに気がつきました。 __iter__ 関数オブジェクトがあることに気づきました。そこで、そのタイプのインターフェイスをサポートしている限り、イテレータとして使用できることを突き止めました。

そこで、もう一度、今度は少し違った方法で、このようなことを試みると。

>>> _temp_iter = next(x)

こんなエラーが出ました。

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list object is not an iterator

しかし、リストがイテレータでないわけがありません。なぜなら、リストはこのインタフェースをサポートしているように見えますし、次の文脈では確かにイテレータとして使うことができるからです。

>>> for number in x:
...     print x

誰か私の頭の中でこれを明確にするのを助けてくれませんか?

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

それらは 反復可能 であるが、それらは イテレータ . これらは iter() に渡すことで、暗黙のうちに(例えば for を介して)または明示的に、それらのイテレータを取得します。しかし、それ自体はイテレータではありません。