此功能仅在我拨打:
时有效def prodo(L):
sum = 1
for i in range(0, len(L)):
sum = L[i] * sum
return sum
这些界限:
d = prodo([3, -1, 4, -1, -5])
print(d)
但是使用L
的以下函数返回375而不是-60
def prod(L):
sum = 1
for i in L:
if i>=len(L):
break
sum = L[i] * sum
return sum
问题:我做错了什么以及为什么?
答案 0 :(得分:1)
你可以这样做:
from functools import reduce
product = reduce((lambda x, y: x * y), [3, -1, 4, -1, -5])
print(product)
这输出-60
您可以选择声明任何列表
l = [3, -1, 4, -1, -5]
然后致电
product = reduce((lambda x, y: x * y), l)
答案 1 :(得分:1)
正如@Skam在评论中提出的那样,如果您尝试在第二个函数中打印i
,您将会知道不同之处。使用以下语法时:
for i in L
i
不表示从0开始并转到列表长度的数值。但它代表了物品本身。例如,请考虑以下代码:
L = [1,3,4,5,6]
for i in L:
print i
此代码的输出为:
1
3
4
5
6
因此,当您尝试执行L[i]
时,在第二个函数中,您实际上并未获取当前迭代编号并尝试在列表中访问它,但您尝试访问具有索引的值i
的当前值,考虑到上述代码,如果我尝试L[i]
,第一次迭代将打印3
,因为它的索引为 1 这是第一个元素。
答案 2 :(得分:1)
在def prod()
中,您使用i
作为列表元素的值。
所以当你这样做时:
def prod(L)
for i in L: # i = 3, -1, 4, -1, -5
当你写:
for i in range(0,L): # i =0, 1, 2, 3, 4
这些是您需要更改代码的地方。
答案 3 :(得分:1)
这个函数不起作用,因为你没有像这样迭代数组:
for i in range(len(L)):
// now `i` will have values 0,1,2,3,...,len(L)-1
而不是像这样迭代:
d = prodo([3, -1, 4, -1, -5])
for i in L:
// now i will take values 3,-1,4,-1,-5
使用此方法,您无法使用if i == len(L):
来确定您是否位于数组的末尾,因为i
不是数字索引,而是某个索引处的值。
因此,只要数组中的数字大于或等于数组的长度,break
就会执行。
def prod(L):
sum = 1
for i in L:
if i>=len(L):
break
sum = L[i] * sum
return sum