hemmy
hemmy

Reputation: 157

Python excepting input only if in range

Hi I want to get a number from user and only except input within a certain range.

The below appears to work but I am a noob and thought whilst it works there is no doubt a more elegant example... just trying not to fall into bad habits!

One thing I have noticed is when I run the program CTL+C will not break me out of the loop and raises the exception instead.

while True:
  try:
    input = int(raw_input('Pick a number in range 1-10 >>> '))
    # Check if input is in range
    if input in range(1,10):
      break
    else:
      print 'Out of range. Try again'
  except:
    print ("That's not a number")

All help greatly appreciated.

Upvotes: 6

Views: 43981

Answers (3)

ger zen
ger zen

Reputation: 1

You can use this code:

def read_int(prompt, min, max):
    while True:
        try:
            val = int(input(prompt))
        except ValueError:
            print('Error: wrong input')
        else:
            if(min <= val < max): # this is faster
                break
            else:
                print('Error: the value is not within permitted range (min..max)')
    return val    


v = read_int("Enter a number from -10 to 10: ", -10, 10)

print("The number is:", v)

Upvotes: -2

dav1d
dav1d

Reputation: 6055

Ctrl+C raises a KeyboardInterruptException, your try … except block catches this:

while True:
   try:
       input = int(raw_input('Pick a number in range 1-10 >>> '))
   except ValueError: # just catch the exceptions you know!
       print 'That\'s not a number!'
   else:
       if 1 <= input < 10: # this is faster
           break
       else:
           print 'Out of range. Try again'

Generally, you should just catch the exceptions you expect to happen (so no side effects appear, like your Ctrl+C problem). Also you should keep the try … except block as short as possible.

Upvotes: 7

Levon
Levon

Reputation: 143047

There are several items in your code that could be improved.

(1) Most importantly, it's not a good idea to just catch a generic exception, you should catch a specific one you are looking for, and generally have as short of a try-block as you can.

(2) Also,

  if input in range(1,10):

would better be coded as

  if 1 <= input < 10:

as currently function range() repeatedly creates a list of values form 1 to 9, which is probably not what you want or need. Also, do you want to include value 10? Your prompt seems to imply that, so then you need to adjust your call to range(1, 11), as the list generated will not include the upper-range value. and the if-statement should be changed to if 1 <= input <= 10:

Upvotes: 1

Related Questions