Lisa
Lisa

Reputation: 15

Python limit input

I'm having some trouble, I want to limit the input to only integers, positive numbers, and also not zero. Now I have written these two functions and I don't want to allow the user to put in any value. My code is not recognizing my if-statement. Only the integer/float statement. What should I do?

correct_value = False
while not correct_value:
    try:
        a_1 = int(input("what is the first number in the arithmetic progression?"))
        d = int(input("what is the differential?"))
        g_1 = int(input("what is the first number in the geometrical progression?"))
        q = int(input("what is the ratio?"))
        n= int(input("what is the number of terms?"))

        if a_1 <= 0:
             raise ValueError ("The value can't be negative and not zero") 
        
        correct_value = True
    except ValueError:
            print("It needs to be an integer, try again.")
            
        

Upvotes: 1

Views: 1137

Answers (2)

jsbueno
jsbueno

Reputation: 110186

One of the best things about programming is that for any repetitive task on the human side, you can put the burden on the computer instead.

So, if for each pice of data you are: calling the built-in input, converting its result to integer, checking if the value is positive and non zero - the best way to go is to group these functionalities in a single function and then you just call that function - your main application then delegates the part of acquiring clean numbers, and becomes much simpler:


def int_input(prompt_message):
    done = False
    while not done:
        value_str = input(prompt_message)
        try:
            value = int(value_str)
        except ValueError:
            print("Please, type a valid integer number!")
            continue
        if value < 1:
            print("Please type a strictly positive number!")
            continue
        done = True
    return value

This is a bit verbose, on purpose, so it is clear that once you create a function, you can add as many simple steps as needed to do your subtask (including writing further sub-functions to be called).

Once you have that function, your program can be rewritten as:

print("To calculate the sum of the arithmetic and geometric progression, you need to know the first element in the sequence of numbers, the differential, ratio and number of terms.")

a_1 = int_input("what is the first number in the arithmetic progression?")
d = int_input("what is the differential?")
g_1 = int_input("what is the first number in the geometrical progression?")
q = int_input("what is the ratio?")
n= int_input("what is the number of terms?")

# proceed to calculations:
...

And each variable is guaranteed to contain a proper positive integer, with the user being prompted until they type a suitable value, for each of them, at no cost of extra typing for each value.

As for your code: it looks all right, but for the fact that it only checks the value on a_1 for being strictly positive - so youp´d have to modify the if clause to check all the variables. (or add one if clause for each variable) - and still: it would collect all input first, and then check for negative numbers or zero.

Upvotes: 2

balderman
balderman

Reputation: 23815

Use the code below (get_positive_int). It returns a tuple where the first element is a Boolean that tells if you get a positive int or not. In case the first element is True the int can be found in the second element.

from typing import Tuple


def get_positive_int(value: str) -> Tuple[bool, int]:
    try:
        int_val: int = int(value)
        if int_val > 0:
            return True, int_val
        else:
            return False, int_val
    except ValueError:
        return False, 0

print(get_positive_int('ttt'))
print(get_positive_int('-3'))
print(get_positive_int('3'))

output

(False, 0)
(False, -3)
(True, 3)

Upvotes: 0

Related Questions