except ValueError not tripping Python 3.4 - python

Alright so I'm trying to basically prevent someone from typing a string value into the field:
#User selection
print("Which program would you like to run?")
print("(Type '9' if you wish to exit the menu)")
selection = int(input())
print()
#Security statement followed by case statement
while selection <= 0 or selection >= 10:
try:
print("That is an invalid selection, please input a proper selection.")
print("Which program would you like to run?")
selection = int(input())
print()
except ValueError:
print("Cmon man")
Plain and simple, it's not running. I've tried reorganizing everything and I haven't found a proper solution. Been looking around for almost an hour now. No help to the issue. Any kind souls?
Ignore the case statement portion btw, that's not even written yet.
P.S. Just keep getting usual "String isn't a number durr" response
("ValueError: invalid literal for int() with base 10: 'why'")
P.P.S. Issue is already pointed out. I'm apparently stupidly oblivious lol... Thanks for the help.

Your try...except doesn't cover the initial user input and so the ValueError isn't actually caught.
If you enter an int outside the bounds defined (0 >= x >= 10) as the first input then you can see the try...except blocks working.
You'll need to refactor your code so that the first input request is inside your try block and the loop or wrap the existing input request in another try...except.
Also, as a side note, input() can take a string argument that will be displayed as a prompt to the user.
selection = int(input("Which program would you like to run? "))

Related

Why is my if statement not executing when I start my code?

I'm a beginner programmer just starting out and learning and I'm wondering why my code finishes after the first line. If anyone can let me know what is wrong with it, would be greatly appreciated.
I wanted it to print my if statements properly but I'm not sure what's going on.
x = 10
try:
(input("Type in a number:"))
except ValueError:
print('Correct!')
if x > 10:
print('X is bigger than the number given')
if x < 10:
print('X is smaller than the number given')
Since you stated that you're a new programmer (welcome! we've all been in your shoes at one point), I'm going to assume from looking at your code that the goal of your game is to have a "magic number" that is set ahead of time, and you want the user to try and guess it. In general, good programs are self-documenting, meaning the code is written in a way that clearly describes what it does. Comments are also helpful. Take a note of the changes I made to your program and how they help you understand what's going on:
"""
* This comment is known as a module docstring
and describes the module, the file in this case
* guessing_game.py is a command-line game
where users try to guess a random number
while getting hints about their guess.
"""
magic_number = 42 # set this before running the program
while (guess := int(input('enter a guess: '))) != magic_number:
# * use a while loop to loop until the correct answer is entered.
# NOTE: the "walrus operator `:=` is used for consiceness.
# the walrus operator requires python >= 3.8
if guess > magic_number:
print('Too high!')
else:
print('Too low!')
print('You win!')
Now, kuwl, I challenge you to try the following on your own:
generate magic_number automatically when the program starts.
hint: https://docs.python.org/3/library/random.html
Set a special number, called a "sentinel value" in computer science, that will terminate the loop if the user wants to quit before guessing the correct number.
Set a limit on the number of attempts the player can make before he/she "loses". This can be done in several ways, try and think of a few!
Allow users to quit the game with ctrl-c, which is a common way to exit command-line programs like yours. Try catching the exception that gets "thrown" when a users hits ctrl-c gracefully and print a message like "thanks for playing, come again!"
Those changes will introduce you to a lot of key concepts in programming like importing packages, handling exceptions, and writing comments and self-documenting code. If you get stuck, try googling your question. There's a good chance many others have asked the same before. It's a valuable skill in programming to be able to write good questions, both to a search engine and to another human. If you're still stuck, ask a comment on this post and I'll do my best to answer it.
Happy hacking!
You will never get a ValueError in this program from this line input("Type in a number:")
Corrected code:
x = 10
try:
x = input("Type in a number:")
print('Correct!')
except ValueError:
if x > 10:
print('X is bigger than the number given')
if x < 10:
print('X is smaller than the number given')
You can simply do:
x = 10
x = input("Type in a number:")
if x.isnumeric() : # checks if x is numeric or not
print('Correct!')
if x > 10:
print('X is bigger than the number given')
if x < 10:
print('X is smaller than the number given')

