【问题标题】:Python: if statements under exceptPython:在 except 下的 if 语句
【发布时间】:2016-03-05 19:04:35
【问题描述】:

我有一个空列表 n。 n 应该有 10 个取自用户的浮点值。如果用户输入 e,代码应该跳出循环。如果用户输入任何其他文本(不是数字),它应该显示“不是数字”并继续从用户那里获取值。我尝试了以下代码。当我输入 e 作为输入时,代码不会跳出 for 循环并总是转到 else 块并显示“不是数字”。我该如何纠正这个问题?

n = []
for i in range(10):
    try:
        inp_val = float(input('Enter value (e to exit)'))
        n.append(inp_val)

    except ValueError:
        if inp_val == 'e'
            break
        else:
            print("not a number")
            continue

【问题讨论】:

  • 您的 if 中有语法错误,如果用户立即输入 e,您将遇到未定义的错误。如果有错误,你也不会得到 10 个数字
  • 很少有问题,但我认为您缺少的一个大问题是如果 float(input('Enter value (e to exit)')) 引发错误,则 inp_val 永远不会分配的。我看到下面开始形成一些答案,所以我不会费心添加一个。
  • @user3535492,当您尝试获取包含 10 个数字的列表时,为什么还要提供退出选项?

标签: python exception try-catch


【解决方案1】:
inp_val = float(input('Enter value (e to exit)'))

这是这样执行的:

temp_val = input('Enter value (e to exit)')
temp_val = float(temp_val)
inp_val = temp_val

所以在ValueError 被提出时,因为您正在尝试转换'e'inp_val 尚未分配。因此,当您在 except 块中检查 inp_val 的值时,您并没有比较输入的值。

为此,您实际上需要单独存储字符串输入:

try:
    text_input = input('Enter value (e to exit)')
    inp_val = float(text_input)
    n.append(inp_val)
except ValueError:
    if text_input == 'e':
        break
    else:
        print("not a number")
        continue

【讨论】:

    【解决方案2】:

    inp_val 设置为 float 值,因此它永远不能是 e。解决此问题的一种方法是将inp_val 分配给输入的值,并在附加列表时将其转换为浮点数:

    n = []
    for i in range(10):
        try:
            inp_val = input('Enter value (e to exit)')
            n.append(float(inp_val))
    
        except ValueError:
            if inp_val == 'e'
                break
            else:
                print("not a number")
                continue
    

    【讨论】:

      【解决方案3】:

      inp_val = float(input('Enter value (e to exit)'))

      如果在此行中引发了 ValueError 异常,则不会分配 inp_val,因此 if inp_val == 'e' 将评估为 False。

      通过将此行拆分为 2 来修复它:

      inp_val = input('Enter value (e to exit)')
      try:
          flt_inp_val = float(inp_val)
      except ValueError:
          if inp_val == 'e'
               break
          else:
              print("not a number")
              continue
      

      【讨论】:

        【解决方案4】:

        如果您想确保获得 10 个数字,请使用 while loop,它会一直循环直到您在列表中获得 10 个数字而忘记让用户退出,如果 我在此之前退出是没有意义的有一个空列表 n。 n 应该有 10 个取自用户的浮点值。:

        n = []
        while len(n) < 10:
            try:
                inp_val = float(input('Enter value'))
                n.append(inp_val)
            except ValueError:
                print("not a number")
        

        len(n) &lt; 10 评估为 False 时,您的列表中将存储十个浮点数,您无法使用 range 执行相同的操作,因为迭代结束时无法返回。

        要更正您自己的代码,您只需要进行几处更改,仅在检查输入是否等于e 后进行转换,如果它是中断或尝试将浮点数附加到列表中,else/continue两者在您自己的代码中也是多余的,您无法中断并进入打印,并且无论何时到达代码的最后一行,您的循环都将继续:

        n = []
        for i in range(10):
            try:
                inp_val = (input('Enter value (e to exit)'))
                if inp_val == "e":
                    break
                n.append(float(inp_val))
            except ValueError:
                print("not a number")
        

        但同样,如果您想确保获得 10 个数字,那么这个或仅使用范围的任何逻辑都行不通,您需要一段时间。

        【讨论】:

          猜你喜欢
          • 2018-10-29
          • 2020-02-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-10
          • 1970-01-01
          • 2013-04-01
          相关资源
          最近更新 更多