2016-12-01 38 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
相關問題