Python: 循环哨兵值

-1 投票
4 回答
11714 浏览
提问于 2025-04-28 04:34

我需要写一个程序,这个程序要有一个循环,让用户输入一系列整数,最后输入-99来表示输入结束。在所有数字输入完后,程序应该显示输入的最大值和最小值。

这是我目前写的代码:

def main():
    user_input = 1
    while user_input != -99:
        user_input = int(input("Enter your number or -99 to end."))
        bigger = largest(user_input)
        tinier = smallest(user_input)
    print('The largest number is ', bigger, "and the smallest is ", tinier, ".")     

def largest(number):
    largest = 0
    if number > largest:
        largest = number
        return largest 

def smallest(number):
    smallest = 10000
    if number < smallest:
        smallest = number
        return smallest


main()

但不知为什么,结束标志(-99)也进入了循环,我完全搞不懂是怎么回事,而且它还成了最小值。更糟的是,最大值也总是错误的。非常感谢大家的帮助!

暂无标签

4 个回答

0

在Python中,缩进非常重要,所以你最小值和最大值函数的返回语句缩进不正确。

def largest(number):
    largest = 0
    if number > largest:
        largest = number
    return largest 

def smallest(number):
    smallest = 10000
    if number < smallest:
        smallest = number
    return smallest
0

从我看到的情况来看,你有两个问题:首先,你的输入在检查之前就被处理了;其次,你的 largest()smallest() 函数有问题。当你扫描用户输入时,你会立刻进入这些函数,而没有先进行验证。你可以这样重构你的循环:

input()
while(){
  ...
  ...
  input()
}

至于第二个问题,你的函数之所以不工作,是因为每次运行时都会重新初始化值。你应该在文件顶部的函数头部初始化这些值,然后再进行比较。举个例子,把 largest=0 这一行移动到文件顶部,紧跟在导入语句后面。除此之外,我觉得应该就可以正常工作了。

0

如果你用一个列表来存储数字,然后利用标准库里的最大值和最小值函数,这个过程就非常简单了:

def main():
  numbers = []
  while True:
    user_input = int(raw_input("Enter a number"))
    if user_input == -99:
        break
    else:
        numbers.append(user_input)
  print('Largest is {}, smallest is {}'.format(max(numbers), min(numbers)))
0

要快速修复你的代码,可以做这样的修改:

def main():
    user_input = 1
    while user_input != -99:
        user_input = int(input("Enter your number or -99 to end."))
        if use_input == -99:
            break
        bigger = largest(user_input)
        tinier = smallest(user_input)
    print('The largest number is ', bigger, "and the smallest is ", tinier, ".")

问题在于,如果用户输入了-99,你的代码会继续执行这一轮循环的其他部分。虽然while循环不会立刻结束,但在下一次循环之前,largestsmallest这两个值已经被计算过了,所以它们的值已经被覆盖了。

撰写回答