将列表中所有元素相加但不包括第一个偶数的函数
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 == 1
是 True
,即它将为您提供所有数字,直到第一个偶数。 sum
,嗯,对这些值求和。
你有几个问题:
- 其他人已经提到的缩进
- 你return总和第一次打出奇数;这 所以 不是你想要的。
- 您忽略输入参数 nums 并使用空全局 lst.
- 你的最低 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
我正在尝试编写一个 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 == 1
是 True
,即它将为您提供所有数字,直到第一个偶数。 sum
,嗯,对这些值求和。
你有几个问题:
- 其他人已经提到的缩进
- 你return总和第一次打出奇数;这 所以 不是你想要的。
- 您忽略输入参数 nums 并使用空全局 lst.
- 你的最低 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