Ситуация: у нас есть какая-то переменная с числами, и мы хотим перебрать количество символов в ней с помощью цикла.
numbers = [4, 8, 15, 16, 23, 42]
for number in len(numbers):
print(number)
Кажется, что всё правильно, но при запуске появляется ошибка:
❌ TypeError: int object is not iterable
Что это значит: мы пытаемся запустить цикл для типа данных, с которым циклы не могут работать.
Когда встречается: когда мы пытаемся выполнить операцию с переменной, которая представляет собой целое число.
Что делать с ошибкой TypeError: int object is not iterable
Ошибка TypeError возникает, когда функция применяется к объекту неправильного типа данных. Например, если мы пытаемся применить математическую функцию к строке или вызвать значение, которое не является функцией, как функцию.
В нашем случае мы пытаемся перебрать элементы переменной, которая не является перебираемой. В Python перебираемые, или итерируемые, данные — это объекты, которые содержат несколько объектов, например списки, кортежи, наборы, словари и так далее. А наша переменная — целочисленная.
Целое число — это одно значение, и пытаться перебрать его в цикле не будет правильно.
Чтобы исправить ошибку, используем функцию range
в первой строке цикла for.
numbers = [4, 8, 15, 16, 23, 42]
for number in range(len(numbers)):
print(number)
В Python функция range
проверяет переданную в неё переменную и возвращает последовательность чисел внутри диапазона, начиная с 0.
Теперь всё работает:
Как проверить, является ли объект итерируемым
Чтобы узнать, что объект итерируемый, нужно выяснить, имеет ли объект метод __iter__()
. Проверить это можно двумя способами.
Первый способ — использовать функцию hasattr()
.
numbers = [3, 8, 15, 16, 23, 42]
if hasattr(numbers, '__iter__'):
print("Этот объект итерируемый")
else:
print("Этот объект не итерируемый")
Запустим этот код:
Второй способ — использовать функцию dir()
.
numbers = [3, 8, 15, 16, 23, 42]
print(dir(numbers))
Получаем результат:
Среди перечисленных методов есть __iter__
(в центре третьей строки результата).