TypeError: 非シーケンスの繰り返し
-
Python で
TypeError: iteration over non-sequence
を再作成する -
Python で
TypeError: iteration over non-sequence
を修正するためにリストを反復処理する -
__iter__
を使用して、Python のTypeError: iteration over non-sequence
エラーを修正する
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 での 非シーケンスの反復
エラーを解決する方法です。 これらのソリューションがお役に立てば幸いです。
関連記事 - Python TypeError
- Python TypeError: List Indices Must Be Integers, Not List を修正する
- Python TypeError: Unhashable タイプ: リスト
- Python TypeError: 必要な位置引数が 1つありません
- TypeError を解決する: Python での文字列の書式設定中にすべての引数が変換されるわけではありません
- TypeError を解決する: Python では整数が必要です
- TypeError: STR ではなく、実数でなければなりません
関連記事 - Python Error
- AttributeError の解決: 'list' オブジェクト属性 'append' は読み取り専用です
- AttributeError の解決: Python で 'Nonetype' オブジェクトに属性 'Group' がありません
- AttributeError: 'generator' オブジェクトに Python の 'next' 属性がありません
- AttributeError: 'numpy.ndarray' オブジェクトに Python の 'Append' 属性がありません
- AttributeError: Int オブジェクトに属性がありません
- AttributeError: Python で 'Dict' オブジェクトに属性 'Append' がありません