Страницы

Поиск по вопросам

воскресенье, 7 апреля 2019 г.

Цикл while «Сумма последовательности чисел»

Здравствуйте. Начал изучать питон, иногда нападают жуткие тупняки. Ряд задач с этим циклом, вроде, решен и понятен, тут не могу никак понять, как формулировать решение. Определите сумму всех элементов последовательности, завершающейся числом 0. В этой и во всех следующих задачах числа, следующие за первым нулем, учитывать не нужно. def по этому курсу еще не было, не знаю, что это. Т.е. задачу нужно решить, исходя из того, что материал был по Занятие 1. Ввод-вывод, арифметические операции Занятие 2. Условная инструкция Занятие 3. Операции с целыми и вещественными числами Занятие 4. Цикл for Занятие 5. Строки Занятие 6. Цикл while Вот просто чего не понял. i = 0 while int(input()) > 0: i += int(input()) print(i) Но в этом случае суммируются элементы без первого, т.е. в том порядке, как входят, если делаю i = 0 a = 0 while int(input()) >0: i += 1 for j in range(0:a): a += int(input()) print(a) то говорит, что закончились числа для ввода. Т.е. в целом я понимаю, что вообще что-то не то делаю.


Ответ

Ошибка в том, что функция input() вызывается в двух местах, нужно вызывать её только в одном месте и использовать одно и то же возвращаемое значение как для проверки на ноль, так и для суммирования: total = 0 # общая сумма while True: # бесконечный цикл n = int(input()) # каждая строка содержит целое число if n == 0: # нашли нуль break # выходим из цикла total += n # суммируем print(total) # печатаем результат Код предполагает, что каждая последовательность завершается нулём. В противном случае нужно ловить EOFError исключение и обрабатывать возвращаемую пустую строку. Чтобы самостоятельно найти ошибку в своём коде, в таких простых случаях, полезно выписать словами, что код делает строчка за строчкой (отладка методом утёнка). Другие способы выразить то же самое для тестов (и для улучшения понимания задачи людьми, которые уже знают Питон, не для прямого использования): import sys from itertools import takewhile
print(sum(takewhile(lambda n: n != 0, map(int, sys.stdin)))) Не нулевые целые числа являются истиной в булевом контексте в Питоне, поэтому вместо lambda n: n != 0 можно использовать просто bool (менее читаемый (явный) вариант). Или даже (если каждая строчка содержит только числа, без пробелов): print(sum(map(int, iter(input, '0'))))

Комментариев нет:

Отправить комментарий