Python Forum

Full Version: How to keep looping until the user input is valid ?
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Pages: 1 2
def get_valid_input(value):
    while True:
        try:
            return float(input(value))
        except ValueError:
            print('Oops, that was not a valid number. Try again...')

def calculate_set_of_cable(amp, cableSize):
    cableSize = int(cableSize)
    if cableSize not in (25, 35, 50, 70, 95, 120, 150, 195, 250, 300, 500):
        cableSize = input('Please enter a valid cable size')  # Please advise if user input wrongly, want to keep looping util the correct value.
    else:
        if cableSize == 25:
            return amp / 53
        elif cableSize == 35:
            return amp / 71
        # the code not finished yet



if __name__ == '__main__':
    while True:
        amp = get_valid_input('Please enter an Ampere:')
        cableSize = get_valid_input('Please enter the cable size:')
        set_of_cable = calculate_set_of_cable(amp, cableSize)
        print(f'The cables for {amp} are {set_of_cable:.2f} sets per phase')
        print ('The program end here, Good Luck!!\n----------------------')
Do a similar thing to which you have done in the function get_valid_input.
Create a function get_valid_cablesize loop until the cable size is in the tuple of acceptable cable sizes.
Thanks, will try!
Note: call get_valid_input from the new function because you have that part working ok already.
If you get stuck, post what you have and explain what you expect to happen and what is actually happening and any errors received in error tags.
def get_valid_input(value):
    while True:
        try:
            return float(input(value))
        except ValueError:
            print('Oops, that was not a valid number. Try again...')

def get_valid_cable_size(cableSize):
    while True:
        try:
            if cableSize in (25, 35, 50, 70, 95, 120, 150, 195, 250, 300, 500):
                return cableSize
                break
        except:
            print('Please enter a valid cable size')

def calculate_set_of_cable(amp, cableSize):
    if cableSize == 25:
        return amp / 53 #53 is current carry capacity of 25sqmm cable
    elif cableSize == 35:
        return amp / 71 #71 is current carry capacity of 35sqmm cable
        # the code not ended yet, until cable size is 500sqmm..

if __name__ == '__main__':
    while True:
        amp = get_valid_input('Please enter an Ampere:')
        cableSize = get_valid_input('Please enter the cable size:')
        cableSize = get_valid_cable_size(cableSize)
        set_of_cable = calculate_set_of_cable(amp, cableSize)
        print(f'The cables for {amp} ampere are {set_of_cable:.2f} sets per phase')
        print ('The program end here, Good Luck!!\n----------------------')
The code don't work, if I input the value not in tuple, the program doesn't loop until get corrected. Please help...I really no idea how to do that....Just 2 and half months python journey........
In your function get_valid_cable_size you dont need a try except and you are not asking for a value in your loop so it gets stuck in a n infinite loop.
do the following.
  1. start a while loop
  2. call the function get_valid_input to get a value from user input
  3. check if the value is in acceptable cable sizes
    • if it is return the value
    • else tell the user to input a correct value and it will go back to the start of this loop
This is a common question around here, so I went ahead and made a tutorial on how to do it.
def get_valid_input(value):
    while True:
        try:
            return float(input(value))
        except ValueError:
            print('Oops, that was not a valid number. Try again...')

def get_valid_cable_size(cableSize):
    while True:
        get_valid_input(cableSize)
        if cableSize in (25, 35, 50, 70, 95, 120, 150, 195, 250, 300, 500):
            break
        print('Please enter a valid cable size')
    return cableSize

def calculate_set_of_cable(amp, cableSize):
    if cableSize == 25:
        return amp / 53 #53 is current carry capacity of 25sqmm cable
    elif cableSize == 35:
        return amp / 71 #71 is current carry capacity of 35sqmm cable
        # the code not ended yet, until cable size is 500sqmm..

if __name__ == '__main__':
    while True:
        amp = get_valid_input('Please enter an Ampere:')
        #cableSize = get_valid_input('Please enter the cable size:')
        cableSize = get_valid_cable_size('Please enter the cable size...:')
        set_of_cable = calculate_set_of_cable(amp, cableSize)
        print(f'The cables for {amp} ampere are {set_of_cable:.2f} sets per phase')
        print ('The program end here, Good Luck!!\n----------------------')
If possible, please revise my code above, so that I can learn and refer for my next program.. Thanks a lot
In the function get_valid_cable_size the result of calling get_valid_input has not been assigned to the variable cableSize
Thank!, now the program works after assigned as you mentioned.
But I don't want to see unacceptable value for cable size after I input wrongly.

Please enter an Ampere:2500
Please enter the cable size...:21
Please enter a valid cable size
21
Pages: 1 2