将不可迭代的变量传递给使用map()计算的函数

Rob*_*ews 4 python parallel-processing map ipython

我在python中工作并尝试使用此结构转换函数:

def func(g,h,iterable):
 return iterable*(g+h)

for iterable in range(20):
  print func(2,3,iterable)
Run Code Online (Sandbox Code Playgroud)

进入映射函数:

def func(g,h,iterable):
 return iterable*(g+h)

print map(func,2,3,range(20)) #does not work...
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是通过map()函数传递常量,目前我不知道该怎么做.

我想要这个结构,所以我可以轻松使用Ipython并行工具.

假设:

  • 所有迭代的实际功能完成需要约1.5小时(因此需要使用并行map()功能)
  • 功能很复杂,不能使用列表理解

从本质上讲,如果还不是很明显,我是一名MATLAB程序员,可以实现python的飞跃,并parfor在matlab中寻找一个很好的替代函数.

Tho*_*nzl 5

首先,如果您将函数映射到a range,则没有参数是可迭代的.

对于您的问题,您可以使用functools.partial将位置参数(从左到右)绑定到函数

def func(g,h,i):
    return i*(g+h)

print map(functools.partial(func, 2,3), range(20))

# [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]
Run Code Online (Sandbox Code Playgroud)

要绑定任何位置参数,请使用hkpeprah的答案中所述的lambda表达式.


For*_*ord 5

如果你提前知道参数,你可以使用像这样的 lambda

f = lambda lst: func(2,3,lst)
map(f, range(20))
Run Code Online (Sandbox Code Playgroud)

或者,如果您不知道参数,可以包装 lambda 表达式

f = lambda x: lambda y: lambda lst: func(x,y,lst)
f = f(2)
f = f(3)
map(f, range(20))
Run Code Online (Sandbox Code Playgroud)