假设我们有一个函数add如下所示
def add(x, y):
return x + y
我们想为数组应用map函数
map(add, [1, 2, 3], 2)
语义是我想给数组的每个元素加2。但是map函数在第三个参数中也需要一个列表。
注意:为了简单起见,我使用了添加示例。原来的函数要复杂得多。当然,在add函数中设置y的默认值是不可能的,因为每次调用都会改变它。
假设我们有一个函数add如下所示
def add(x, y):
return x + y
我们想为数组应用map函数
map(add, [1, 2, 3], 2)
语义是我想给数组的每个元素加2。但是map函数在第三个参数中也需要一个列表。
注意:为了简单起见,我使用了添加示例。原来的函数要复杂得多。当然,在add函数中设置y的默认值是不可能的,因为每次调用都会改变它。
当前回答
有时我解决类似的情况(比如使用熊猫。应用方法)使用闭包
为了使用它们,定义一个函数,动态定义并返回函数的包装器,有效地使其中一个参数成为常量。
就像这样:
def add(x, y):
return x + y
def add_constant(y):
def f(x):
return add(x, y)
return f
然后,add_constant(y)返回一个函数,可用于将y添加到任何给定值:
>>> add_constant(2)(3)
5
这允许你在每次给出一个参数的任何情况下使用它:
>>> map(add_constant(2), [1,2,3])
[3, 4, 5]
edit
如果你不想在其他地方写闭包函数,你总是可以使用lambda函数动态地构建它:
>>> map(lambda x: add(x, 2), [1, 2, 3])
[3, 4, 5]
其他回答
另一种选择是:
results = []
for x in [1,2,3]:
z = add(x,2)
...
results += [f(z,x,y)]
这种格式在调用多个函数时非常有用。
有时我解决类似的情况(比如使用熊猫。应用方法)使用闭包
为了使用它们,定义一个函数,动态定义并返回函数的包装器,有效地使其中一个参数成为常量。
就像这样:
def add(x, y):
return x + y
def add_constant(y):
def f(x):
return add(x, y)
return f
然后,add_constant(y)返回一个函数,可用于将y添加到任何给定值:
>>> add_constant(2)(3)
5
这允许你在每次给出一个参数的任何情况下使用它:
>>> map(add_constant(2), [1,2,3])
[3, 4, 5]
edit
如果你不想在其他地方写闭包函数,你总是可以使用lambda函数动态地构建它:
>>> map(lambda x: add(x, 2), [1, 2, 3])
[3, 4, 5]
正确答案比你想象的要简单。 只是做的事:
map(add, [(x, 2) for x in [1,2,3]])
并将add的实现更改为接受一个元组,即
def add(t):
x, y = t
return x+y
这可以处理任何添加参数都是动态的复杂用例。
文档明确建议这是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迭代器术语中也是完全可读的。
将多个参数传递给映射函数。
def q(x,y):
return x*y
print map (q,range(0,10),range(10,20))
这里q是map()调用的带有多个参数的函数。 确保,两个范围的长度,即。
len (range(a,a')) and len (range(b,b')) are equal.