Python - скрипт считает неправильно, но почему? - PullRequest
1 голос
/ 19 января 2020

Я только начинаю изучать Python. В качестве упражнения я написал этот небольшой скрипт:

Напишите программу, которая многократно читает цифры, пока пользователь не введет «готово». Как только введено «выполнено», распечатайте сумму, количество и среднее число. Если пользователь вводит что-то кроме числа, обнаружите его ошибку, используя try и except, распечатайте сообщение об ошибке и перейдите к следующему номеру.

Он делает то, что должен в общем случае, но: когда я немного поиграл с этим, я заметил одно странное поведение: так как он принимает несколько (int) чисел после приглашения, он не будет - и не должен - принимать символы. Пока все хорошо, но потом я попытался использовать float в качестве входных данных. Скрипт не примет это как допустимый ввод, но посчитает его и поместит усеченное число в итог.

Код:

total = float(0)  # sum of items
count = int(0)  # number of items
avrg = float(0)   # average of items
input_in = True
while input_in:
    try:
        line = input('Enter a number: ')
        if line == 'done':
            print('total:', str(total),' count:', str(count),' average:', str(avrg))
            break
        print(line)
        for itervar in line:
            total = total + float(itervar)
            count = count+1
            avrg = total / count
    except:
        print('Invalid input')

Вывод:

Enter a number: 1.5
1.5
Invalid input
Enter a number: 5
5
Enter a number: 5
5
Enter a number: 5
5
Enter a number: done
total: 16.0  count: 4  average: 4.0

То, что я пробовал - и не сработало: назначьте строку переменных и / или itervar как float (). Я попробовал включенный отладчик, но я не в состоянии понять это. Я понятия не имею, как это может работать.

Ответы [ 2 ]

4 голосов
/ 19 января 2020

Ваша строка:

for itervar in line:

Идет по каждому символу ввода, что для вашего первого ввода (1.5) дает три итерации:

1
.
5

Таким образом, для первой итерации ваш итог увеличивается на 1, а для второй итерации вы пытаетесь использовать . в качестве числа, и не можете. (Следовательно, почему после добавления 5 + 5 + 5 ваше окончательное значение равно 16)

Вместо того, чтобы использовать для l oop для итерации по вашему вводу, вы должны обратить внимание на преобразование всего ввода строка в число.

И в качестве дополнительного бонуса ...

Подумайте, действительно ли вам нужно пересчитать среднее значение каждый л oop. Поскольку у вас есть total и count, я бы порекомендовал вместо этого вычислить ваше среднее значение по требованию , исходя из этих двух чисел.

3 голосов
/ 19 января 2020

Как вы уже поняли, input() возвращает строку.

Когда вы перебираете строку с for l oop, вы перебираете каждый символ отдельно. Это означает, что когда вы вводите '1.5', вы получаете три итерации:

itervar = '1'
itervar = '.'
itervar = '5'

Из-за того, как вы написали свой код, первый работает правильно, но затем, когда он пытается преобразовать '.' с плавающей точкой это выдает ошибку.

Почему бы просто не рассмотреть весь ввод целиком, а не посимвольный?

line = input('Enter a number: ')
        if line == 'done':
            print('total:', str(total),' count:', str(count),' average:', str(avrg))
            break
        print(line)
        total = total + float(line)
        count = count+1
        avrg = total / count
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...