Оригінальна публікація: Int Object is Not Iterable – Python Error [Solved]

Якщо ви запускаєте свій код на Python та бачите помилку «TypeError: 'int' object is not iterable», це означає, що ви намагаєтесь виконати цикл на цілому числі або іншому типі даних, з якими не працює цикл.

Ітерабельними у Python є списки, кортежі, набори, словники тощо.

Крім того, помилка «TypeError» означає, що ви намагаєтеся виконати операцію з невідповідним типом даних. Наприклад, додаєте рядок з цілим числом.

Сьогодні останній раз, коли ви отримаєте таку помилку. У цій публікації я покажу не тільки її розв’язок, але й перевірку магічних методів __iter__, щоб ви могли перевірити об’єкт на ітерабельність.

Що робити з Int Object is Not Iterable

Якщо ви спробуєте виконати цикл на цілому числі, то отримаєте помилку:

count = 14

for i in count:
    print(i)
# Вивід: TypeError: 'int' object is not iterable

Один зі способів виправити це — передати змінну до функції range().

Функція range у Python перевіряє передану змінну та повертає перелік чисел, починаючи з 0 та закінчуючи вказаним числом.

Тепер цикл спрацює:

count = 14

for i in range(count):
    print(i)
    
# Вивід: 0
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9
# 10
# 11
# 12
# 13

Ще один приклад з таким самим розв’язком:

age = int(input("Введіть свій вік: "))

for num in range(age):
    print(num)

# Вивід: 
# Введіть свій вік: 6
# 0
# 1
# 2
# 3
# 4
# 5

Як перевірити дані чи об’єкт на ітерабельність

Щоб перевірити, чи певні дані є ітерабельними, можна використати метод dir(). Якщо ви бачите магічний метод __iter__, значить дані ітерабельні. Якщо ні, то дані не ітерабельні і над ними не варто виконувати цикл.

perfectNum = 7

print(dir(perfectNum))

# Вивід:['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', 
# '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']

Магічний метод __iter__ не знайдено у виводі. Отже, змінна perfectNum не ітерабельна.

jerseyNums = [43, 10, 7, 6, 8]

print(dir(jerseyNums))

# Вивід: ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

Магічний метод __iter__ знайдено, тому список jerseyNums ітерабельний.

Висновок

У цій публікації ви дізнались про помилку «Int Object is Not Iterable» та її розв’язок.

Ви також побачили, як перевірити, чи можна виконати цикл над об’єктом.

Якщо ви перевірите наявність магічного методу  __iter__ у даних та не знайдете його, краще не виконувати цикл на цих даних, оскільки вони не ітерабельні.

Дякую, що прочитали.