尝试在接受 int 和 str 值的同时中断计算器程序的 while 循环

Trying to break in a while loop for a calculator program while accepting int and str values

我在学习python的同时正在制作一个计算器程序,我在高中学习了Java,还不知道任何高级的python函数,所以不要尝试使用任何太高级的东西,但让我们解决我的问题。抱歉,如果这个问题组织不当,我从来没有在这里发帖。整个程序将在底部。

我卡住的地方是我让用户输入他们想要使用的运算符,然后它要求输入数字 1 和数字 2。如果用户键入 'exit' 或 'stop'然后程序随时退出,对于操作员部分,它可以正常退出并显示退出消息。但是当为 num1 或 num2 输入 exit 时,我没有得到我想要的响应,我在玩它时遇到很多错误,但主要是像 num 是 int 不能有字符串值,num 是 str 不能有 int,或者它接受 'exit'/'stop' 但随后转到 num2,然后在向 num2

输入任何内容后抛出错误
operator = (input("Would you like to add(+), subtract(-), multiply(*), divide(/) or use exponents(**)? "))

if operator.lower() == 'exit' or operator.lower() == 'stop':
    break                       #this part works fine and as intended

num1 = eval(input("Enter number 1: "))
if num1 == str() and (num1.lower() == 'exit' or num1.lower() == 'stop'):
    break                       #this part however doesnt work because i have int and str in the same variable

num2 = eval(input("Enter number 2: "))
if num2 == str() and (num2.lower() == 'exit' or num2.lower() == 'stop'):
    break

我尝试过将 float、str 或 int 用于 nums,弄乱 if 语句的位置,我希望能够接受 'exit' 或 'stop' 作为 num 的值然后退出 while 循环,该循环结束程序,但我试了一个小时左右,但无法弄清楚。所以我的问题又是我需要 num1 和 num2 值能够接受 str 和 int 并在它们等于 'stop' 或 'exit'

时结束程序
operator = ''
num1 = ''
num2 = ''
while True:
    operator = (input("Would you like to add(+), subtract(-), multiply(*), divide(/) or use exponents(**)? "))

    if operator.lower() == 'exit' or operator.lower() == 'stop':
        break

    num1 = eval(input("Enter number 1: "))
    if num1 == str() and (num1.lower() == 'exit' or num1.lower() == 'stop'):
        break

    num2 = eval(input("Enter number 2: "))
    if num2 == str() and (num2.lower() == 'exit' or num2.lower() == 'stop'):
        break

    oldNum2 = num2

    if operator == 'add' or operator == '+':
        answer = num1 + num2
        print(num1, '+', num2, '=', answer)

    elif operator == 'subtract' or operator == '-':
        answer = num1 - num2
        print(num1, '-', num2, '=', answer)

    elif operator == 'multiply' or operator == '*':
        answer = num1 * num2
        print(num1, '*', num2, '=', answer)

    elif operator == 'divide' or operator == '/':
        answer = num1 / num2
        print(num1, '/', num2, '=', answer)

    elif operator == 'exponents' or operator == '**':
        answer = num1 ** num2
        print(num1, '**', num2, '=', answer)

    else:
        print('Please type a valid operator...')
print('Program has exited due to user input.')

基本上只是将 num1num2 视为字符串,直到您知道它们不是 stopexit,然后从中解析出数字:

def isExitCommand(userInput):
  return userInput.lower() == 'exit' or userInput.lower() == 'stop'

while True:
  operator = str(input("Would you like to add(+), subtract(-), multiply(*), divide(/) or use exponents(**)? "))

  if isExitCommand(operator):
      break                       #this part works fine and as intended

  num1 = input("Enter number 1: ")
  if isExitCommand(num1):
      break
  else:
    num1 = float(num1)             

  num2 = input("Enter number 2: ")
  if isExitCommand(num2):
      break
  else:
    num2 = float(num2)

  print("You entered {} {} {}".format(num1, operator, num2))

此外,无需检查输入是否为字符串,但如果确实需要,则 num1 == str() 不正确。 str() 只是给出一个空字符串。你想 isinstance(s, str) 而不是 Python 3.x

您的问题可能有很多答案,但我要做的是去掉 eval() 并只处理 input(),因为它始终是字符串格式。

num1 = input("Enter number 1: ")
if num1.lower() == 'exit' or num1.lower() == 'stop':
    break
    
num2 = input("Enter number 2: ")
if num2.lower() == 'exit' or num2.lower() == 'stop':
    break

但由于 num1num2 在 if 语句之后都是字符串格式,请确保将它们转换为整数(或浮点数)

num1 = int(num1)
num2 = int(num2)

您的功能问题出现在这些验证检查的开始:

if num1 == str() and ...

你刚刚没有通过检查,就在那里。我 认为 您正在尝试检查 eval 之后的输入类型(顺便说一句,这是一个 baaaaaad 函数)。

str() 是将空参数转换为字符串的调用。这 returns 一个空字符串。因为这不等于任何 non-empty 输入,所以你失败了。

而是使用为此目的提供的函数:

if isinstance(num1, str)

更好的是,在尝试转换之前检查值:

user_input = input("What would you like to do?")
if user_input in ("stop", "exit"):
    break