python 这个程序在一个无效输入后退出,而不是两个,我如何修复这个问题?

t3psigkw  于 2023-04-19  发布在  Python
关注(0)|答案(3)|浏览(135)

我正在尝试编写一个程序,要求用户输入一组浮点值。当用户输入的值不是数字时,我需要给予用户另一次输入该值的机会。如果用户第二次输入非数字,我需要结束循环并输出所有输入数字的总和。预期的输出如下所示:

Enter a number, or 2 non-numbers to quit: 2
Enter a number, or 2 non-numbers to quit: 3
Enter a number, or 2 non-numbers to quit: f
Enter a number, or another non-number to quit: 1
Enter a number, or 2 non-numbers to quit: g
Enter a number, or another non-number to quit: g
The total is 6.0
Enter a number, or 2 non-numbers to quit: g
Enter a number, or another non-number to quit: g
The total is 0

下面是我的代码:

try: 
   #ask user for to input set of floating-point values
   num = input("Enter a number, or 2 non-numbers to quit: ")
   
   #keep track of sum, counts of inputs that are not floats
   sum = 0
   count = 0
   
   #while the input is a digit and the non-digit input is less than 2, enter loop
   while num.isdigit() and count < 2:
      sum += float(num)
      num = input("Enter a number, or 2 non-numbers to quit: ")
      
      if count == 2 and not num.isdigit(): 
         break
   
   print("The total is ", sum)
   
except ValueError:
      print("Invalid input. Please enter a number")

这个程序在第一个例子中输出5.0而不是6.0,因为它在一个无效输入后对值进行求和。我可以做什么改变,以便它要求用户输入另一个非数字,并继续添加到总数中,直到用户连续输入两个非数字?

1bqhqjot

1bqhqjot1#

你的程序在一个非数字输入后结束,因为你在while条件中检查了num.isdigit()。只要你输入一个.isdigit()不返回True的输入,循环就结束了。
相反,考虑在 * 无限循环 * 中阅读数字,然后决定如何处理它。请注意,当字符串包含小数点或负号时,.isdigit()返回False,这两者都可能出现在有效的float s中。您应该使用try..except来捕获非数字输入的情况。

total = 0
non_number_count = 0
while True:
    # Ask for another non-number if non_number_count is nonzero
    # If zero, ask for two non-numbers
    msg_number = "another non-number" if non_number_count else "2 non-numbers" 

    # Use an f-string to create the prompt
    user_input = input(f"Enter a number, or {msg_number} to quit: ")

    try:
        total += float(user_input)
        # A valid number was entered, so reset the count
        non_number_count = 0
    except ValueError:
        non_number_count += 1

    # 2 non-numbers were entered, so break out
    if non_number_count == 2:
        break

print(f"The total is {total}")

这给出了所需的输出:

Enter a number, or 2 non-numbers to quit: 2
Enter a number, or 2 non-numbers to quit: 3
Enter a number, or 2 non-numbers to quit: f
Enter a number, or another non-number to quit: 1
Enter a number, or 2 non-numbers to quit: g
Enter a number, or another non-number to quit: g
The total is 6.0
Enter a number, or 2 non-numbers to quit: g
Enter a number, or another non-number to quit: g
The total is 0

注:我将sum变量重命名为total。你不应该将变量命名为sum,因为这会导致它隐藏内置的sum()函数。

sqxo8psd

sqxo8psd2#

当用户输入"f"时,num.isdigit()为false,它退出while循环并点击print。
与其直接将输入存储在num中,不如先尝试存储在另一个变量中,只有在确定它是一个数字后才将其添加到求和中。

zmeyuzjn

zmeyuzjn3#

使用类型函数,找到他们输入的类型,然后创建一个if函数。如果是float,则程序继续,如果是str,则程序通过中断while true循环而停止。
另外,我建议你不要在if语句中使用and,它给我带来了很多问题,有时候并不能完全工作。

相关问题