【问题标题】:Python excepting input only if in rangePython 仅在范围内时才排除输入
【发布时间】:2021-05-21 09:45:57
【问题描述】:

您好,我想从用户那里获取一个数字,并且只能在一定范围内输入。

以下内容似乎可行,但我是菜鸟,并且认为尽管可行,但毫无疑问,这是一个更优雅的示例……只是尽量不要养成坏习惯!

我注意到的一件事是,当我运行程序时,CTL+C 不会让我跳出循环,而是引发异常。

while True:
  try:
    input = int(raw_input('Pick a number in range 1-10 >>> '))
    # Check if input is in range
    if input in range(1,10):
      break
    else:
      print 'Out of range. Try again'
  except:
    print ("That's not a number")

非常感谢所有帮助。

【问题讨论】:

  • 这似乎是两个完全不同的问题...最好一次问一个问题。如果你得到两个答案:一个是第一个问题,另一个是第二个问题,你怎么知道要接受哪个?
  • 你知道range(1,10)不包括10吗?您的 raw_input 文字表明您可能希望 10 可以接受。
  • 是的,我知道 10 超出了范围,我的错误是将其包含在 raw_input 语句中。抱歉,只是快速将值作为示例。谢谢。

标签: python error-handling user-input


【解决方案1】:

您的代码中有几项可以改进。

(1) 最重要的是,只捕获一个通用异常并不是一个好主意,您应该捕获一个特定您正在寻找的异常,并且通常缺少try-尽可能阻止。

(2) 还有,

  if input in range(1,10):

最好编码为

  if 1 <= input < 10:

作为当前函数range() 重复创建从 1 到 9 的值列表,这可能不是您想要或需要的。另外,您要包括10 吗?您的提示似乎暗示了这一点,因此您需要调整对range(1, 11) 的调用,因为生成的列表将 包含上限值。并且if-statement 应该更改为if 1 &lt;= input &lt;= 10:

【讨论】:

  • 这不是问题,只是慢了
  • 但它对第一个“问题”的有效答案。 OP 写道:“以下内容似乎可行,但我是菜鸟,并且认为尽管可行,但毫无疑问,这是一个更优雅的示例……只是尽量不要养成坏习惯!”虽然我个人认为应该删除 OP 的第一个“问题”或将其移至单独的问题中,也许在 codereview.SE 上。
  • 感谢列文。你说的都有道理。
【解决方案2】:

Ctrl+C 产生一个KeyboardInterruptException,你的try … except 块捕捉到这个:

while True:
   try:
       input = int(raw_input('Pick a number in range 1-10 >>> '))
   except ValueError: # just catch the exceptions you know!
       print 'That\'s not a number!'
   else:
       if 1 <= input < 10: # this is faster
           break
       else:
           print 'Out of range. Try again'

通常,您应该只捕获您期望发生的异常(因此不会出现副作用,例如您的 Ctrl+C 问题)。此外,您应该使try … except 块尽可能短。

【讨论】:

  • 那应该是&lt; 10 由 OP 给出的range(1, 10)
  • 我一直认为 else 语句只能跟在 if 或 elif 语句之后。我现在知道事实并非如此。
  • @hemmy 你知道forwhile 在某些情况下会循环may also be followed by an else statement吗?
  • @lazyr 不,但我现在这样做。谢谢!此外,链接上的示例比我几个月前编写的素数程序短了大约一百万倍......很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-13
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多