Skip to content
Advertisement

How can I fix function object is not iterable?

After calling both functions I’m getting ‘function object is not itrable’ as an error. I’m thinking the error appears somewhere in the for loop, I just can’t figure out why if I’m iterating through a list. The purpose of the program is to output the range of numbers between the first ‘input1’ and ‘upper_threshold’. Tyvm for your help.

def get_user_values():
    user_values = []
    input1 = int(input())
    while input1 > 0:
        input2 = int(input())
        user_values.append(input2)
        input1 -= 1
    return user_values


def output_ints_less_than_or_equal_to_threshold(user_values, upper_threshold):
    for value in user_values:
        if value >= min(user_values) and value <= upper_threshold:
            print (value)


if __name__ == '__main__':
    user_values = []
    get_user_values()
    upper_threshold = int(input())
    print (output_ints_less_than_or_equal_to_threshold(get_user_values, upper_threshold))

Advertisement

Answer

I’m pretty sure that where you have:

print (output_ints_less_than_or_equal_to_threshold(get_user_values, upper_threshold))

you mean to have:

print (output_ints_less_than_or_equal_to_threshold(get_user_values(), upper_threshold))

In other words, you want to pass the results of calling the function get_user_values to the function output_ints_less_than_or_equal_to_threshold. Right now, you’re passing in the function itself, not something it returned. So your code is trying to iterate over the value user_values that was passed to it, thinking it is a list of values. Instead, it gets and tries to iterate over a function.

The two other problems I see are that you aren’t providing any prompts when you accept user input, and you’re calling get_user_values() twice, throwing the results away the first time you call it.

Here’s a version of your code with those two problems fixed. Also, your main function doesn’t return anything, so I removed the print() that was printing None as its result.With those fixes, it seems to do what I expect you want the code to do:

def get_user_values():
    user_values = []
    input1 = int(input("How many numbers?"))
    while input1 > 0:
        input2 = int(input("Enter a number"))
        user_values.append(input2)
        input1 -= 1
    return user_values

def output_ints_less_than_or_equal_to_threshold(user_values, upper_threshold):
    for value in user_values:
        if value >= min(user_values) and value <= upper_threshold:
            print (value)

if __name__ == '__main__':
    upper_threshold = int(input("What threshold should I use?"))
    output_ints_less_than_or_equal_to_threshold(get_user_values(), upper_threshold)

Sample run:

What threshold should I use?5
How many numbers?4
Enter a number7
Enter a number2
Enter a number99
Enter a number3
2
3
User contributions licensed under: CC BY-SA
6 People found this is helpful
Advertisement