【问题标题】:How can I break the while loop and go to the finally block if the user entered "done"如果用户输入“完成”,我如何打破 while 循环并转到 finally 块
【发布时间】:2020-02-11 02:23:36
【问题描述】:
largest = None
smallest = None
l = []
while True:
    try:
        num = input("Enter a number: ")
    except NameError as err:
        if err == "done":
            break
        else:
            print("Invalid input")
    finally:
        l.append(num)
        l.sort()
        largest = l[-1]
        smallest = l[0]


print("Maximum", largest)
print("Minimim", smallest)

【问题讨论】:

  • except 是如何被触发的?
  • 为什么要使用 finally?为什么不在“完成”处理中排序和计算最小/最大?
  • 你需要重新设计你的逻辑。 NameError 永远不会发生,它永远不会等于 'done'。同样,l.sort() 和之后的所有内容都应该在循环之外。
  • 没有因为他使用 ValueError 而我想使用 NameError 作为异常

标签: python python-3.x try-except


【解决方案1】:

此代码看起来像是用于 Python 2.x,其中input() 尝试评估输入,如果您键入的字符串不是变量名,则会发出错误信号。当您键入 done 时,Python 3.x 不会发出错误信号。

所以只需比较输入。您可以稍后在尝试将其转换为 int 时进行错误检查。

while True:
    num = input("Enter a number")
    if num == "done":
        break
    try:
        num = int(num)
    except ValueError:
        print("Invalid input")
        continue
    l.append(num)
l.sort()
largest = l[-1]
smallest = l[0]

【讨论】:

  • @AnasGhareib 确保您使用的是 Python 3,如标签所示。
【解决方案2】:

重构逻辑。 NameError 不会发生,finally 也不需要……只要在“终于”完成时把它放在外面。

nums = []

while True:
    num = input('Enter a number or "done": ')  # num is a string at this point
    if num == 'done':
        break
    try:
        # try to convert num to integer...
        num = int(num)  # This can fail with ValueError, so is in try
        nums.append(num)   # This won't run if above raises exception
    except ValueError:
        print("Invalid input")

# No need to sort...
print("Maximum", max(nums)) 
print("Minimum", min(nums))

【讨论】:

  • 理想情况下l.append(num) 应该在else 子句中,但是nbd
  • @wjandrea 六个一个,六个另一个...少一行代码:)
  • @AnasGhareib 您使用的是哪个版本的 Python?
猜你喜欢
  • 1970-01-01
  • 2016-12-24
  • 2017-08-09
  • 1970-01-01
  • 1970-01-01
  • 2019-08-24
  • 1970-01-01
  • 2018-10-17
  • 1970-01-01
相关资源
最近更新 更多