TypeError: 'function' object is not iterable (Fix)
Fix the Python error TypeError: 'function' object is not iterable. This error usually means Python expected something it could loop over, but you gave it a function itself instead of the value returned by that function.
In most cases, the fix is simple: call the function with parentheses.
Quick fix #
def get_numbers():
return [1, 2, 3]
for n in get_numbers():
print(n)
This error often happens when you loop over a function name instead of the value returned by the function. Add parentheses if you meant to call the function.
What this error means #
Python expected an iterable object, such as:
- a list
- a tuple
- a string
- a set
- a dictionary
- a
range
But it got a function object instead.
A function is something you call to get a result. It is not something you can loop over directly.
If you are not fully comfortable with functions yet, see Python functions explained and iterators and iterable objects explained.
Why this happens #
This error usually appears when:
- You wrote a function name without parentheses
- You used a function in a
forloop - You used a function with
list(),tuple(),set(),sum(),any(),all(), or similar code that expects an iterable - You returned a function instead of returning data by mistake
Common example that causes the error #
Here is a simple example:
def get_numbers():
return [1, 2, 3]
for n in get_numbers:
print(n)
Output:
TypeError: 'function' object is not iterable
Why this fails #
get_numbersis the function itselfget_numbers()is the list returned by the function
Python cannot loop over the function object, but it can loop over the list returned by the function.
Fix 1: Call the function #
If you want the function’s result, add parentheses.
def get_numbers():
return [1, 2, 3]
for n in get_numbers():
print(n)
Output:
1
2
3
This is the most common fix.
Use:
my_function()if you want the returned valuemy_functiononly when you want to refer to the function itself
Fix 2: Check what the function returns #
Sometimes you already called the function, but the returned value still is not iterable.
For example:
def get_total():
return 10
for n in get_total():
print(n)
This also fails, because 10 is an integer, and integers are not iterable.
How to debug it #
Check the returned value and its type:
def get_total():
return 10
value = get_total()
print(value)
print(type(value))
Output:
10
<class 'int'>
If the function returns None, int, or bool, you still cannot iterate over it.
A function must return something iterable, such as a list or tuple:
def get_total_parts():
return [3, 7]
for n in get_total_parts():
print(n)
If you need help checking types, see Python type() explained.
Fix 3: Do not overwrite iterable variables with functions #
Sometimes the problem is caused by reusing the same name for different things.
Example:
items = [1, 2, 3]
def items():
return [4, 5, 6]
for x in items:
print(x)
This fails because items now refers to the function, not the original list.
Better version #
Use different names:
items = [1, 2, 3]
def get_items():
return [4, 5, 6]
for x in items:
print(x)
Or, if you want the function result:
def get_items():
return [4, 5, 6]
for x in get_items():
print(x)
Clear names help prevent this kind of mistake.
Where this error appears #
You may see this error in places like these:
In a for loop #
def names():
return ["Ana", "Ben"]
for name in names:
print(name)
With the in operator #
def colors():
return ["red", "blue"]
print("red" in colors)
With list(), tuple(), or set() #
def letters():
return "abc"
print(list(letters))
With sum() #
def numbers():
return [1, 2, 3]
print(sum(numbers))
In all of these cases, the fix is usually to call the function:
print("red" in colors())
print(list(letters()))
print(sum(numbers()))
Beginner debugging steps #
When you see this error, use these steps:
- Find the exact line shown in the traceback
- Check whether you used a function name without parentheses
- Print the object and its type before the failing line
- Confirm that the value is actually iterable
Useful debugging code:
print(my_function)
print(type(my_function))
value = my_function()
print(value)
print(type(value))
Example #
def get_numbers():
return [1, 2, 3]
print(get_numbers)
print(type(get_numbers))
value = get_numbers()
print(value)
print(type(value))
Output:
<function get_numbers at 0x...>
<class 'function'>
[1, 2, 3]
<class 'list'>
That makes the problem easier to spot:
get_numbersis a functionget_numbers()is a list
If you want a step-by-step process, see the beginner guide to debugging Python code.
Common mistakes #
These are the most common causes of this error:
- Using
for x in my_functioninstead offor x in my_function() - Passing a function to
list()orset()by mistake - Forgetting to call a function before using the
inoperator - Returning a function object instead of returned data
- Reusing the same name for both data and a function
Here is one more example of returning a function by mistake:
def get_numbers():
return [1, 2, 3]
def wrapper():
return get_numbers
for n in wrapper():
print(n)
This fails because wrapper() returns the function get_numbers, not the list.
Correct version #
def get_numbers():
return [1, 2, 3]
def wrapper():
return get_numbers()
for n in wrapper():
print(n)
FAQ #
Why does Python say a function is not iterable? #
Because a function is something you call with parentheses. It is not a collection of values you can loop over.
How do I fix this error quickly? #
Check whether you forgot parentheses. If you meant to use the function result, change my_function to my_function().
Can a function ever be iterable? #
Not by default. Normally you call a function to get a value, and then you iterate over that returned value if it is iterable.
What if I already called the function and still get an error? #
Then the returned value may not be iterable. Check the return value and its type.
If the returned value is None, you may also want to read TypeError: 'NoneType' object is not iterable. Similar problems can happen with TypeError: 'int' object is not iterable and TypeError: 'bool' object is not iterable.