Как я могу разбить while l oop и go на блок finally, если пользователь ввел «done» - PullRequest
0 голосов
/ 11 февраля 2020
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)

Ответы [ 2 ]

3 голосов
/ 11 февраля 2020

Этот код выглядит как для Python 2.x, где input() попытался оценить ввод и сообщил об ошибке, если вы ввели строку, которая не является именем переменной. Python 3.x не сообщает об ошибке при вводе done.

Так что просто сравните ввод. Позже вы можете выполнить проверку ошибок, когда попытаетесь преобразовать ее в 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]
1 голос
/ 11 февраля 2020

Рефакторированные логи c. 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))
...