user32152
user32152

Reputation: 11

Python (int) error

import random

    numbers = int(input("Please, enter number {}: ".format(i+1)) for i in range(7))

# will display prompt like "Please, enter number 1:"
    print ("numbers entered:"), numbers # this will print the entered numbers

    positives = [num for num in numbers if num > 0]
    negatives = [num for num in numbers if num < 0]

# loop ends here
    print ("Sum of negative numbers is :", sum(negatives))
    print ("Average negative number is :", sum(negatives)*1.0/len(negatives))
    print ("Sum of positive numbers is :", sum(positives))
    print ("Average positive number is :", sum(positives)*1.0/len(positives))

my issue is that when i run in idle i get the following error: "int() argument must be a string or a number, not 'generator" not sure how to fix this... i know that when using python 3 i have to use (int) before input to call on an integer but am unsure how to get this to work.

Upvotes: 0

Views: 879

Answers (3)

Sean McSomething
Sean McSomething

Reputation: 6507

That error means exactly what it says - int() only takes strings or objects and you're trying to call int on a generator expression. Stripping it down to something a bit simpler, you're saying int( f(x) for x in range(7) ) which makes about as much sense as saying int( [1, 2, 3, 4, 5, 6, 7] ). Python won't magically apply functions across lists (or generators or iterators or...).

While you could simply toss this into a list comprehension by adding a few characters (as other posters have suggested), the nature of this problem suggests you're just learning Python. Writing ugly, convoluted expressions is a bad habit to get into and makes code hard to read/maintain/expand. You should probably use an actual loop for the sake of readability.

numbers = []
for i in range(7):
    prompt = "Please, enter number {}: ".format(i+1)
    user_input = input(prompt)
    user_num = int(user_input)
    numbers.append(user_num)

It takes up a few more lines but it's easier to follow or modify. Let's say you wanted to remove the limit on how many numbers to input or disallow prime numbers - do you think you'd be able to do that easily with the original version?

Upvotes: 0

Nix
Nix

Reputation: 1

import random

numbers = []
for i in range(7):
    numbers.append(int(input("Please, enter number {}: ".format(i+1))))

# will display prompt like "Please, enter number 1:"
print ("numbers entered:"), numbers # this will print the entered numbers

positives = [num for num in numbers if num > 0]
negatives = [num for num in numbers if num < 0]

# loop ends here
if len(negatives) > 0:
    print ("Sum of negative numbers is :", sum(negatives))
    print ("Average negative number is :", sum(negatives)*1.0/len(negatives))
if len(positives) > 0:
    print ("Sum of positive numbers is :", sum(positives))
    print ("Average positive number is :", sum(positives)*1.0/len(positives))

Upvotes: 0

user2555451
user2555451

Reputation:

As the error says, int does not support generator expressions. However, you try to give it one here:

numbers = int(input("Please, enter number {}: ".format(i+1)) for i in range(7))

The above code is equivalent to this:

numbers = int(
              # This is a generator expression
              input("Please, enter number {}: ".format(i+1)) for i in range(7)
          )

What I think you are trying to do is this:

numbers = [int(input("Please, enter number {}: ".format(i+1))) for i in range(7)]

See a demonstration below:

>>> numbers = [int(input("Please, enter number {}: ".format(i+1))) for i in range(7)]
Please, enter number 1: 1
Please, enter number 2: 2
Please, enter number 3: 3
Please, enter number 4: 4
Please, enter number 5: 5
Please, enter number 6: 6
Please, enter number 7: 7
>>> numbers
[1, 2, 3, 4, 5, 6, 7]
>>>

Upvotes: 2

Related Questions