繁体   English   中英

汇总列表中所有元素但不包括第一个偶数的函数

[英]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

当谓词x % 2 == 1Truetakewhile将从给定的序列中产生元素,即,它将使您所有的数字达到第一个偶数。 sumsum ,将这些值求和。

您有一些问题:

  1. 缩进,其他人已经提到
  2. 您第一次碰到奇数时返回sum 这是如此的不是你想要的。
  3. 您将忽略输入参数nums并使用空的全局lst
  4. 最低的if是多余的:到达这里时,您已经知道偶数。

通常,将部分结果填充到局部变量中。 在例行程序的最后有一个回报

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__为true时,它才会引发AssertionError ,从而避免在生产中引发异常。

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

您可以通过以下方式关闭__debug__

  • 使用python -O启动交互模式
  • 将变量PYTHONOPTIMIZE设置为True

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM