虽然循环运行不正常

时间:2015-03-06 22:25:43

标签: python while-loop

我正在尝试在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

5 个答案:

答案 0 :(得分:3)

你至少还有三个问题,在这里

问题1

for intervar in num:
    count=count+1

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

count += len(num)

您想要计算所有输入还是仅计算正确输入的数字?

问题2

的缩进
total=total+number

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

问题3

is运算符比较两个对象的对象标识。在这种情况下,比较结果为真,iff number int

if number is int: 
    continue

你想要的是:

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

但是,这是多余的,因为在number = int(num) number之后总是 int

答案 1 :(得分:3)

以下是您重新安排的代码:

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)

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

您要做的是确定总计数的增量

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更改为输入,因为它并不总是一个数字...也检查数字的类型是不正确所以我也改变了...你只想增加它的数字所以我把它放在试试中...也是你的计数我改为不循环所有输入的字符,而是每次输入时只计数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

这样做的好处使得需要尝试/除了具有相当大的开销

答案 4 :(得分:-1)

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

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)