TypeError: 非シーケンスの繰り返し

Rohan Timalsina 2023年6月21日
  1. Python で TypeError: iteration over non-sequence を再作成する
  2. Python で TypeError: iteration over non-sequence を修正するためにリストを反復処理する
  3. __iter__ を使用して、Python の TypeError: iteration over non-sequence エラーを修正する
TypeError: 非シーケンスの繰り返し

Python では、関数または操作が不適切な型のオブジェクトに適用されると、TypeError が発生します。 たとえば、整数オブジェクトと文字列オブジェクトを追加すると、TypeError が返されます。

エラー TypeError: iteration over non-sequence は、反復可能でないオブジェクトを反復しようとすると発生します。 このチュートリアルでは、Python で TypeError: iteration over non-sequence を修正する方法を説明します。

Python で TypeError: iteration over non-sequence を再作成する

TypeError の原因がわかったところで、Python で iteration over non-sequence エラーを再現してみましょう。 Python 2 で次のスクリプトを実行すると、TypeError: iteration over non-sequence が発生します。

class Book:
    def __init__(self, name, author):
        self.name = name
        self.author = author


class Collection:
    def __init__(self):
        self.read = []

    def add_book(self, name, author):
        self.read.append(Book(name, author))


if __name__ == "__main__":
    Books = Collection()
    Books.add_book("Romeo and Juliet", "William Shakespeare")
    Books.add_book("To Kill a Mockingbird", "Harper Lee")
    for book in Books:
        print(book.name)

ここでは、オブジェクト内のリスト read の代わりに、オブジェクト Books を繰り返し処理しようとしています。 その結果、Python 2 で TypeError: iteration over non-sequence が発生します。

出力:

Traceback (most recent call last):
  File "Main.py", line 17, in <module>
    for book in Books:
TypeError: iteration over non-sequence

Python 3 では、次の出力が得られます。

Traceback (most recent call last):
  File "Main.py", line 17, in <module>
    for book in Books:
TypeError: 'Collection' object is not iterable

Python で TypeError: iteration over non-sequence を修正するためにリストを反復処理する

Books はオブジェクトなので、オブジェクト Books 内のリストを反復処理する必要があります。 この場合は for book in Books.read になります。

class Book:
    def __init__(self, name, author):
        self.name = name
        self.author = author


class Collection:
    def __init__(self):
        self.read = []

    def add_book(self, name, author):
        self.read.append(Book(name, author))


if __name__ == "__main__":
    Books = Collection()
    Books.add_book("Romeo and Juliet", "William Shakespeare")
    Books.add_book("To Kill a Mockingbird", "Harper Lee")
    for book in Books.read:
        print(book.name)

出力:

Romeo and Juliet
To Kill a Mockingbird

__iter__ を使用して、Python の TypeError: iteration over non-sequence エラーを修正する

__iter__ メソッドは、コンテナーがイテレーターを必要とする場合に使用されます。 コンテナー内のすべてのオブジェクトを反復処理できる iterator オブジェクトを返す必要があります。

Books は Collection のインスタンスです。 __iter__ メソッドを使用して、オブジェクト Books を反復処理できます。

class Collection:
    def __iter__(self):
        return iter(self.read)

次のブロックには、完全なスクリプトが含まれています。

class Book:
    def __init__(self, name, author):
        self.name = name
        self.author = author


class Collection:
    def __init__(self):
        self.read = []

    def add_book(self, name, author):
        self.read.append(Book(name, author))

    def __iter__(self):
        return iter(self.read)


if __name__ == "__main__":
    Books = Collection()
    Books.add_book("Romeo and Juliet", "William Shakespeare")
    Books.add_book("To Kill a Mockingbird", "Harper Lee")
    for book in Books:
        print(book.name)

出力:

Romeo and Juliet
To Kill a Mockingbird

これが、Python での 非シーケンスの反復 エラーを解決する方法です。 これらのソリューションがお役に立てば幸いです。

著者: Rohan Timalsina
Rohan Timalsina avatar Rohan Timalsina avatar

Rohan is a learner, problem solver, and web developer. He loves to write and share his understanding.

LinkedIn Website

関連記事 - Python TypeError

関連記事 - Python Error