2016-01-03 11 views
1

У меня есть список чисел, и я хочу, чтобы это было после ввода трех чисел, они подведут итоги, если только один из чисел не равен 13, тогда остальные числа будут недействительными и не суммируются.Пока петля над списком?

Так, если список должны были быть [1, 13, 2] конец сумма будет 1.

total = 0 
def lucky_sum(): 
    total = 0 
    lucky_sum = [] 
    a = input("Input a number") 
    b = input("Input a number") 
    c = input("Input a number") 
    lucky_sum.append(a) 
    lucky_sum.append(b) 
    lucky_sum.append(c) 


while **What do I place here??** != 13: 
    total += **and here** 
    if i== 13: 
     break 
print total 

lucky_sum() 
+0

я получил немного отчаянным и закончил тем, что использовал цикл for перед e, но это не кажется правильным – Chris

+0

Полностью не связанный. Но вам не нужно называть 'total = 0' до' lucky_sum(): 'если вы определяете его внутри. Если я не вижу чего-то ? – Zak

ответ

5

Вы можете сделать это без использования во время цикла:

for i in lucky_sum(): 
    if i == 13: 
     break 

    total += i 

Edit: Как было отмечено в комментарии , в lucky_sum добавьте оператор возврата в конце.

+1

Тогда нам нужно положить 'return lucky_sum' внутри' lucky_sum() 'функции. –

+0

Вы правы. отредактировал мой ответ, чтобы включить то же самое. –

+0

Еще один совет: не использовать ';' в Python, это не * Pyhtonic *: P –

1

Вы также можете сделать это с помощью the sum() built-in и itertools.takewhile():

sum(itertools.takewhile(lambda i: i != 13, lucky_sum())) 

sum() принимает итератор и возвращает сумму, и takewhile() принимает итератор и возвращает новый Iterable, который дает значение, пока данный предикат не откажет.

Это более эффективный способ сделать это, так как sum() очень быстр.

В полной мере, что-то вроде этого (с помощью list comprehension уменьшить повторение в создании списка):

import itertools 

def lucky_sum(): 
    return [input("Input a number") for _ in range(3)] 

total = sum(itertools.takewhile(lambda i: i != 13, lucky_sum())) 

print(total) 

Заметим, что вы могли бы использовать выражение генератора здесь вместо (обычные скобки вместо квадратных скобок) , и тогда пользователю будут заданы только значения до тех пор, пока они не введут значение 13 или не введут 3 значения, которые могут быть желательными.

+0

Долгое время нет - я по-прежнему предпочитаю подход 'iter': p –

+0

@JonClements Действительно, я был слишком занят недавно , Я бы сказал, что 'takewhile()' более читабельна, лично, но очень похожа в любом случае. –

3

Если вы действительно хотите, вы могли бы itertools.islice ограничиться не более 3, то версия два аргументов iter, так что ваш код может стать:

from itertools import islice 
print sum(islice(iter(lambda: input('Input Number: '), 13), 3)) 

Чтобы сохранить его простым, хотя, использовать петля в ваших lucky_sum() для 3 раза, если введенное число не 13, и в этом случае перерыв из цикла и возвращает сумму (по умолчанию это ноль) или просто продолжать добавлять цифры, например:

def lucky_sum(): 
    total = 0 
    for i in range(3): 
     n = input('Input Number: ') 
     if n == 13: 
      break 
     total += n 
    return total 

print lucky_sum() 
Смежные вопросы