1

I'm looking to create code which requires an integer greater than 2 to be input by a user before continuing. I'm using python 3.3. Here's what I have so far:

def is_integer(x):
    try:
        int(x)
        return False
    except ValueError:
        print('Please enter an integer above 2')
        return True

maximum_number_input = input("Maximum Number: ")

while is_integer(maximum_number_input):
    maximum_number_input = input("Maximum Number: ")

    print('You have successfully entered a valid number')

What I'm not sure about is how best to put in the condition that the integer must be greater than 2. I've only just started learning python but want to get into good habits.

Jon Clements
  • 138,671
  • 33
  • 247
  • 280
nathangrand
  • 21
  • 1
  • 1
  • 2
  • `int(x)` can succeed for both integer and non-integer values. Even so, your function should really be called `is_not_integer` as defined. – chepner Oct 03 '13 at 11:36

7 Answers7

5

This should do the job:

def valid_user_input(x):
    try:
        return int(x) > 2
    except ValueError:
        return False

maximum_number_input = input("Maximum Number: ")

while valid_user_input(maximum_number_input):
    maximum_number_input = input("Maximum Number: ")
    print("You have successfully entered a valid number")

Or even shorter:

def valid_user_input():
    try:
        return int(input("Maximum Number: ")) > 2
    except ValueError:
        return False

while valid_user_input():
    print('You have successfully entered a valid number')
SpoonMeiser
  • 19,918
  • 8
  • 50
  • 68
Roman Bodnarchuk
  • 29,461
  • 12
  • 59
  • 75
1
def take_user_in():
    try:
        return int(raw_input("Enter a value greater than 2 -> "))  # Taking user input and converting to string
    except ValueError as e:  # Catching the exception, that possibly, a inconvertible string could be given
        print "Please enter a number as" + str(e) + " as a number"
        return None


if __name__ == '__main__':  # Somethign akin to having a main function in Python

    # Structure like a do-whole loop
    # func()
    # while()
    #     func()
    var = take_user_in()  # Taking user data
    while not isinstance(var, int) or var < 2:  # Making sure that data is an int and more than 2
        var = take_user_in()  # Taking user input again for invalid input

    print "Thank you"  # Success
Games Brainiac
  • 80,178
  • 33
  • 141
  • 199
1

My take:

from itertools import dropwhile
from numbers import Integral
from functools import partial
from ast import literal_eval

def value_if_type(obj, of_type=(Integral,)):
    try:
        value = literal_eval(obj)
        if isinstance(value, of_type):
            return value
    except ValueError:
        return None

inputs = map(partial(value_if_type), iter(lambda: input('Input int > 2'), object()))

gt2 = next(dropwhile(lambda L: L <= 2, inputs))
Jon Clements
  • 138,671
  • 33
  • 247
  • 280
0
def check_value(some_value):
    try:
       y = int(some_value)
    except ValueError:
       return False
    return y > 2 
chepner
  • 497,756
  • 71
  • 530
  • 681
Burhan Khalid
  • 169,990
  • 18
  • 245
  • 284
0

This verifies that the input is an integer, but does reject values that look like integers (like 3.0):

def is_valid(x):
    return isinstance(x,int) and x > 2

x = 0
while not is_valid(x):
    # In Python 2.x, use raw_input() instead of input()
    x = input("Please enter an integer greater than 2: ")
    try:
        x = int(x)
    except ValueError:
        continue
chepner
  • 497,756
  • 71
  • 530
  • 681
0

Hope this helps

import str
def validate(s):       
    return str.isdigit(s) and int(s) > 2
  • str.isdidig() will eliminate all strings containing non-integers, floats ('.') and negatives ('-') (which are less than 2)
  • int(user_input) confirms that it's an integer greater than 2
  • returns True if both are True
Art Knipe
  • 99
  • 1
  • 6
0

The problem with using the int() built-in shown in other answers is that it will convert float and booleans to integers, so it's not really a check that your argument was an integer.

It's tempting to use the built-in isinstance(value, int) method on its own, but unfortunately, it will return True if passed a boolean. So here's my short and sweet Python 3.7 solution if you want strict type checking:

def is_integer(value):
    if isinstance(value, bool):
        return False
    else:
        return isinstance(value, int)

Results:

is_integer(True)  --> False
is_integer(False) --> False
is_integer(0.0)   --> False
is_integer(0)     --> True
is_integer((12))  --> True
is_integer((12,)) --> False
is_integer([0])   --> False

etc...

user2788525
  • 219
  • 2
  • 4