Answers:
一种选择是列表理解:
[add(x, 2) for x in [1, 2, 3]]
更多的选择:
a = [1, 2, 3]
import functools
map(functools.partial(add, y=2), a)
import itertools
map(add, a, itertools.repeat(2, len(a)))
add()
是一个非平凡的功能
map()
将无济于事。
map()
其行为类似于zip_longest()
Python 2,而其行为却类似于zip()
文档明确建议这是以下用途的主要用途itertools.repeat
:
制作一个迭代器,一次又一次返回对象。除非指定了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
于docs中的示例:
>>> list(map(pow, range(10), repeat(2)))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
这提供了一个不错的惰性函数式语言y解决方案,该解决方案也可以用Python迭代器术语完美地读取。
def f(x,y,z): \\ return '.'.join([x,y,z])
然后:list(map(f, list('abc'), repeat('foo'), list('defgh')))
返回['a.foo.d', 'b.foo.e', 'c.foo.f']
。
repeat()
,因为map()
它将一直运行到该版本的Python中最长的迭代器用完为止,并填充None
所有缺失的值。说“没有理由”传递参数是错误的。
Map可以包含多个参数,标准方式是
map(add, a, b)
您的问题应该是
map(add, a, [2]*len(a))
正确的答案比您想像的要简单。只需做:
map(add, [(x, 2) for x in [1,2,3]])
并改变添加实现的元组即
def add(t):
x, y = t
return x+y
这可以处理两个添加参数都是动态的任何复杂用例。
有时我使用闭包解决了类似的情况(例如使用pandas.apply方法)
为了使用它们,您需要定义一个函数,该函数可以动态定义并返回该函数的包装器,从而有效地使参数之一成为常数。
像这样:
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函数即时构建它:
>>> map(lambda x: add(x, 2), [1, 2, 3])
[3, 4, 5]
如果确实需要使用map函数(例如此处的类分配...),则可以使用具有1个参数的包装器函数,将其余函数传递给其主体中的原始函数;即:
extraArguments = value
def myFunc(arg):
# call the target function
return Func(arg, extraArguments)
map(myFunc, itterable)
肮脏和丑陋,仍然可以解决问题
myFunc
需要return Func(arg, extraArguments)
Func
是你的原函数的名称- OP紧将add
例如
您可以在地图中包含lambda:
list(map(lambda a: a+2, [1, 2, 3]))
map(add,[1,2,3],[2]*3)
通常,map
将一个函数作为其第一个参数,如果该函数接受K个参数,则必须跟进K可迭代:addTriple(a,b,c) -> map(addTriple,[...],[...],[...])