How do you prevent user from entering gibberish into user input and prevent them from using all caps or all lower case letters?

I am trying to make an input that would prevent a user entering an input like this "QWERTY" this "qwerty" or this "QW3RTY"
The input is for names so I want to make sure that it would need the user to have a capital letter at the start of their name "John" not "john"
I have tried to loop the question using while True: try and attempted to use .isalpha and .title but I couldnt seem to make it work
while True:
try:
name = input(str("What is your name? "))
if name is not name.isalpha:
print("Please Enter a Valid name")
continue
if name is not name.title:
print("Please have a capital letter at the start of your name!")
continue
else:
break
I expected for the if statements to work but it comes up with invalid syntax.
Your logic is faulty ... but you've replicated it, even though the first if failed. Correct your problems one at a time, rather than trying to write the whole program at once.
name is a string; name.isalpha is a function.
A string cannot ever be identical to a function.
I think what you want is
if name.isalpha():
Also, try requires an except clause to catch exceptions. Again, add program features individually. That way, when you hit an error, you'll be fixing only that one error.
See this lovely debug blog for help.
Implementing features one at a time is a much better place to start than to try to catch everything all at once. Also, make sure to call your functions, otherwise, they will be truthy:
if str:
print("True!")
else:
print("False!")
True!
# compared to
if str():
print("True!")
else:
print("False!")
False!
Functions are objects, and will not act Falsey.
while True:
name = input("What is your name? ") # no need for str function here
# you can wrap this whole thing in a
# try/except for ValueError
try:
if name.isupper() or name.islower() or not name == name.title():
raise ValueError("Please include proper capitalization")
elif not name.isalpha():
raise ValueError("Use only alphabetical characters, please")
else:
break
except ValueError as e:
print(e)

How to implement "if error occurs do not implement this code"?

I want to write a code in python that basically does something like this:
if error occurs while implementing int(a) print('valid character')
elif no error occurs while implementing int(a) print('invalid character')
a is an input.
I want to make a simple hangman game and if the input is not a letter I want a certain message to be displayed. I tried using if a==int(), but inputs are always a string.
Normally you would use a Try, Except clause to handle errors, but because you're not actually getting an error -- you just want to know if the input is an alphabetical character or not, you would use the string.isalpha function.
guess = input()
if not guess.isalpha():
print('You must supply an alphabetical character')
else:
#the rest of your code would go here
Now to have some fun. This is how you would implement exactly what you where asking, however, please note that this does not catch punctuation characters, emoji characters, and any other random characters that are none-numeric and non-alphabetical.
guess = input()
isOk = False
try:
int(guess)
except ValueError:
isOk = True
if not isOk:
print("you cannot enter a number")
I don't know if it's a good idea to mention this or not, because it's a pretty quirky feature of Python to add the else here, but you can technically condense the above code to
guess = input()
try:
int(guess)
except ValueError:
# All good
pass
else:
# we where able to cast to an integer = bad
print("you cannot enter a number")
but I probably wouldn't ever do that in production code. Also, an important note. As you learn about try except clauses. Even though it's possible to just do except: Make sure you always state whatever you are catching. In this case a ValueError except ValueError: . If you don't do this, you suppress all errors, and you risk getting into a situation down the road were an important error gets suppressed, and you have no idea why your program is behaving incorrectly.
explore try-except designs
try:
# do something here
except (ErrorName):
# error catching
print("invalid character")
Please try and include reproducible code, or a code block of pseudo-code so others can follow along easier!

Try except recursion or while loop?

