Подсчет не увеличивается должным образом в цикле Python - PullRequest
0 голосов
/ 04 октября 2018

Может кто-нибудь сказать мне, почему, когда я ввожу 1, 2, 3 и 4 в этот код, у меня выводится 6, 2, 3,00?Я думал, что каждый раз, когда мой цикл while оценивается как true, счетчик увеличивается на единицу, но вывод не имеет смысла.Это берет всего 3 числа, но только 2 для подсчета?Я, наверное, просто что-то пропускаю, поэтому лишняя пара глаз была бы потрясающей.

def calcAverage(total, count):
    average = float(total)/float(count)
    return format(average, ',.2f')


def inputPositiveInteger():
    str_in = input("Please enter a positive integer, anything else to quit: ")
    if not str_in.isdigit():
        return -1
    else:
        try:
            pos_int = int(str_in)
            return pos_int
        except:
            return -1


def main():
    total = 0
    count = 0
    while inputPositiveInteger() != -1:
        total += inputPositiveInteger()
        count += 1
    else:
        if count != 0:
            print(total)
            print(count)
            print(calcAverage(total, count))


main()

1 Ответ

0 голосов
/ 04 октября 2018

Ошибка с вашим кодом в том, что на этом куске кода ...

while inputPositiveInteger() != -1:
        total += inputPositiveInteger()

Сначала вы набираете inputPositiveInteger и выбрасываете результат в вашем состоянии.Вам необходимо сохранить результат, иначе один вход из двух игнорируется, а другой добавляется, даже если он -1.

num = inputPositiveInteger()
while num != -1:
        total += num 
        count += 1
        num = inputPositiveInteger()

Улучшения

Хотя, обратите внимание, что ваш кодможет быть значительно улучшено.См. Комментарии в следующей улучшенной версии вашего кода.

def calcAverage(total, count):
    # In Python3, / is a float division you do not need a float cast
    average = total / count 
    return format(average, ',.2f')


def inputPositiveInteger():
    str_int = input("Please enter a positive integer, anything else to quit: ")

    # If str_int.isdigit() returns True you can safely assume the int cast will work
    return int(str_int) if str_int.isdigit() else -1


# In Python, we usually rely on this format to run the main script
if __name__ == '__main__':
    # Using the second form of iter is a neat way to loop over user inputs
    nums = iter(inputPositiveInteger, -1)
    sum_ = sum(nums)

    print(sum_)
    print(len(nums))
    print(calcAverage(sum_, len(nums)))

Одна деталь, о которой стоит прочитать в приведенном выше коде, - это вторая форма iter.

...