繁体   English   中英

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

[英]map of function list and arguments: unpacking difficulty

我在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)

我的问题是它不起作用。 如果我在map中使用它,zip将只传递一个对象减少,并且解压缩zip将产生4个元组(函数和参数列表l)所以我定义了reduce2因为这个原因,我想解压缩其中的zip但是它不工作。
Python返回一个TypeError:int'对象不可迭代
我认为我可以在reduce2中使用return reduce(l [0],l [1]),但仍然存在相同的错误。
我不明白python的行为。 如果我只使用return reduce(l),它会再次返回一个TypeError:减少预期的至少2个参数,得到1

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

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

xs = [1, 2, 3, 4, 5]
reduce(sum, xs)

但是sum需要一个可迭代的,并且与通过reduce直接使用并不真正兼容。 相反,你需要一个带有2个参数并返回它们的和的函数 - 一个类似于mul的函数。 你可以从operator那里得到:

from operator import mul, add

然后只需更改sum即可add到您的程序中。

BTW,函数式编程有一个非常酷的变量命名约定: x表示一件事, xs表示它们的列表。 它比难以阅读的l变量名要好得多。 它还使用单数/复数来告诉您是处理标量值还是集合。

FMc答案正确诊断代码中的错误。 我只想为你的map + zip方法添加几个替代方案。

首先,不是定义特殊版本的reduce ,而是使用itertools.starmap而不是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的zipWith函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM