2013-06-04 50 views
4

我在python工作,試圖將一個函數轉換這種結構:傳遞非迭代變量()與地圖進行評價的功能

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

for iterable in range(20): 
    print func(2,3,iterable) 

進入映射功能:

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

print map(func,2,3,range(20)) #does not work... 

我遇到的問題是通過map()函數傳遞常量,目前我不知道該怎麼做。

我想要這個結構,所以我可以很容易地使用Ipython並行性工具。

假設:

  • 實際功能完成對所有iterables大約需要1.5小時(因此渴望使用並行map()功能
  • 功能是複雜的,不能使用列表理解

從本質上講,如果它不是很明顯,我是一個MATLAB程序員,他正在向Python跳躍,尋找matlab中的parfor函數的一個很好的替代品。

回答

4

首先,如果您將函數映射到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] 

對於有約束力的任何位置參數綁定位置參數(從左至右)的功能,使用lambda表達式像hkpeprah的回答說。

+0

請注意,'partial'不能用於以任意精度指定位置參數。例如,如果要始終提供第三個參數,您必須使用其關鍵字,或者您必須使用lambda'lambda x,y:func(x,y,const)'。 – Bakuriu

+0

我在回答中添加了一條便條,感謝提示。 –

+0

非常好,托馬斯的回答與Bakuriu的完善完美地爲我正在嘗試做的! –

3

如果你提前知道時間的參數,你可以像使用

f = lambda lst: func(2,3,lst) 
map(f, range(20)) 

拉姆達或者,如果你不知道的參數,你可以換一個lambda表達式

f = lambda x: lambda y: lambda lst: func(x,y,lst) 
f = f(2) 
f = f(3) 
map(f, range(20)) 
1

您可以使用閉包:

def initFunction(g, h): 
    def funct(value): 
     return g * h * value 
    return funct 

myFunct = initFunction(g, h) 
mapped = map(myFunct, range(20)) 

PS。我猜你正在爲此使用python 3.x,否則xrange + generator的理解會比範圍大的值更好! (相當於2.7 btw的代碼):

def initFunction(g, h): 
    def funct(value): 
     return g * h * value 
    return funct 

myFunct = initFunction(g, h) 
mapped = (myFunct(i) for i in xrange(20))