You are trying to loop over in integer; len()
returns one.
If you must produce a loop over a sequence of integers, use a range()
object:
for i in range(len(str_list)):
# ...
By passing in the len(str_list)
result to range()
, you get a sequence from zero to the length of str_list
, minus one (as the end value is not included).
Note that now your i
value will be the incorrect value to use to calculate an average, because it is one smaller than the actual list length! You want to divide by len(str_list)
:
return str_sum / len(str_list)
However, there is no need to do this in Python. You loop over the elements of the list itself. That removes the need to create an index first:
for elem in str_list
str_sum += len(elem)
return str_sum / len(str_list)
All this can be expressed in one line with the sum()
function, by the way:
def str_avg(s):
str_list = s.split()
return sum(len(w) for w in str_list) / len(str_list)
I replaced the name str
with s
; better not mask the built-in type name, that could lead to confusing errors later on.
Автор оригинала: Igor Suchilov.
Для вашего кода достаточно распространено Типеррор
Особенно, если вы просто начинаете с Python. Причина этого заключается в том, что переводчик ожидает переменных определенных типов в определенных местах в коде.
Мы посмотрим на конкретный пример такой ошибки: «Дисплей:« INT »объект не является истечением«
» Отказ
Упражнение : Запустите этот минимальный пример и воспроизведите ошибку в вашей онлайн-оболочке Python!
Давайте начнем разложить эту ошибку пошаговой!
Фон integer & iterable
Во-первых, стоит понять, что int.
и ИТЕРИТЕЛЬНО
находятся.
int
Тип в Python, как почти на всех языках программирования, это тип для хранения целых чисел, таких как 1, 2, 3, -324, 0. Может быть много переменных типа int
В нашей программе. Мы можем назначить им ценности себя непосредственно:
В этом случае мы чаще всего понимать, что такое тип нашей переменной. Но значение может, например, быть возвращено из функции. Python использует неявная печатание Отказ Неявное набрав означает, что при объявлении переменной вам не нужно указывать его тип; Когда явно вы должны. Поэтому, присваивая результат функции в переменной, вы не можете быть четко осведомлены о том, какой тип вашей переменной будет.
s1 = sum([1, 2, 3]) print(s1) print(type(s1))
Выход:
Вот еще один пример:
s2 = iter([1, 2, 3]) print(s2) print(type(s2))
Выход:
В этом примере S1
это целое число и имеет тип int
Отказ Этот номер возвращается сумма
Функция с аргументом в виде списка из 3 элементов. И переменная S2
имеет тип list_iterator
объект этого типа возвращается ИТЕР
Функция, чей аргумент такой же Список из 3 элементов. Мы поговорим о итерации сейчас.
Итерация – это общий термин, который описывает процедуру для принятия элементов чего-либо в свою очередь.
В целом, это последовательность инструкций, которые повторяются указанное количество раз, либо до выполнения указанного условия.
ИТЕРАЛНЫЙ – это объект, который является способен возвращать элементы один за раз. Это также объект, из которого можно получить итератор.
Примеры намеренных объектов:
- Все последовательности: Список , строка , корпус
- словари
- файлы
Похоже, что самый простой способ узнать, что именно наша функция возвращается, – это посмотреть на документация .
Итак, мы видим для ИТЕР: ITER (объект [, Sentinel])
Вернуть объект итератора.
Но на сумму у нас нет ничего о типе возвращающейся стоимости. Проверьте это самостоятельно!
Итак, TypeError: «INT» Объект не является истечением
Ошибка возникает, когда интерпретатор ожидает, что утекаемый объект и получает только целое число. Давайте рассмотрим наиболее распространенные примеры таких случаев.
Неверная аргумент «сумма»
Мы уже писали о функции суммы. Это возвращает значение int. Функция суммы занимает большинство двух аргументов. Первым аргументом должен быть объектом, который является итеративным. Если это коллекция своего рода, то, вероятно, безопасное предположение о том, что он является имитена. Второй аргумент к функции суммы является необязательным. Это число, которое представляет первое число, которое вы начнете добавлять. Если вы опускаете второй аргумент, вы начнете добавлять в 0. Для начинающих программистов Python кажется здравым смыслом, что функция должна вернуть сумму его аргументов. Часто они пытаются применить это так:
Выход:
TypeError Traceback (most recent call last) in () 1 a = 4 2 b = 3 ----> 3 sum(a, b) TypeError: 'int' object is not iterable
Но мы видим, что это приводит к ошибке. Мы можем решить эту ситуацию, предварительно написав наши переменные для суммирования в единый объект, в списке или кортеже или наборе, например:
a = 4 b = 3 tuple_sum = (a, b) list_sum = [a, b] set_sum = {a, b} dict_sum = {a: 0, b: 1} print(sum(tuple_sum)) print(sum(list_sum)) print(sum(set_sum)) print(sum(dict_sum))
Выход:
Как видите, результат остается прежним. Используете ли мы предварительную запись в кортеж, список, набор или даже словарь. Обратите внимание, что для словарей, функция суммы суммирует значения ключевых значений по умолчанию.
Вы даже можете написать одну переменную в список и рассчитать сумму этого списка. В качестве поиска шоу на шоу StackoverFlow Newbies в программировании часто пытаются рассчитать сумму одного элемента, которые, конечно, приводит к ошибке.
Выход:
TypeError Traceback (most recent call last) in () 1 a = 2 ----> 2 sum(a) TypeError: 'int' object is not iterable
Но если мы передаем счетющую объект, например, список (даже если он состоит из одного элемента) к функции, то расчет успешно.
a = 2 list_sum = [a] print(sum(list_sum))
Выход:
Другой способ сформировать такой список – использовать list.append
Метод:
a = 2 list_sum = [] list_sum.append(a) print('Sum of "a":', sum(list_sum)) b = 5 list_sum.append(b) print('Sum of "a" and "b":',sum(list_sum))
Выход:
''' Sum of "a": 2 Sum of "a" and "b": 7 '''
Давайте рассмотрим более сложную версию той же ошибки. У нас есть функция, которая должна рассчитать сумму элементов списка, включая элементы вложенных списков.
def nested_sum(list_): total = 0 for item in list_: item = sum(item) total = total + item return total list1 = [1, 2, 3, [4, 5]] print(nested_sum(list1))
Выход:
TypeError Traceback (most recent call last) in () 6 return total 7 list1 = [1, 2, 3, [4, 5]] ----> 8 nested_sum(list1) in nested_sum(list_) 2 total = 0 3 for item in list_: ----> 4 item = sum(item) 5 total = total + item 6 return total TypeError: 'int' object is not iterable
Возможно, вы уже можете увидеть, какова проблема здесь. Корпус анализирует список в его элементах и проходит через них. Предметы в нашем списке номера 1, 2, 3 и список [4, 5]
. Вы можете вычислить сумму списка, но вы не можете получить сумму одного числа в Python. Таким образом, мы должны переписать код.
def nested_sum(list_): total = 0 for item in list_: if type(item) == list: item = sum(item) total = total + item return total list1 = [1, 2, 3, [4, 5]] print(nested_sum(list1))
Выход:
Теперь в петля Мы, прежде всего, проверьте тип нашей локальной переменной «Пункт»
И если это список, то с четкой совестью, мы рассчитаем его сумму и переписывайте переменную «Пункт»
с результирующим значением. Если это просто один элемент, то мы добавляем его значение для «Всего»
Отказ
Неправильное использование петли ‘для’
Давайте рассмотрим еще один общий случай этой ошибки. Можете ли вы увидеть прямо сейчас, где проблема?
n = 10 for i in n: print(i)
Выход:
TypeError Traceback (most recent call last) in () 1 n = 10 ----> 2 for i in n: 3 print(i) TypeError: 'int' object is not iterable
Возможно, ошибка в этой конструкции связана с традицией преподавания детей языком Паскаля в школе. Там вы можете на самом деле написать что-то подобное: для n сделать
Отказ
Но в питоне «для» петли используются для последовательной обход. Их строительство предполагает наличие итеративного объекта. На других языках A «для каждой» конструкции обычно используется для такого обхода.
Таким образом, конструкция «для» в Python ожидает, что уникальный объект, который будет проходить, и не может интерпретировать целое число. Эта ошибка может быть легко исправлена с помощью функции «диапазон». Посмотрим, как наш пример будет смотреть в этом случае.
n = 10 for i in range(n): print(i)
Выход:
Функция «диапазона» может принять 3 аргумента: Диапазон (запуск, остановка [, шаг])
. «Пуск» – это первое число, из которого начнется цикл, «Stop» – это число, на котором будет конец цикла. Обратите внимание, что число «Стоп» не будет включен в цикл. «Шаг» – насколько количество будет отличаться на каждой следующей итерации от предыдущего. По умолчанию «Start» имеет значение 0, а параметр остановки должен быть передан обязательным. Подробнее с примерами можно найти в документации. https://docs.python.org/3.3/library/stdtypes.html?highlight=range#range
for i in range(4, 18, 3): print(i)
Выход:
Вот небольшой пример использования всех трех параметров функции «диапазона». В цикле переменная «I» на первом шаге будет равна 4, «Я» никогда не будет больше или равен 18, и увеличится с шагом 3.
Проблемы с кортежами
Следующий пример, где ошибка «Дисплей:« INT »объект не является истечением«
» Может возникнуть многочисленное назначение значений с использованием кортежа. Давайте посмотрим на пример.
Выход:
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) in () ----> 1 a, b = 0 TypeError: 'int' object is not iterable
Это очень питонский способ назначения, но вы должны быть осторожны с этим. Слева мы видим кортеж из двух элементов «A» и «B», так что справа от равного знака также должен быть кортеж (или любой другой намек на объект) двух элементов. Не пугайтесь, написав кортеж без скобок, это допустимый путь в Python.
Итак, чтобы исправить эту ошибку, мы можем написать такое назначение:
a, b = 0, 0 print(a) print(b)
Выход:
И еще несколько примеров того, как вы можете назначать значения нескольким переменным одновременно:
a, b = (1, 2) c, d = {3, 4} e, f = [5, 6] print(a, b, c ,d ,e, f)
Выход:
Аналогичная проблема может возникнуть, если вы используете функцию, которая возвращает несколько значений в качестве кортежа. Подумайте, например, функция, которая возвращает сумму, продукт и результат разделения двух чисел.
def sum_product_division(a, b): if b != 0: return a + b, a * b, a / b else: return -1 sum_, product, division = sum_product_division(6, 2) print("The sum of numbers is:", sum_) print("The product of numbers is:", product) print("The division of numbers is:", division)
Выход:
The sum of numbers is: 8 The product of numbers is: 12 The division of numbers is: 3.0
Обратите внимание, что я добавил подчеркивание на имя переменной «SUM_». Это потому, что слово «сумма» – это имя встроенной функции, которую мы обсуждали выше. Как видите, в случае, когда «B» не равен нулю, наш код работает правильно, переменные принимают соответствующие значения. Теперь давайте попробуем пройти значение «B», равное 0 на функцию. Отдел на ноль не произойдет, поскольку мы предоставили это в функции и return -1 в качестве кода ошибки.
sum_, product, division = sum_product_division(6, 0) print("The sum of numbers is:", sum_) print("The product of numbers is:", product) print("The division of numbers is:", division)
Выход:
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) in () ----> 1 sum_, product, division = sum_product_division(6, 0) 2 print("The sum of numbers is:", sum_) 3 print("The product of numbers is:", product) 4 print("The division of numbers is:", division) TypeError: 'int' object is not iterable
Ошибка « TypeError:« INT »Объект не является утечкой
« Снова возникает. Что случилось? Как я уже сказал, эта ситуация похожа на предыдущую. Здесь мы также стараемся назначать значения нескольким переменным, используя кортеж. Но наша функция, когда существует опасность разделения от нуля, возвращается не кортеж, а единственное значение кода ошибки ‘-1’.
Как это исправить? Например, мы можем проверить тип возвратной стоимости. И в зависимости от этого типа уже вывод результат. Давай сделаем это!
result = sum_product_division(6, 0) if type(result) == int: print("Error, b should not be zero!") else: sum_, product, division = result print("The sum of numbers is:", sum_) print("The product of numbers is:", product) print("The division of numbers is:", division)
Выход:
Error, b should not be zero!
Вот еще один пример:
result = sum_product_division(6, 3) if type(result) == int: print("Error, b should not be zero!") else: sum_, product, division = result print("The sum of numbers is:", sum_) print("The product of numbers is:", product) print("The division of numbers is:", division)
Выход:
The sum of numbers is: 9 The product of numbers is: 18 The division of numbers is: 2.0
Мы также можем перепроектировать нашу функцию, чтобы вернуть результат операции с начала кортежа. И используйте какой-то трюк при назначении переменных. Взгляните на это:
def sum_product_division(a, b): if b != 0: return "Ok", a + b, a * b, a / b else: return ("Error",) status, *results = sum_product_division(6, 0) print(status, results) status, *results = sum_product_division(6, 2) print(status, results)
Выход:
Если подразделение на ноль возможно, мы возвращаем кортеж с одним элементом – строку «ошибка». Если все правильно, мы возвращаем кортеж, где первый элемент представляет собой сообщение о состоянии – строку «ОК», а затем результаты расчетов следуют последовательно: сумма, продукт, результат разделения.
Здесь может быть много вариантов, потому что это функция, которую мы написали сами, поэтому мы можем исправить это, как мы, пожалуйста. Но это так бывает, что мы используем функции из библиотек. Например, вот ошибка с темы на переполнение стека .
import subprocess data = subprocess.call(["echo", '''Hello World! Hello!''']) sum_lines = 0 for line in data: print(line) sum_lines += 1 print(sum_lines)
Выход:
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) in () 3 Hello!''']) 4 sum_lines = 0 ----> 5 for line in data: 6 print(line) 7 sum_lines += 1 TypeError: 'int' object is not iterable
Я немного переписал код, чтобы сущность ясна. Мы хотим запустить команду в командной строке и подсчитать количество строк, напечатанных на экране. В нашем случае это будет просто команда для отображения небольшого сообщения в мире.
Мы должны прочитать документацию, чтобы понять это. Модуль подпроцесса позволяет создавать новые процессы, подключаться к их трубам ввода/вывода/ошибки и получить их коды возврата. Мы видим, что функция «Call» запускает процесс в командной строке, затем ждет его выполнения и возвращает код результата выполнения! Вот и все! Функция вернула код выполнения. Это целое число, и мы пытаемся пройти это целое число в петле. Что невозможно, как я описал выше.
Что делать? Исследуйте документацию для модуля дальше. И поэтому мы находим то, что нам нужно. Функция «check_output». Он возвращает все, что должно отображаться в консоли, когда выполняется передаваемая команда. Увидеть как это работает:
import subprocess data=subprocess.check_output(["echo", '''Hello World! Hello!''']) sum_lines = 0 for line in data.splitlines(): print(line) sum_lines +=1 print(sum_lines)
Выход:
b'Hello World!' b'Hello!' 2
Большой! Мы получили байтовую строку, разделенную новыми символами « N» на выходе. И мы можем пройти через него, как показано с функцией «сплитлина». Он возвращает список строк в строке, разбивающую на границах линии. Этот метод использует подход Universal Newlines к разделительным линиям. Перерывы линии не включены в результирующий список, если не дано параметр «Сохранитель» и правда.
Таким образом, мы исправили ошибку и получили то, что нам нужно, но пришлось сделать небольшое исследование в документации. Это изучение документации является одним из наиболее эффективных способов улучшения ваших навыков программирования.
Зацепка со списками
Часто ошибка «Дисплей:« INT »объект не является истечением«
» появляется при использовании различных функций, связанных с списками. Например, у меня есть список моих экзаменационных классов. Я хочу добавить к нему сорт в физическом воспитании, который я прекрасно прошел в отличие от математики. Я пытаюсь сделать это так:
grades = [74, 85, 61] physical_education_mark = 100 grades += physical_education_mark
Я использую самый обычный метод для выполнения списка Concatenation, использование оператора «+». Он может легко добавить весь один список позади другого списка и, следовательно, выполнять конкатенацию. Но здесь не работает. Потому что конкатенация списка возможна только для двух списков. Мы не можем комбинировать список и номер. Наиболее очевидный способ решить эту проблему – использовать функцию «Добавить». Он предназначен только для этого. Это добавляет элемент в список. Аргумент также может быть целым числом.
grades = [74, 85, 61] physical_education_mark = 100 grades.append(physical_education_mark) print(grades)
Выход:
Вуаля! Мы сделали это! Конечно, если мы действительно хотим использовать оператор «+», мы можем предварительно написать нашу оценку физического воспитания в списке с одним элементом, например, как это:
grades = [74, 85, 61] physical_education_mark = 100 grades += [physical_education_mark] print(grades)
Выход:
Результат ожидается такой же, как предыдущий. Двигаться дальше.
Другой проблему, связанной с списком, заключается в том, когда вы пытаетесь добавить элемент с помощью метода «Extend». Этот метод может быть очень полезен для объединения списков. В отличие от оператора «+», он меняет список, из которого он называется. Например, мне нужно добавить новые семестры классы в список оценок. Это легко сделать с методом «Extend»:
grades = [74, 85, 61] new_semestr_grades = [85, 79] physical_education_mark = 100 grades.extend(new_semestr_grades) print(grades)
Выход:
Итак, мы сделали это легко, но подожди! Мы забыли наш идеальный рейтинг физического воспитания!
grades = [74, 85, 61] new_semestr_grades = [85, 79] physical_education_mark = 100 grades.extend(new_semestr_grades) grades.extend(physical_education_mark) print(grades)
Выход:
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) in () 3 physical_education_mark = 100 4 grades.extend(new_semestr_grades) ----> 5 grades.extend(physical_education_mark) 6 print(grades) TypeError: 'int' object is not iterable
И мы не можем сделать это так. «Extend» ждет итеративный объект как аргумент. Мы можем использовать метод «Добавить» или предварительно написание.
grades = [74, 85, 61] new_semestr_grades = [85, 79] physical_education_mark = [100] grades.extend(new_semestr_grades) grades.extend(physical_education_mark) print(grades)
Выход:
[74, 85, 61, 85, 79, 100]
Вы заметили разницу? Первоначально я определил переменную «Picval_education_mark» как список с одним элементом. И это работает идеально!
Теперь предположим, что нам нужна функция, которая найдет местоположение переменных в формуле «A + – 6». Если вы знаете, что каждая переменная в формуле обозначается одной заглавной буквой. Мы пытаемся написать это:
def return_variable_indexes(formula): for element in formula: if element.isupper(): indexes = list(formula.index(element)) return indexes print(return_variable_indexes("A + C = D - 6"))
Выход:
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) in () 5 return indexes 6 ----> 7 print(return_variable_indexes("A + C = D - 6")) in return_variable_indexes(formula) 2 for element in formula: 3 if element.isupper(): ----> 4 indexes = list(formula.index(element)) 5 return indexes 6 TypeError: 'int' object is not iterable
Да, мы получили ту же ошибку снова. Давайте постараемся понять, что случилось. Мы проходим через элементы строки «Формулы». И если этот элемент является заглавной буквой, то мы используем функцию «индекса», чтобы найти его положение в строке. И попробуйте написать его в списке «Индексы». Таким образом, у нас есть две функции «Индекс» и «Список». Что возвращается значение функции «индекса»? Это целое число число позиции при первом возникновении указанного значения. Таким образом, мы пытаемся добавить это в список «Индексы» с функцией «Список». И останавливайся здесь! Конструктор «Список» принимает один аргумент. Это должен быть целью, чтобы это могло быть последовательностью (строки, кортежи) или коллекцией (набор, словарь) или любой объект итератора. Не целое число, конечно. Таким образом, мы можем использовать метод «Добавить» снова и получить результат, который нам нужен:
def return_variable_indexes(formula): indexes = [] for element in formula: if element.isupper(): indexes.append(formula.index(element)) return indexes print(return_variable_indexes("A + C = D - 6"))
Выход:
И просто для удовольствия вы можете сделать это как одноклассник, используя понимание списка и метод «перечисрения». Требуется объект в качестве аргумента и возвращает свои элементы с индексом в качестве кортежей (индекс, элемент) один кортеж другим:
def return_variable_indexes(formula): return [index_ for index_, element in enumerate(formula) if element.isupper()] print(return_variable_indexes("A + C = D - 6"))
Выход:
Заключение
Мы рассмотрели некоторые случаи, в которых ошибка «TypeError:« Int »объект не является тем, что происходит». Это всегда ситуация, когда переводчик ожидает ИТЕРИТЕЛЬНО объект, и мы предоставляем это целое число .
Наиболее распространенные случаи таких ошибок:
- неверная сумма аргумента;
- Неправильная обработка кортежей;
- связанные с различными функциями и методами списков
Я надеюсь, что после прочтения этой статьи у вас никогда не будет похожая проблема. И если это внезапно возникает, вы можете легко решить. Возможно, вам понадобится прочитать документацию для этого, хотя =)
Оригинал: “https://blog.finxter.com/how-to-solve-python-typeerror-int-object-is-not-iterable/”
If you are running your Python code and you see the error “TypeError: ‘int’ object is not iterable”, it means you are trying to loop through an integer or other data type that loops cannot work on.
In Python, iterable data are lists, tuples, sets, dictionaries, and so on.
In addition, this error being a “TypeError” means you’re trying to perform an operation on an inappropriate data type. For example, adding a string with an integer.
Today is the last day you should get this error while running your Python code. Because in this article, I will not just show you how to fix it, I will also show you how to check for the __iter__
magic methods so you can see if an object is iterable.
How to Fix Int Object is Not Iterable
If you are trying to loop through an integer, you will get this error:
count = 14
for i in count:
print(i)
# Output: TypeError: 'int' object is not iterable
One way to fix it is to pass the variable into the range()
function.
In Python, the range function checks the variable passed into it and returns a series of numbers starting from 0 and stopping right before the specified number.
The loop will now run:
count = 14
for i in range(count):
print(i)
# Output: 0
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9
# 10
# 11
# 12
# 13
Another example that uses this solution is in the snippet below:
age = int(input("Enter your age: "))
for num in range(age):
print(num)
# Output:
# Enter your age: 6
# 0
# 1
# 2
# 3
# 4
# 5
How to Check if Data or an Object is Iterable
To check if some particular data are iterable, you can use the dir()
method. If you can see the magic method __iter__
, then the data are iterable. If not, then the data are not iterable and you shouldn’t bother looping through them.
perfectNum = 7
print(dir(perfectNum))
# Output:['__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']
The __iter__
magic method is not found in the output, so the variable perfectNum
is not iterable.
jerseyNums = [43, 10, 7, 6, 8]
print(dir(jerseyNums))
# Output: ['__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']
The magic method __iter__
was found, so the list jerseyNums
is iterable.
Conclusion
In this article, you learned about the “Int Object is Not Iterable” error and how to fix it.
You were also able to see that it is possible to check whether an object or some data are iterable or not.
If you check for the __iter__
magic method in some data and you don’t find it, it’s better to not attempt to loop through the data at all since they’re not iterable.
Thank you for reading.
Learn to code for free. freeCodeCamp’s open source curriculum has helped more than 40,000 people get jobs as developers. Get started
Integers and iterables are distinct objects in Python. An integer stores a whole number value, and an iterable is an object capable of returning elements one at a time, for example, a list. If you try to iterate over an integer value, you will raise the error “TypeError: ‘int’ object is not iterable”. You must use an iterable when defining a for loop, for example, range()
. If you use a function that requires an iterable, for example, sum()
, use an iterable object as the function argument, not integer values.
This tutorial will go through the error in detail. We will go through two example scenarios and learn how to solve the error.
Table of contents
- TypeError: ‘int’ object is not iterable
- Example #1: Incorrect Use of a For Loop
- Solution
- Example #2: Invalid Sum Argument
- Solution
- Summary
TypeError: ‘int’ object is not iterable
TypeError occurs in Python when you try to perform an illegal operation for a specific data type. For example, if you try to index a floating-point number, you will raise the error: “TypeError: ‘float’ object is not subscriptable“. The part ‘int’ object is not iterable tells us the TypeError is specific to iteration. You cannot iterate over an object that is not iterable. In this case, an integer, or a floating-point number.
An iterable is a Python object that you can use as a sequence. You can go to the next item in the sequence using the next()
method.
Let’s look at an example of an iterable by defining a dictionary:
d = {"two": 2, "four":4, "six": 6, "eight": 8, "ten": 10} iterable = d.keys() print(iterable)
dict_keys(['two', 'four', 'six', 'eight', 'ten'])
The output is the dictionary keys, which we can iterate over. You can loop over the items and get the values using a for
loop:
for item in iterable: print(d[item])
Here you use item as the index for the key in the dictionary. The following result will print to the console:
2 4 6 8 10
You can also create an iterator to use the next()
method
d = {"two": 2, "four":4, "six": 6, "eight": 8, "ten": 10} iterable = d.keys() iterator = iter(iterable) print(next(iterator)) print(next(iterator))
two four
The code returns the first and second items in the dictionary. Let’s look at examples of trying to iterate over an integer, which raises the error: “TypeError: ‘int’ object is not iterable”.
Example #1: Incorrect Use of a For Loop
Let’s consider a for loop where we define a variable n
and assign it the value of 10. We use n as the number of loops to perform: We print each iteration as an integer in each loop.
n = 10 for i in n: print(i)
TypeError Traceback (most recent call last) 1 for i in n: 2 print(i) 3 TypeError: 'int' object is not iterable
You raise the error because for loops are used to go across sequences. Python interpreter expects to see an iterable object, and integers are not iterable, as they cannot return items in a sequence.
Solution
You can use the range()
function to solve this problem, which takes three arguments.
range(start, stop, step)
Where start is the first number from which the loop will begin, stop is the number at which the loop will end and step is how big of a jump to take from one iteration to the next. By default, start has a value of 0, and step has a value of 1. The stop parameter is compulsory.
n = 10 for i in range(n): print(i)
0 1 2 3 4 5 6 7 8 9
The code runs successfully and prints each value in the range of 0 to 9 to the console.
Example #2: Invalid Sum Argument
The sum()
function returns an integer value and takes at most two arguments. The first argument must be an iterable object, and the second argument is optional and is the first number to start adding. If you do not use a second argument, the sum function will add to 0. Let’s try to use the sum()
function with two integers:
x = 2 y = 6 print(sum(x, y))
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) 1 print(sum(x,y)) TypeError: 'int' object is not iterable
The code is unsuccessful because the first argument is an integer and is not iterable.
Solution
You can put our integers inside an iterable object to solve this error. Let’s put the two integers in a list, a tuple, a set and a dictionary and then use the sum()
function.
x = 2 y = 6 tuple_sum = (x, y) list_sum = [x, y] set_sum = {x, y} dict_sum = {x: 0, y: 1} print(sum(tuple_sum)) print(sum(list_sum)) print(sum(set_sum)) print(sum(dict_sum))
8 8 8 8
The code successfully runs. The result remains the same whether we use a tuple, list, set or dictionary. By default, the sum()
function sums the key values.
Summary
Congratulations on reading to the end of this tutorial. The error “TypeError: ‘int’ object is not iterable” occurs when you try to iterate over an integer. If you define a for loop, you can use the range()
function with the integer value you want to use as the stop argument. If you use a function that requires an iterable, such as the sum()
function, you must put your integers inside an iterable object like a list or a tuple.
For further reading on the ‘not iterable’ TypeError go to the articles:
- How to Solve Python TypeError: ‘NoneType’ object is not iterable.
- How to Solve Python TypeError: ‘method’ object is not iterable.
Go to the online courses page on Python to learn more about Python for data science and machine learning.
Have fun and happy researching!
The Python TypeError: 'int' object is not iterable
is an exception that occurs when trying to loop through an integer value. In Python, looping through an object requires the object to be “iterable”. Since integers are not iterable objects, looping over an integer raises the TypeError: 'int' object is not iterable
exception.
Python TypeError: Int Object Is Not Iterable Example
Here’s an example of a Python TypeError: 'int' object is not iterable
thrown when trying iterate over an integer value:
myint = 10
for i in myint:
print(i)
In the above example, myint
is attempted to be iterated over. Since myint
is an integer and not an iterable object, iterating over it raises a TypeError: 'int' object is not iterable
:
File "test.py", line 3, in <module>
for i in myint:
TypeError: 'int' object is not iterable
How to Fix TypeError: Int Object Is Not Iterable
In the above example, myint
cannot be iterated over since it is an integer value. The Python range()
function can be used here to get an iterable object that contains a sequence of numbers starting from 0 and stopping before the specified number.
Updating the above example to use the range()
function in the for
loop fixes the error:
myint = 10
for i in range(myint):
print(i)
Running the above code produces the following output as expected:
0
1
2
3
4
5
6
7
8
9
How to Avoid TypeError: Int Object Is Not Iterable
The Python TypeError: 'int' object is not iterable
error can be avoided by checking if a value is an integer or not before iterating over it.
Using the above approach, a check can be added to the earlier example:
myint = 10
if isinstance(myint, int):
print("Cannot iterate over an integer")
else:
for i in myint:
print(i)
A try-except block can also be used to catch and handle the error if the type of object not known beforehand:
myint = 10
try:
for i in myint:
print(i)
except TypeError:
print("Object must be an iterable")
Surrounding the code in try-except blocks like the above allows the program to continue execution after the exception is encountered:
Object must be an iterable
Track, Analyze and Manage Errors With Rollbar
Managing errors and exceptions in your code is challenging. It can make deploying production code an unnerving experience. Being able to track, analyze, and manage errors in real-time can help you to proceed with more confidence. Rollbar automates error monitoring and triaging, making fixing Python errors easier than ever. Try it today!