我开始学习Python 并尝试构建一个简单的calculator。我想让我的程序检查 number_1
和 number_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()
回答1
不要对这种循环使用递归。请记住,每次递归调用都会使用越来越多的内存来保存所有新的局部变量。
此外,您的“错误输入”子句永远不会被击中——您已经检查过操作员是您支持的操作员之一。
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
回答2
float()
将总是返回一个 float
或引发一个 ValueError
,因此在调用 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
回答3
也许这可以帮助你,是一个单独的函数,如果给定的数字是浮点数,则返回 True 或 False
def is_float(number):
if isinstance(number, float):
return True
else:
return False
您可以像这样在代码中调用它,在这种情况下将数字 number_1 作为参数传递:
if is_float(number_1):
# do something
回答4
type()
方法返回作为参数传递的参数的类类型。您必须检查返回的类类型是否是类的实例,float。
你可以这样做,isinstance(number_1, float)
这将返回一个布尔值 value。如果 number_1
是浮点 value,它将返回 True
,否则将返回 False
。
回答5
您的 possible_classes
列表是字符串列表,而不是类。 "<class 'int'>"
是 type
对象的字符串表示形式,而不是类型对象本身,因此 type(1) in ["<class 'int'>"]
将始终返回 False
。
我建议使用其他一些人建议的 try/except 方法或将 isinstance()
用于单个类,但是如果您特别想检查多个类的列表,则可以使用以下方法:
possible_classes = [float, int]
# instead of possible_classes = ["<class 'float'>", "<class 'int'>"]
if type(var) not in possible_classes:
# ...
回答6
您可以使用 .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()
检查字符串中的所有内容是否都是数字。如果是则返回 True
否则返回 False
请注意,如果该数字有小数点,它将返回 False
。您可以拆分小数点后面的数字和小数点前面的数字,然后检查它们是否都是数字。但是你最好只使用 try-except
语句。但是如果你只想要整数,那么 .isnumeric()
非常适合你
这应该工作,谢谢。