列表函数差异的总和

时间:2018-01-02 02:43:42

标签: python product

此功能仅在我拨打:

时有效
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

问题:我做错了什么以及为什么?

4 个答案:

答案 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