如何做多个参数来映射函数,其中一个在python中保持不变?
可以说我们有一个function添加如下
def add(x, y): return x + y
我们要为数组应用map函数
map(add, [1, 2, 3], 2)
语义是我想添加2到数组的每个元素。 但是map
函数也需要第三个参数中的列表。
注意:为了简单起见,我将添加示例。 我原来的function要复杂得多。 当然,在add函数中设置y
的默认值的选项是没有问题的,因为每次调用都会改变。
一个选项是列表理解:
[add(x, 2) for x in [1, 2, 3]]
更多的select:
a = [1, 2, 3] import functools map(functools.partial(add, y=2), a) import itertools map(add, a, itertools.repeat(2, len(a)))
使用列表理解。
[x + 2 for x in [1, 2, 3]]
如果你真的 真的想要使用map
,可以给它一个匿名函数作为第一个参数:
map(lambda x: x + 2, [1,2,3])
文档明确提出这是itertools.repeat
的主要用途:
做一个迭代器,一遍又一遍地返回对象。 除非指定了times参数,否则无限期地运行。 用作
map()
参数给被调用函数的参数。 还与zip()
一起使用来创build元组logging的不变部分。
并没有理由将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]
这使得一个漂亮的lazy-functional-language-y解决scheme在Python-iterator术语中也是完全可读的。
如果你有它,我会考虑使用numpy。 这些操作的速度非常快:
>>> import numpy >>> numpy.array([1,2,3]) + 2 array([3, 4, 5])
这是假设你真正的应用程序正在做math运算(可以vector化)。
如果你确实需要使用map函数(比如我的类的赋值),你可以使用一个带有1个参数的包装函数,其余的部分传递给它的正文; 即:
extraArguments = value def myFunc(arg): # call the target function return Func(arg, extraArguments) map(myFunc, itterable)
肮脏和丑陋,仍然有窍门
有时我使用闭包来解决类似的情况(比如使用pandas.apply方法)
为了使用它们,你需要定义一个函数来为你的函数dynamic地定义和返回一个包装器,使得其中一个参数是一个常量。
像这样的东西:
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]
编辑
如果你不想在其他地方写闭包函数,你总是可以使用lambda函数来dynamic构build它:
>>> map(lambda x: add(x, 2), [1, 2, 3]) [3, 4, 5]
正确的答案比你想象的要简单。 简单地做:
map(add, [(x, 2) for x in [1,2,3]])
并改变执行添加采取一个元组即
def add(t): x, y = t return x+y
这可以处理任何添加参数都是dynamic的复杂用例。
地图可以包含多个参数,标准的方式是
map(add, a, b)
在你的问题,应该是
map(add, a, [2]*len(a))
将多个parameter passing给map
函数。
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.
另一个select是:
results = [] for x in [1,2,3]: z = add(x,2) ... results += [f(z,x,y)]
这种格式在调用多个函数时非常有用。