【问题标题】:While loop is not running properly虽然循环没有正常运行
【发布时间】:2015-05-08 15:27:45
【问题描述】:

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

【问题讨论】:

  • 你没有设置你的总数,除了一次。总计在 for 循环之外

标签: python while-loop


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    你想要做的是修正你的总计数增量

    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,因为它并不总是一个数字...而且您对数字类型的检查也不正确,所以我也更改了它..您只想在它是数字时增加,所以我把它放在试试......你的计数也改为不循环输入的所有字符,而是每次输入内容时只计数 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 的需要,这会产生相当大的开销

    【讨论】:

    • 那也行不通。 number(或input)最初是None,而不是int。所以elif 总是False
    【解决方案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)
    

    【讨论】:

      【解决方案4】:

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

      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)
      

      【讨论】:

        【解决方案5】:

        这里至少还有三个问题

        问题 1

        for intervar in num:
            count=count+1
        

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

        count += len(num)
        

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

        问题 2

        缩进

        total=total+number
        

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

        问题 3

        is 运算符比较两个对象的对象身份。在这种情况下,比较为真,如果 number int

        if number is int: 
            continue
        

        你想要的是:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-06-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多