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' がありません
