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

Рейтинг: 4Ответов: 4Опубликовано: 18.12.2014

Начал изучать питон, иногда нападают жуткие тупняки.
Ряд задач с этим циклом, вроде, решен и понятен,
тут не могу никак понять, как формулировать решение?

Определите сумму всех элементов последовательности, завершающейся числом 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)

то говорит, что закончились числа для ввода.
Т.е. в целом я понимаю, что вообще что-то не то делаю.

Ответы

▲ 8Принят

Ошибка в том, что функция 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'))))
▲ 3

Walrus

Моржовый (walrus) оператор, появившийся в Python 3.8,
дает возможность решить сразу две задачи:

  1. присвоить значение переменной
  2. вернуть это значение

Код короче, читабельнее и эффективнее с точки зрения вычислений.

С 14 октября 2019 года можно решать так:

total = 0
while (w := int(input())) != 0:    # Если ввести не число, то будет ошибка.
    total += w

print(total)

В этом решении для выхода из цикла не нужен if в теле цикла,
код стал более эффективным!

Для оператора ”walrus” есть PEP 572,
начните знакомство с раздела Примеры (Examples)

▲ 1

Ну, насколько я понимаю, проходить в цикле элементы, суммируя их, пока значение элемента не будет 0. Если 0 - покидаем цикл.

▲ 1

Как-то так (проверял только глазами, вроде все правильно, в любом случае главное - принцип):

def sum0(lst):
    if 0 in lst:
        return sum(lst[:lst.index(0)])
    else:
        return sum(lst)