1. ホーム
  2. パイソン

Python3 reports TypeError: '***' object is not iterable.

2022-02-08 22:29:08

まず、エラーメッセージの "TypeError: '***' object is not iterable" を見てください。

まず、イテレーションとは何かを理解する。

イテレータ

イテレーションはPythonの最も強力な機能の1つであり、コレクション要素にアクセスする方法である。

イテレータは、探索の位置を記憶するオブジェクトです。

イテレータオブジェクトは、コレクションの最初の要素から、すべての要素にアクセスするまでアクセスされます。イテレータは前方にしか進めず、後方には進めません。

イテレータには、基本的に2つのメソッドがあります。 iter()  と  next() .

文字列、リスト、タプルオブジェクトは、イテレータを作成するために使用することができます。

一例として

>>> a = [1,2,3,4,5,6]
>>> it = iter(a) # Create iterative object
>>> print(next(it)) # Output the next element of the iterator
1
>>> print(next(it)) # Next element of iterator
2
>>> print(next(it)) # next element of iterator
3

>>> a = [1,2,3,4,5,6]
>>> it = iter(a) # Create iterative object
>>> for i in it: # Iterator objects can be traversed using the regular for statement.
...     print(i,end=" ") # end Output to the same line
...
1 2 3 4 5 6

イテレータを作成する

クラスをイテレータとして使用するには、クラス内に __iter__() と __next__() の2つのメソッドを実装する必要があります。

オブジェクト指向プログラミングについて既にご存知の方は、クラスにはコンストラクタがあることをご存知だと思いますが、Pythonのコンストラクタは__init__()で、オブジェクトが初期化されるときに実行されるものです。

iter__() メソッドは、__next__() メソッドを実装した特別なイテレータオブジェクトを返し、StopIteration 例外で反復処理の完了をマークします。

__next__() メソッド (Python 2 では next()) は、次のイテレータオブジェクトを返します。

1から始まり1ずつ増加する数値を返すイテレータを作成します。

例として

class My: # class Define an object
    def __iter__(self):
        self.a = 1
        return self

    def __next__(self):
        x = self.a
        self.a += 1
        return x

ass = My()
myiter = iter(ass)

for i in range(5):
    print(next(myiter))

# The above code runs as follows.
1
2
3
4
5

ということになる。

上で報告されたエラーは、定義した型のエラーである必要があります。ステートメントの内容を確認し、特に iter()とnext()です。