So I keep getting the above error message, and I don't understand why. This is what I have so far:
#request user input for property value
def getPropertyValue():
value = 0
value = float(input('Please enter value of desired property: '))
#eliminate negative answers
if value < 0:
print('Invalid property value, please re-enter a positive value. ')
getPropertyValue()
#return valid answers
else:
return value
#calculate assessed value
def calc_assessed_value(value):
a_value = value * 0.60
return a_value
#calculate property tax, 72 cents of each 100 dollars
def calc_property_tax(a_value):
p_tax = a_value / 100 * 0.72
p_tax = round(p_tax, 2)
return p_tax
#display results with meaningful text
def print_message(value, a_value , p_tax):
print('Property Value: $' , value)
print('Assessed Property Value: $' , a_value)
print('Property Tax: $' , p_tax)
#run functions in order
value = getPropertyValue()
a_value = calc_assessed_value(value)
p_tax = calc_property_tax(a_value)
print_message(value , a_value , p_tax)
And when I run it with a positive number out of the gate, it works. If I continuously run negative numbers it cuts it off as intended, and loops them until they enter a non-negative number. However, when you enter a positive number after that, it give the error message. I've been at this a while and it's not making sense to me. I thought maybe entering a negative number was affecting what type of number it was trying to use, so I tried zeroing the total before inputting (which is why there is a value = 0), but it still doesn't allow it through.
If you want to do getPropertyValue recursive, you should return function instead of executing it only.
Add return statement here:
#eliminate negative answers
if value < 0:
print('Invalid property value, please re-enter a positive value. ')
return getPropertyValue()
In your getPropertyValue function, when the user enters a negative number, you recursively call getPropertyValue() again and yet you aren't returning its return value, so it returns None by default, causing the calc_assessed_value to do calculation with a None value later.
Simply change:
getPropertyValue()
to:
return getPropertyValue()
Related
while True:
numbers = input('> ')
if numbers == 'done':
break
total = 0
for number in numbers:
if numbers == int:
total = total + numbers
print(total)
I've had a hard time understanding exactley what u want to do with this code, please use a proper code block next time, with proper indentation. My guess is that u want to get a input number like 345 and add 3+4+5 as a output. If the input is not a int it should break the loop. Ive come up with 2 diffrent solutions, depending on what you need.
This code will simply take the input and check if it is "done", if it is not "done" it will try to add. This is a easy to understand solution but it will produce a error if the input is any diffrent string than "done".
while True:
numbers = input(">")
if numbers == "done":
break
else:
total = 0
for number in numbers:
total += int(number)
print(total)
This approach will test for the "done" string again, but afterwards will also check if the input can be converted into a int. if not the error is captured and it will return "invalid input". If u want the programm to terminate at any string u can just put break in the except section.
while True:
numbers = input(">")
if numbers == "done":
break
else:
try:
testing = int(numbers)
total = 0
for number in numbers:
total += int(number)
except:
total = "invalid input"
print(total)
im a Beginner myself and if a experiencend person can show me a better way to do this i would be very interested
while True:
numbers = input('> ')
if numbers == 'done':
break
total = 0
for number in numbers:
if numbers == int:
total = total + numbers
print(total)
Assuming this as your code:
Here's a solution to your problem-->
numbers=[]
while True:
a=input('>')
if a=='done':
break
else:
numbers.append(a)
total=0
for number in numbers:
total = total + int(number)
print(total)
By default everything gets accepted as string so we convert it to integer to find total.
Also we use list to store all the values we accept.
Another Solution is-->
numbers=[]
while True:
a=input('>')
if a=='done':
break
else:
numbers.append(a)
p=map(int,numbers)
print(sum(p))
Hope you understand the solution :-)
total = 0
average = 0
count = 0
while True:
numbers = input('> ')
if numbers == 'done': break
try:
total = int(numbers) + total
count = count + 1
except:
print('nope')
try:
average = total / count
except:
print('error')
print(total)
print(average)
print(count)
Try this:
total = 0
number_of_inputs = 0
while True:
number_string = input('Enter a number: ')
try:
total += float(number_string)
number_of_inputs += 1
except ValueError:
break # we weren't given a number, so exit the loop
# Now that we're outside of the loop, print out the total:
print('The total is:', total)
if number_of_inputs > 0:
average = total / number_of_inputs
print('The average is:', average)
else:
print('The average cannot be calculated, as no inputs were given.')
Do you see what's happening? The while loop keeps ask for and adding integers to total until a non-integer (like "done") is given. Once it gets that non-integer, the int() function will fail, and the exception it throws will get caught, and the code will immediately break out of the while loop.
And once out of the loop, the total and the average are printed out.
A few things you should be aware of:
If the user gave no inputs (which is possible here), the total will correctly print out as 0, but if you try to calculate the average, you will error, due to diving by number_of_inputs (which is also 0). That is why I check that number_of_inputs is greater than zero before I even attempt to calculate the average.
Originally I used int() to convert the string to a number, but I changed it to use float() instead. I figure that since you want to calculate an average, averages are not necessarily integers (even if all the inputs are), so there's no point in enforcing integer input. That is why I changed the int() to float(), but whether or not you want to use it is up to you.
ValueError isn't a function; it's an Exception. At this point you probably don't know what Exceptions are, so just know that they are special cases that can happen, and they're often used for catching errors, such as bad input values.
In the code I posted above, the loop is always expecting numerical input. But as soon as we have input that can't be converted to a number, the program then says, "Hey, I have an exception to what we're expecting! The exception is that there's an error in the value!" Then the program, instead of continuing to the next line of code (which is number_of_inputs += 1) will then execute the block of code under the except ValueError: section. And in the code above, all it does is call break, which exits the loop.
Once out of the loop, the code prints out the total and the average.
If it weren't for the try: and except ValueError: lines in the code, then the program would abruptly end (with a lengthy error message) once someone gave a non-numerical input. That happens because the call to float() wouldn't know how to convert a value like "done" to a number, so it does nothing more than just quitting.
However, by using try: and except ValueError:, we are anticipating that someone might give non-numerical input. When that happens (which it will, when the user is finished giving inputs) -- instead of quitting -- we want an alternate action to take. And we specify that alternate action to be a simple break out of the loop -- which will allow the program to continue with whatever is after the loop.
I hope this makes sense. If it doesn't, it will make more sense once you start learning about Exceptions in Python.
Hello Fellow Developer's and Eng's:
How can I handle these two type's of input 1) when user enter "-0" and 2) When user enter minus symbol "-", within my while loop for adding nonnegative integers.
The program developed functions in the overall design, which is to add non negative integers, but it has a flaw when a user input -0 or -(minus) sign. I want to print('you have entered a negative int or a negative/minus - symbol') when these entries are made by the user.
Currently, the program continues without adding when user submit -0 in the input and there is ValueError when user just submit - symbol.
Please provide feedback.
entry = 0
sum = 0
# Request input from the user
print('This is nonnegative integer addition program. \n',)
while entry >= 0:
entry=int(input('Please enter numbers to add: '))
if entry >=0:
sum+=entry
elif entry<0 or str(entry[0])=='-' or str(entry)=='-0': # -0 nor (first index -(minus) does not work
print('You have entered a negative integer or symbol:', \
entry, ', therefore you have been exited out of the program')
print('total integer input sum =',sum)
As mentioned in the other answer. You convert your value to an int and you can no longer access the characters. I've made the program store the user_input and check that.
entry = 0
sum = 0
# Request input from the user
print('This is nonnegative integer addition program. \n',)
while entry >= 0:
user_input = input('Please enter numbers to add: ')
if '-' in user_input:
print(
'You have entered a negative integer or symbol:',
user_input,
', therefore you have been exited out of the program'
)
break
entry = int(user_input)
sum+=entry
print('total integer input sum =',sum)
In this version I store the input string as user_input and check it for a '-' symbol. I use '-' in instead of user_input[0]=='-' because input that starts with a space can still work with int.
Another thing to note, your if/elif was over specified.
if entry >=0:
sum+=entry
elif entry<0 or str(entry[0])=='-' or str(entry)=='-0':
break
In your second clause entry is guaranteed to be less than zero. So the str(entry[0]) never gets called. Thankfully because it was an error. Your if statement is equivalent to.
if entry>=0:
...
else:
...
Lastly a small point. When you have a set of brackets like in your print statment. You don't need a \ to indicate a line continuation.
print(
"one",
"two"
)
Python recognizes the open (. If you wanted to continue a string you would need it.
print("one \
two")
When you are storing the input as int entry=int(input('Please enter numbers to add: ')) the entry value is 0 because on int the is no -0 so if you want to check if the user input -0 you need to keep it as str.
You can try
entry = 0
sum = 0
print('This is nonnegative integer addition program. \n',)
while int(entry) >= 0:
entry=input('Please enter numbers to add: ')
if entry[0] !='-':
if int(entry) >= 0:
sum+=int(entry)
elif entry[0]=='-' or entry=='-0':
print('You have entered a negative integer or symbol:', \
entry, ', therefore you have been exited out of the program')
entry = -1
print('total integer input sum =',sum)
So, my exercise ask me to get inputs from the user (integer) and break the process of getting numbers once the user types "done". Then the desired output should be:
Smallest number =
Largest number =
Problem is:
I set 2 variables smallest and largest this way:
smallest = None
largest = None
But when i try to compare the user input with theses variables i get an error " TypeError: '>' not supported between instances of 'int' and 'NoneType', I tried casting the string to int an still getting the same error.
Can someone help me? Thanks,
My code so far:
largest = None
Smallest = None
while True:
num = input("Enter a number: ")
if num == "done": break
try:
val = float(num)
except:
print("Invalid input")
continue
number = int(num)
if number > largest:
largest =number
king
When the first valid input comes, the variable number is an int while the variable largest is still None. You try to compare them with '>' operator, that's why the error is thrown.
You can set the initial value of largest/smallest as the first valid number.
I am making a function sum() that is supposed to get a positive integer x from the funtion number(). The function number() should give an error if the input is negative and ask the user for another input.
def number():
try:
x = int(input('Please enter a positive number: '))
if x <= 0:
raise ValueError
except ValueError:
print('Could you please enter positive number once againg!!')
x = int(input('Enter a positive number: '))
return x
def sum(x):
print(f'Your number is {x}')
x = number()
sum(x)
I tried to run it, when I give it a negative value it asks again, but if I give it a negative number again something goes wrong. Any idea?
Please enter a positive number: -4
Could you please enter positive number once againg!!
Enter a positive number: -4
Your number is -4
That is what your code does. Try stepping through your function (either by hand or with a debugger), and you will see that this is exactly what is expected. To make the code keep asking until a positive number is obtained, you would need a while loop.
Also, it is not necessary to raise an Error since you catch it immediately after. Your code is actually equivalent to:
def number():
x = int(input('Please enter a positive number: '))
if x <= 0:
print('Could you please enter positive number once againg!!')
x = int(input('Enter a positive number: '))
return x
Program has to count positive and negative numbers and compute the average. I feel like i have the right code but maybe something is off. This was done on python idle 3.5. I would appreciate any and all help.
#Variables
total=0
pos=0
neg=0
avg=0
i=eval(input("Enter an integer, the input ends if it is 0:"))
#main
while (i!=0):
total=total+i
i=eval(input("Enter an integer, the input ends if it is 0:"))
if(i>0):
pos+=1
elif(i<0):
neg+=1
print("The number of positives is ", pos)
print("The number of negatives is ", neg)
print("The total is",total)
print("The average is ", avg)
avg=total/(pos+neg)
One Problem your code has is, that the first number you are entering does not count towards either the positive or negative counts in your loop because it is outside of it. As soon as you enter the loop you do add it to the total, but then you ask for the next number. This way your first number is never evaluated.
What you could do is a while loop that has the condition "True", so it runs every time you start the program. The evaluation on whether your input is a zero can be (and in this case must be) handled in your else/elif/else block.
If you don't include a break there you are getting an infinite loop.
You should not us eval(). The Documentation on python states this:
This function can also be used to execute arbitrary code objects (such as those created by compile()). In this case pass a code object instead of a string. If the code object has been compiled with 'exec' as the mode argument, eval()’s return value will be None.
If you use int() the program knows if it is negative or not since you compare the input to zero in your if statements.
Maybe do something like this:
#Variables
total = 0
pos = 0
neg = 0
# avg = 0 (you don't have to declare this variable since you calculate it
# anyway later on)
# removed the input from here since it did not contribute to the pos/neg count
#main
while (True):
# maybe use a while loop with the condition "True" so it runs every time
i = int(input("Enter an integer, the input ends if it is 0: "))
total = total + i
if(i > 0):
# counts 1 up if integer is positive
pos += 1
elif(i < 0):
# counts 1 up if integer is negative
neg += 1
else:
# break out of the loop as soon as none of the above conditions is true
# (since it hits a 0 as input)
# else you get an infinite loop
break
avg = total / (pos + neg)
print("The number of positives is ", pos)
print("The number of negatives is ", neg)
print("The total is ", total)
print("The average is ", avg)