Python 2.7 / loop / break 正在改变我的结局

Python 2.7 / loop / break is changing my outcome

smallest = None
largest = None
while True :
    number = raw_input('Enter a number from -10 to 9: ')
    if largest < number :
        largest = number
    if smallest is None :
        smallest = number
    elif number < smallest :
        smallest = number
    if number == 'done': break
print 'Largest number is: ',largest
print 'Smallest number is ',smallest

我不知道为什么我的 "smallest" 没问题,而 "largest" 结果总是 完成 。我认为 "break" 以某种方式影响了它。你能指出我的错误吗?

如果您遇到 done,您的循环应该立即 break。但是在您的代码中,您已将中断放在最后。所以在此之前,正在执行之前的逻辑。和 done 作为一个字符串可以进行比较。

>>> None < 'done'
True
>>>

所以你的 largest 设置为 done 因为 largest < None 在这种情况下。

快速修复

我们现在将中断移到了顶部,所以这应该可以解决问题:

smallest = None
largest = None
while True :
    number = raw_input('Enter a number from -10 to 9: ')
    if number == 'done': 
        break

    if largest < number :
        largest = number
    if smallest is None :
        smallest = number
    elif number < smallest :
        smallest = number

print 'Largest number is: ',largest
print 'Smallest number is ',smallest

处理号码

raw_input returns string。但是我们想比较数字。所以我们应该将输入转换为 int

   try:
        num = int(number)
    except ValueError:
        print('Please enter a valid integer')
        continue # skip the input and continue with the loop

问题是您首先更新 smallestlargest,即使用户输入 done。因此,首先,您应该检查输入是否为 'done' 并在更新任何数字之前立即中止。

也就是说,您的代码还有多个其他问题:

  • if largest < number – 如果数字小于先前存储的数字,则更新 largest,使其具有与 smallest 相同的逻辑。当然,这样你最终不会得到最大的数字。
  • raw_input() returns 字符串,不是数字。因此,如果用户键入 5,那么 raw_input() returns 就是字符串 '5'。因此,您所做的每一次比较都是一次字符串比较(例如 '2' < '5')。因为字符串比较是基于字符代码的,所以这对 single-digit 数字也有效,但你真的应该首先将字符串转换为正确的数字。
  • 你提到了 -109 的允许范围,但你从未真正强制执行。

像这样的东西会起作用:

smallest = None
largest = None

while True:
    number = raw_input('Enter a number from -10 to 9: ')
    if number == 'done':
        break

    # convert into a number
    try:
        num = int(number)
    except ValueError:
        print('That was not a valid number')
        continue # restart the loop

    # validate the number range
    if num < -10 or num > 9:
        print('The number is out of the allowed range')
        continue

    if largest is None or num > largest:
        largest = num

    if smallest is None or num < smallest:
        smallest = num

print 'Largest number is:', largest
print 'Smallest number is:', smallest