Python 函数列表和参数的映射:解包困难

Python 函数列表和参数的映射:解包困难,python,dictionary,zip,reduce,iterable-unpacking,Python,Dictionary,Zip,Reduce,Iterable Unpacking,我在mooc中有一个任务,我必须编写一个函数,返回输入列表的累计和、累计积、最大值和最小值。 课程的这一部分是关于函数式编程的,所以我想在这方面全力以赴,尽管我可以使用其他方法。 所以我试了一下: from operator import mul from itertools import repeat from functools import reduce def reduce2(l): print(l) return reduce(*l) def numbers(l):

我在mooc中有一个任务,我必须编写一个函数,返回输入列表的累计和、累计积、最大值和最小值。
课程的这一部分是关于函数式编程的,所以我想在这方面全力以赴,尽管我可以使用其他方法。
所以我试了一下:

from operator import mul
from itertools import repeat
from functools import reduce
def reduce2(l):
    print(l)
    return reduce(*l)
def numbers(l):
    return tuple(map(reduce2, zip([sum, mul,min, max], repeat(l,4))))
l=[1,2,3,4,5]
numbers(l)
我的问题是它不起作用。如果在映射中使用,zip将只传递一个要缩减的对象,解压缩zip将产生(函数和参数列表l)的4个元组,因此我定义了reduce2。出于这个原因,我想在其中解压缩zip,但它不起作用。
Python返回一个TypeError:int'对象不可编辑
我原以为可以在reduce2中使用return reduce(l[0],l[1]),但仍然存在相同的错误。
我不理解python在这里的行为。 如果我只使用return-reduce(l),它会再次返回一个TypeError:reduce预期至少有2个参数,得到1个

这里发生了什么事?我怎样才能让它工作?
感谢您的帮助。

实际上,您正在尝试执行以下代码:

xs = [1, 2, 3, 4, 5]
reduce(sum, xs)
但是,
sum
需要一个iterable,并且与通过
reduce
直接使用并不兼容。相反,您需要一个接受2个参数并返回其和的函数——一个类似于
mul
的函数。您可以从
操作员那里获得:

from operator import mul, add
然后只需将程序中的
sum
更改为
add

顺便说一句,函数式编程有一个非常酷的变量命名约定:
x
,以及
xs
。它比难读的
l
变量名要好得多。它还使用单数/复数来告诉您是处理标量值还是集合。

正确诊断代码中的错误。我只想为您的
map
+
zip
方法添加几个备选方案

首先,您可以使用专门为此目的而设计的地图来代替
reduce
,而不是定义特殊版本的
map

def numbers(xs): 
    return tuple(starmap(reduce, zip([add, mul, min, max], repeat(xs))))
但是,最好使用经常被忽略的
map
,而不是手动压缩参数:

def numbers(xs):
    return tuple(map(reduce, [add, mul, min, max], repeat(xs)))

它基本上为您提供了
zip
+
starmap
。在函数编程方面,这个版本的
map
类似于Haskell的函数

非常感谢命名约定的精确性。我不知道。加法做得很好,实际上加法和减法是多余的,现在我明白了。我知道星图,但没有想到,另一方面,这个版本的星图对我来说是未知的。我希望你的答案得到更多的支持。我会接受FMc的回答,就像他第一个回答一样,但你的回答也值得表扬。