У меня проблемы, я хочу ограничить ввод только целыми числами, положительными числами, а также не нулем. Теперь я написал эти две функции и не хочу позволять пользователю вводить какие-либо значения. Мой код не распознает мой оператор if. Только оператор integer / float. Что я должен делать?

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.")
            
        
1
Lisa 22 Сен 2021 в 17:55

2 ответа

Лучший ответ

Одна из лучших вещей в программировании заключается в том, что для выполнения любой повторяющейся задачи, выполняемой человеком, вы можете вместо этого переложить бремя на компьютер.

Итак, если для каждой части данных вы: вызываете встроенный ввод, преобразуете его результат в целое число, проверяете, является ли значение положительным и ненулевым - лучший способ пойти - сгруппировать эти функции в один function , а затем вы просто вызываете эту функцию - ваше основное приложение затем делегирует часть получения чистых чисел и становится намного проще:


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

Это намеренно немного многословно, поэтому ясно, что после создания функции вы можете добавить столько простых шагов, сколько необходимо для выполнения вашей подзадачи (включая написание дополнительных вызываемых подфункций).

Когда у вас есть эта функция, ваша программа может быть переписана как:

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:
...

И каждая переменная гарантированно содержит правильное положительное целое число, при этом пользователю будет предлагаться до тех пор, пока он не введет подходящее значение для каждого из них, без дополнительных затрат на ввод для каждого значения.

Что касается вашего кода: он выглядит нормально, но с учетом того факта, что он проверяет только значение на a_1 на то, чтобы быть строго положительным, поэтому вам придется изменить предложение if, чтобы проверить все переменные . (или добавьте по одному предложению if для каждой переменной) - и тем не менее: сначала он будет собирать все вводимые данные, а затем проверять наличие отрицательных чисел или нуля.

1
jsbueno 22 Сен 2021 в 15:19

Используйте приведенный ниже код (get_positive_int). Он возвращает кортеж, в котором первым элементом является логическое значение, которое сообщает, получили ли вы положительное int или нет. В случае, если первым элементом является True, int можно найти во втором элементе.

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'))

Выход

(False, 0)
(False, -3)
(True, 3)
0
balderman 22 Сен 2021 в 15:15