我正在为我的第一个编程类开发这个python代码。昨天它部分工作,但后来我改变了一些东西,现在它只传递了1个测试用例。目标是将列表“xs”中的所有偶数相乘,如果没有偶数则返回1。我做错了什么,我该如何解决?
def evens_product(xs):
product = 2
for i in xs:
if i%2 == 0:
product *= i
return product
else:
return (1)
编辑:Chepner的解决方案有效地感谢所有帮助过的人
答案 0 :(得分:3)
您需要初始化product = 1
,原因有两个。一个,简单地说,你会得到错误的答案。 evens_product([4])
应该返回4而不是8。
第二,它可以使您免于必须处理没有偶数的列表作为特殊情况。如果没有偶数,则永远不要更改product
的值并保持不变。
def evens_product(xs):
product = 1
for i in xs:
if i%2 == 0:
product *= i
return product
答案 1 :(得分:0)
一种实现方法是使用reduce()
中的functools
函数和operator.mul()
函数。
reduce()
函数接受一个函数,该函数接受三个参数(在这种情况下为operator.mul()
),一个可迭代的变量(在这种情况下为列表)和默认值。
它将功能应用于前两个元素,并产生结果。它获取该结果,并将该函数应用于结果和列表的第三个元素,然后将该结果应用于第四个元素,依此类推。重复此过程,直到所有参数都被迭代为止。
在这种情况下,operator.mul()用于描述乘法运算。例如,operator.mul(2,3)
是6。
最后,您可以通过在列表末尾带有if
子句的列表理解来选择列表中的偶数。如果数字i
是偶数,则值i % 2
应该为零,因为%
是模运算符,它会在左侧除以右侧后返回余数。
这是实现的样子,尽管您应该为没有偶数的情况(例如,用try: except:
块)定义行为。
添加了默认值/初始值1
,以避免在列表为空的情况下出错。
import functools, operator
def even_product(lst):
return functools.reduce(operator.mul, [i for i in lst if i%2 == 0], 1)
答案 2 :(得分:-1)
这将是你的答案:
def evens_product(xs):
product = 1
for i in xs:
if i%2 == 0:
product *= i
return product
由于产品已分配return
,因此无需1
1
。
由于return
循环中有for
,因此在识别出第一个偶数后返回值。希望它有所帮助。