1

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.")
            
        
4
  • try this assert a_1 <= 0 and then catch AssertionError Commented Sep 22, 2021 at 14:57
  • I tried it, the if-statement works for me Commented Sep 22, 2021 at 15:01
  • your exceptions are quite brutals... you can use also break and continue keywords inside a loop to modify the flow of execution Commented Sep 22, 2021 at 15:09
  • You are raising a ValueError with one message, and catching it to print a different message. This means that your ValueError message will not be seen. Commented Sep 22, 2021 at 15:14

2 Answers 2

2

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.

Sign up to request clarification or add additional context in comments.

Comments

0

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)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.