2016-12-01 6 views
1

Я пытаюсь написать функцию python, которая суммирует все элементы в списке вплоть до первого четного числа. Функция должна пройти следующие испытания:Функция, которая суммирует все элементы в списке до, но не включает первое четное число

from test import testEqual 

testEqual(sum_of_initial_odds([1,3,1,4,3,8]), 5) 
testEqual(sum_of_initial_odds([6,1,3,5,7]), 0) 
testEqual(sum_of_initial_odds([1, -7, 10, 23]), -6) 
testEqual(sum_of_initial_odds(range(1,555,2)), 76729) 

Я попытался следующие:

import random 

lst = [] 
def sum_of_initial_odds(nums): 
    sum = 0 
#test if element is odd number - if it's odd, add it to the previous integer 
    for i in lst: 
     if i % 2 != 0: 
      sum = sum + i 
     return sum 
#test if element is even number - if it's even, don't include it and break code 
     else: 
      if i % 2 == 0: 
     break: 

В настоящее время я получаю ошибку синтаксического анализа:

ParseError: bad input on line 11 

, который является строка:

else: 

Как еще я могу написать thi s, чтобы он добавлял элементы в список, но не включает в себя первое четное число, не получая ошибки Parse?

+1

'возвратного sum' отступ неправильно, как' перерыв: '(который, пока мы на нем, не должен иметь двоеточие). – jonrsharpe

+0

Я попытался дважды отодвинуть отступ на четыре пробела, оба раза я получил тот же результат. – HappyHands31

+1

Ему нужно больше, не меньше. – jonrsharpe

ответ

3

У вас есть несколько проблем:

  1. углублений, которые другие уже упомянутые
  2. Вы возвращаетесь сумму первый раз, когда вы попали нечетное число; это так не то, что вы хотите.
  3. Вы игнорируете входной параметр nums и работаете с пустым глобальным lst.
  4. Ваш самый низкий если является излишним: вы уже знаете у вас есть четное число, когда вы сюда попадете.

В общем, частичные частичные данные в локальные переменные; введите в нижней части вашей рутины.

import random 

def sum_of_initial_odds(lst): 
    sum = 0 
#test if element is odd number - if it's odd, add it to the previous integer 
    for i in lst: 
     if i % 2 != 0: 
      sum = sum + i 
#test if element is even number - if it's even, don't include it and break code 
     else: 
      break 

    return sum 

print sum_of_initial_odds([1,3,1,4,3,8]) == 5 
print sum_of_initial_odds([6,1,3,5,7]) == 0 
print sum_of_initial_odds([1, -7, 10, 23]) == -6 
print sum_of_initial_odds(range(1,555,2)) == 76729 

Выходной сигнал от этого четыре Истинные значения.

+0

Ваше объяснение имеет смысл до сих пор, но я все еще получаю ошибку имени: «NameError: имя« lst »не определено в строке 6» – HappyHands31

+1

Помните ли вы изменить имя параметра функции из ** nums * * до ** lst **? – Prune

+0

Возможно, это была проблема! – HappyHands31

5

Вы можете сделать это очень легко с помощью itertools.takewhile:

>>> import itertools 
>>> sum(itertools.takewhile(lambda x: x % 2 == 1, [1,3,1,4,3,8])) 
5 

takewhile даст элементы из заданной последовательности, а предикат x % 2 == 1 является True, то он получит Вас все номера вплоть до первого даже один. И sum, ну, суммирует эти значения.

+0

Прохладный, я искал версию python этого, в Scala это 'Seq (1,3,1,4,3,8) .takeWhile (_% 2 == 1) .foldLeft (0) (_ + _) ' –

+0

@ evan058 Я не знаю Scala, но я надеюсь, что вместо' foldLeft (0) (_ + _) 'вы можете просто сказать' sum' или так ... –

+0

Ха, да, это работает тоже: 'Seq (2,1,3,1,4,3,8) .takeWhile (_% 2 == 1) .sum '. Классический по сравнению с осложнением (хотя я уверен, что именно так определяется сумма) –

2

Вы также можете использовать

def sum(numbers): 
    sum = 0 
    for number in numbers: 
     if number % 2 == 0: 
      break 
     else: 
      sum += number 
    return sum 

И тест с использованием asset заявления, которое является специализированной формой raise заявления Преимущества заключается в том, что он бросает AssertionError только тогда, когда __debug__ верно, таким образом избегая бросать исключение в производстве.

assert sum([1,3,1,4,3,8]) == 5 , "Your message if assertion fails" 

Вы можете отключить __debug__ по

  • Start интерактивного режима с python -O
  • Установки переменной PYTHONOPTIMIZE в True