检查输入是否为浮点数

check if an input is a float

我开始学习 Python 并尝试构建一个简单的计算器。我想让我的程序检查 number_1number_2 是否真的是浮点数,如果不是,则重新开始计算。有人知道我的问题的解决方案吗?

def calculate():

    operator = input("What operator do you wanna use(*,/,+,-)? ")
    possible_op = ["*", "+", "-", "/"]
    possible_classes = ["<class 'float'>", "<class 'int'>"]

    if operator not in possible_op:
        calculate()
    number_1 = float(input("What is your first number? "))
    if number_1.type != "Float" or "Int":
        calculate()
    number_2 = float(input("What is your second number? "))
    if (type(number_2)) not in possible_classes:
        calculate()

    
    if operator == "+":
        print(number_1 + number_2) 
    elif operator == "-":
        print(number_1 - number_2) 
    elif operator == "*":
        print(number_1 *  number_2) 
    elif operator == "/":
        print(number_1 / number_2) 
    else:
        print("Wrong Input")
        calculate()

    again()

float() 将始终 return 一个 float 或引发一个 ValueError,因此没有必要在你之后检查 return 的类型呼叫 float();要么它是 float 要么你永远不会到达那行代码,因为未捕获的异常将结束函数的执行。相反,您想使用 try/except:

    try:
        number_1 = float(input("What is your first number? "))
        number_2 = float(input("What is your second number? "))
    except ValueError:
        return calculate()

请注意,在 Python 中使用递归循环通常不是一个好主意,因为 Python 不像许多其他语言那样优化尾调用。相反,您应该使用 while,例如:

possible_op = {
    "*": float.__mul__,
    "+": float.__add__,
    "-": float.__sub__,
    "/": float.__truediv__,
}

while True:
    operator = input("What operator do you wanna use(*,/,+,-)? ")
    if operator not in possible_op:
        continue
    try:
        number_1 = float(input("What is your first number? "))
        number_2 = float(input("What is your second number? "))
    except ValueError:
        continue

    print(possible_op[operator](number_1, number_2))
    break

不要对这种循环使用递归。请记住,每次递归调用都会使用越来越多的内存来保存所有新的局部变量。

此外,您的“错误输入”子句永远不会被击中 -- 您已经检查过该运算符是您支持的运算符之一。

def calculate():
    while True:
        operator = input("What operator do you wanna use(*,/,+,-)? ")
        possible_op = "+-*/"

        if operator not in possible_op:
            continue
        try:
            number_1 = float(input("What is your first number? "))
            number_2 = float(input("What is your second number? "))
        except ValueError:
            continue
    
        if operator == "+":
            print(number_1 + number_2) 
        elif operator == "-":
            print(number_1 - number_2) 
        elif operator == "*":
            print(number_1 *  number_2) 
        elif operator == "/":
            print(number_1 / number_2) 
        break

type() 方法 returns 作为参数传递的参数的 class 类型。您必须检查 returned class 类型是否是 class、float.

的实例

你可以这样做, isinstance(number_1, float)

这将 return 一个布尔值。如果 number_1 是浮点值,它将 return True,否则它将 return False.

也许这可以帮助你,是一个单独的函数,如果给定的数字是浮点数 return True or False

def is_float(number):
  if isinstance(number, float):
     return True
  else:
     return False

您可以像这样在您的代码中调用它,在这种情况下您将数字 number_1 作为参数传递:

if is_float(number_1):
  # do something

您可以使用 .isnumeric() 检查用户是否输入了数字,方法如下:

number1 = input("What is your first number? ")
number2 = input("What is your second number? ")

if number1.isnumeric() and number2.isnumeric():
    number1 = float(number1)
    number2 = float(number2)

.isnumeric() 检查字符串中的所有内容是否都是数字。如果是这样它 returns True 否则它 returns False

请注意,如果该数字有小数点,它将 return False。您可以拆分小数点后面的数字和小数点前面的数字,然后检查它们是否都是数字。但是最好只使用 try-except 语句。但是,如果您只想要整数,那么 .isnumeric() 非常适合您

那应该可以,谢谢。

您的 possible_classes 列表是字符串列表,而不是 class。 "<class 'int'>"type 对象的字符串表示,而不是类型对象本身,因此 type(1) in ["<class 'int'>"] 总是 return False.

我建议使用其他一些人建议的 try/except 方法或对单个 class 使用 isinstance(),但如果您特别想检查多个列表class是的,像这样的东西可以工作:

possible_classes = [float, int]
# instead of possible_classes = ["<class 'float'>", "<class 'int'>"]

if type(var) not in possible_classes:
    # ...