while 循环不正确 运行

While loop is not running properly

我正在尝试 运行 在 python 中进行 while 循环。我可以让它的大部分正常运行,但部分代码无法正常运行,我一直在尝试不同的方法来解决它,但我无法让它完全按照我想要的方式运行。

我正在尝试编写一个重复读取数字直到用户输入“完成”的程序。输入“完成”后,打印出数字的总数、计数和平均值。如果用户输入的不是数字,则使用 try 和 except 检测他们的错误并打印错误消息并跳到下一个数字

这是我的代码:

total=0
number=None
count=0
while True:
    num=raw_input('Enter a number: ')
    print 'Enter a number',num
    for intervar in num:
        count=count+1
    if num=='done':
        break 
    else:
        try:
            number=int(num)
            if number is int: 
                continue
        except:
            print 'bad data' 
total=total+number
print 'Enter a number:',number
print 'Total is',total
print 'Count is',count

当我输入 3,4,5 这段代码的输出是:

Enter a number 3
Enter a number 4
Enter a number 5
Enter a number nine 
bad data
Enter a number done
Enter a number: 5
Total is 5
Count is 12

代码应为

Enter a number 3
Enter a number 4
Enter a number 5
Enter a number bad data
Enter a number done
Total is 12
Count is 3

这是打印您预期输出的代码。 你有一个缩进错误和太多的印刷品。

total  = 0
number = None
count  = 0
while True:
    num = raw_input('Enter a number: ')
    if num == 'done':
        break
    else:
        try:
            number = int(num)
            if number is int:
                continue
        except:
            print 'bad data'
    count += 1
    total += number

print 'Total is',total
average = float(total)/float(count)
print 'average for %s is %s'%(count, average)

这里至少还有三个问题

问题 1

for intervar in num:
    count=count+1

此时 num 是一个字符串,您正在迭代该字符串中的字符,递增 count。 for循环本质上等于

count += len(num)

你想计算所有输入还是只计算正确输入的数字?

问题2

的缩进
total=total+number

错了。它必须在 while 循环内。另外,添加到变量时使用 +=

问题3

is 运算符比较两个对象的对象标识。在这种情况下,比较为真,当且仅当 numberclass int

if number is int: 
    continue

你想要的是:

if isinstance(number, int):
    [...]

然而,这是多余的,因为在 number = int(num) number 之后 always 一个 int.

您要做的是修复总计数的增量

total=0
number=None
count=0
while True:
    input = raw_input('Enter a whole number: ')
    try:
        number=int(input)
        total += number
    except:
        if input.lower() == 'done':
            break
        else:
            print 'bad data'
            continue

    count += 1

print 'Total is',total
print 'Count is',count
print 'Average is', total/count

注意我将你的变量名从 num 更改为 input 因为它并不总是一个数字......而且你对数字类型的检查不正确所以我也改变了它......你只想在它是一个数字时递增所以我把它放在 try... 还有你的计数我更改为不遍历所有输入的字符,而是每次输入某些内容时只计数 1


更好的方法是编写数字检查函数

total=0
number=None
count=0

def check_int(str):
    if str[0] in ('-', '+'):
        return str[1:].isdigit()
    return str.isdigit()

while True:
    input = raw_input('Enter a whole number: ')
    if check_int(input):
        total += int(input)
        count += 1
    elif input.lower() == 'done':
        break
    else:
        print 'bad data'
        continue

print 'Total is',total
print 'Count is',count
print 'Average is', total/count

这样做的好处是减少了对 try/except 的需求,后者的开销相当大

这里是你的代码重新排列了一下:

total=0
count=0
while True:
    num=raw_input('Enter a whole number: ')
    try:
        # just try to convert it
        number=int(num)
        # success -> accumulate
        total += number
        count += 1
    except ValueError:
        # if it isn't an integer, maybe they're done
        if num.lower() == 'done':
            break
        else:
            print 'bad data'
print 'Total is',total
print 'Count is',count

还有一个选择

# keep all the numbers in a list for use later
numbers = list()
while True:
    num=raw_input('Enter a whole number: ')
    try:
        # just try to convert it
        numbers.append(int(num))
    except ValueError:
        # if it isn't an integer, maybe they're done
        if num.lower() == 'done':
            break
        else:
            print 'bad data'

print 'Total is', sum(numbers)
print 'Count is', len(numbers)

使用列表跟踪数字,在输入会话结束时执行计算。

numbers = []
while True:
    input = raw_input('Enter a whole number: ')
    try:
        numbers.append(int(input))
    except ValueError:
        if input is not None and input.lower() == 'done':
            break
        else:
            print 'Invalid input.'

length = len(numbers)
total = sum(numbers)
average = total/count

print 'Total is', total
print 'Count is', length
print 'Average is', average