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.