2016-12-01 131 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: 

我还能怎么写?以便它添加列表中的元素,但不包含第一个偶数,而不会得到Parse错误?

+1

'回报sum'关闭__debug__缩进不正确,因为是'突破: '(其中,虽然我们在它,不应该有冒号)。 – jonrsharpe

+0

我试着将缩进四次移回两次,两次都得到相同的结果。 – HappyHands31

+1

它需要更多,而不是更少。 – jonrsharpe

回答

3

你有几个问题:

  1. 缺口,这人已经提到
  2. 将返回总和第一次你打奇数;这是所以不是你想要的。
  3. 您忽略输入参数个数并与空全局工作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 

从这个输出是4个值。

+0

你的解释到目前为止是有道理的,但我仍然得到一个名称错误:“NameError:name'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 == 1True,即它可以把你所有的数字上升到第连一个。并且sum,总结这些值。

+0

很酷,我正在寻找这个python版本,在Scala中它是'Seq(1,3,1,4,3,8).takeWhile(_%2 == 1).foldLeft(0)(_ + _)' –

+0

@ evan058我不知道斯卡拉,但我希望,而不是'foldLeft(0)(_ + _)',你可以说'sum'左右...... –

+0

哈,是的,这个作品:Seq(2,1,3,1,4,3,8).takeWhile(_%2 == 1).sum '。经典并发症(虽然我相信这是如何定义总和) –

2

你也可以使用asset声明这是raise声明 优势的一种特殊形式,它抛出AssertionError只有当__debug__是真实的,从而避免在生产中引发异常使用

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

和测试。

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

您可以通过

  • 开始互动模式python -O
  • 设置变量PYTHONOPTIMIZETrue
相关问题