将列表中所有元素相加但不包括第一个偶数的函数

Function That Sums All Elements in List Up to But Not Including The First Even Number

我正在尝试编写一个 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: 

我还能如何编写此代码,以便它在列表中添加元素,但不包括第一个偶数,而不会出现解析错误?

您可以使用 itertools.takewhile:

轻松完成此操作
>>> import itertools
>>> sum(itertools.takewhile(lambda x: x % 2 == 1, [1,3,1,4,3,8]))
5

takewhile 将生成给定序列中的元素,而谓词 x % 2 == 1True,即它将为您提供所有数字,直到第一个偶数。 sum,嗯,对这些值求和。

你有几个问题:

  1. 其他人已经提到的缩进
  2. 你return总和第一次打出奇数;这 所以 不是你想要的。
  3. 您忽略输入参数 nums 并使用空全局 lst.
  4. 你的最低 if 是多余的:你已经 知道 当你到达这里时你有一个偶数。

一般情况下,将部分结果塞入局部变量;在你的例程底部有一个 return

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

此输出是四个 True 值。

您也可以使用

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

并使用 asset 语句进行测试,它是 raise 语句的特殊形式 优点是它仅在 __debug__ 为真时抛出 AssertionError 从而避免在生产中抛出异常。

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

您可以通过

关闭__debug__
  • python -O
  • 开始交互模式
  • 将变量 PYTHONOPTIMIZE 设置为 True