假设我们有一个函数add如下所示

def add(x, y):
    return x + y

我们想为数组应用map函数

map(add, [1, 2, 3], 2)

语义是我想给数组的每个元素加2。但是map函数在第三个参数中也需要一个列表。

注意:为了简单起见,我使用了添加示例。原来的函数要复杂得多。当然,在add函数中设置y的默认值是不可能的,因为每次调用都会改变它。


当前回答

使用列表推导式。

[x + 2 for x in [1, 2, 3]]

如果你真的,真的,真的想使用map,给它一个匿名函数作为第一个参数:

map(lambda x: x + 2, [1,2,3])

其他回答

如果你真的需要使用map函数(就像我的课堂作业…),你可以使用一个包装器函数只有一个参数,其余的传递给原始的一个在它的主体;例如:

extraArguments = value
def myFunc(arg):
    # call the target function
    return Func(arg, extraArguments)


map(myFunc, itterable)

又脏又丑,还是有用的

文档明确建议这是itertools.repeat的主要用途:

创建一个反复返回object的迭代器。除非指定了times参数,否则无限期地运行。用作map()的参数,用于指定被调用函数的不变形参。也与zip()一起用于创建元组记录的不变部分。

并且没有理由将len([1,2,3])作为times参数;Map在第一个迭代对象被消耗后立即停止,所以无限迭代对象是完全没问题的:

>>> from operator import add
>>> from itertools import repeat
>>> list(map(add, [1,2,3], repeat(4)))
[5, 6, 7]

事实上,这相当于文档中repeat的例子:

>>> list(map(pow, range(10), repeat(2)))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

这是一个很好的惰性函数语言解决方案,在python迭代器术语中也是完全可读的。

Map可以包含多个参数,标准方式是

map(add, a, b)

在你的问题中,应该是

map(add, a, [2]*len(a))

另一种选择是:

results = []
for x in [1,2,3]:
    z = add(x,2)
    ...
    results += [f(z,x,y)]

这种格式在调用多个函数时非常有用。

我相信星图就是你所需要的:

from itertools import starmap


def test(x, y, z):
    return x + y + z

list(starmap(test, [(1, 2, 3), (4, 5, 6)]))