I am doing a python course where they suggested a try and except block in a while loop in order to keep asking for input until the condition is satisfied. Intuitively I feel it is shorter to just call the function again in the "except" block like this:
def exceptiontest():
try:
print(int(input("number 1: "))+int(input("number 2:")))
except:
print("a mistake happened")
exceptiontest()
exceptiontest()
When asking on the forum on the course I got the reply that it is not the same. I am a bit confused now. Anyone that can clarify for me? Thanks in advance!
Calling the function in the except will eventually raise a RecursionError: maximum recursion depth exceeded error if you keep entering bad inputs. Generally must humans won't be entering that many bad data to hit the error before they give up, but you are unnecessarily putting function calls on a stack.
A while loop is better since it's one function call, waiting for a valid input. IT doesn't waste any more resources than it needs.
while loop, for two reasons
it's clearer to read: while not success, try again
recursion is not free. It leaves the previous function stack open. it could run out of memory (probably won't, in this case, but in principle, avoid it)
Another reason to use the while loop which has not yet been mentioned is that you could leverage the assignment expressions coming with Python 3.8.
The function add encapsulates getting two numbers and trying to add them.
def add():
'try to add two numbers from user input, return None on failure'
x = input('number 1: ')
y = input('number 2: ')
try:
return float(x) + float(y)
except TypeError, ValueError:
return None
The following while loop runs as long as there is no result.
while (result := add()) is None:
print('you made a mistake, make sure to input two numbers!')
# use result

Input strings and integers

Just a quick question because I really can't find a simple solution to my problem.
Is there a way to get a user input that is meant to be a integer, but when a string is entered
the program will not break and instead displays "Error"
I've been trying to work around it by converting strings to integers and vice-versa, but I constantly get "invalid literal for int() with base 10" error, or when it displays "Error" it does so in an infinite loop.
Here's my code just to help clear the question
choice = input("Enter your choice: ")
while choice != 3:
if choice == 1:
get_songs()
print
main()
elif choice == 2:
read_songs()
print
main()
else:
print "Invalid choice"
So essentially I want the else operation to work for strings as well as for an integer that is greater than 3 or less than 1.
but I constantly get "invalid literal for int() with base 10" error
You get an exception, specifically a ValueError. You can catch the exception using an except block. For more info, refer to whatever language tutorial you've been using thus far, or try Google for except block Python.
when it displays "Error" it does so in an infinite loop.
When you detect that the input isn't correct, you need to get new input before you try the loop again. Put the input-getting stuff inside your loop. Do not use recursion (calling main() from within main) in addition to the loop; you're only going to confuse yourself this way. Because you don't get a value for choice until you're inside the loop, it's easier to explicitly break out of the loop when you find the appropriate choice value, instead of trying to control the loop with it (i.e. testing for it in the while condition).
We can also use continue to simplify the loop structure: instead of doing all the work in the try block, we limit that to the part where we extract a number. We use continue in the except block to skip the rest of the loop when we don't have an actual number, and only do the rest of the loop when we do. (After all, maybe the code we call for choice == 1 or choice == 2 could raise ValueError for some totally different reason, and we'd want to do something different about that.)
while True:
try:
choice = int(raw_input("Give me a number"))
except ValueError:
print "Could you at least give me an actual number?"
continue
if choice == 1:
do_something()
elif choice == 2:
do_something_else()
elif choice == 3:
break
else:
print "Try a different number"
Since that choice always != 3, you will get an infinite loop.
You should get input again if it jumps into the "else" condition.
In your code, the while loop should encapsulate the input() line. The following is a clearer alternative, however:
Create a function which gets user input:
def getInteger(prompt):
while True:
userIn = input(prompt)
try:
return int(userIn)
except ValueError:
print "Error"
Here's something: I dislike making the user enter "" around the strings.
ch = raw_input("Enter choice: ")
#ch *is* a string at this point
if ch.isdigit():
choice = int(ch)
else:
print "Invalid choice"
Edit (from comments):
isdigit may not handle locale encoding correctly. In Python 3, you can use isdecimal instead.
— J.F. Sebastian

Categories