2017-04-14 18 views
0

.I具有分類器函數:如何使用地圖caculate一個函數與一個以上的參數

def f(x, threshold): 
if logi == 1: 
    if x > threshold: 
     return 1 
    else: 
     return 0 

並有一個列表中的= [2,3,12,4,53,3] ,如果使用map(f(threshold = 4),a)將引發錯誤「f()缺少1所需的位置參數:'x'」 但如果我指定閾值默認4,它將工作。修改函數定義爲

def f(x, threshold=4): 
if logi == 1: 
    if x > threshold: 
     return 1 
    else: 
     return 0 
map(f,a) 

將有預期的結果[0,0,1,0,1,0],我想知道是否有一些方法可以達到不指定參數的默認值相同的目標?提前致謝!

回答

0

我想知道是否有一些方法可以達到相同的目標 沒有指定參數默認?提前致謝!

確實有!,真的有幾種方法。 個人我會使用列表理解,因爲它們是非常可讀的。就像這樣:

def f(x, threshold, logi=1): 
    if logi == 1: 
     if x > threshold: 
      return 1 
     else: 
      return 0 
    else: 
     if x < threshold: 
      return 1 
     else: 
      return 0 

a=[2, 3, 12, 4, 53, 3] 

x = [f(item, 4) for item in a] 
print(x) 
#output => [0, 0, 1, 0, 1, 0] 

希望這有助於:)

如果你在地圖上的設置,那麼也許functools將幫助:

from functools import partial 
mapfunc = partial(f, 4) 
(map(mapfunc, a)) 
+0

是否有方法使用功能圖達到黃金? – martin

+0

@martin也許functools部分是你在找什麼,是一個進口好嗎? – Scheme

0

map支持接收多種iterables,停車時最短的是用盡,將每個輸出作爲順序位置參數傳遞給映射函數。如果你有一個固定的說法,你可以用itertools.repeat一遍一遍生產它,例如:

from itertools import repeat 

map(f, a, repeat(4)) 

這種方法推廣到更復雜的場景,可以讓騎車一組固定值(itertools.cycle),或者只是與zip一樣配對兩個迭代,但不需要zip,然後itertools.starmap元組返回位置參數。

另一種方法這是專門爲一個常數參數有用是局部結合與functools.partial

from functools import partial 
map(partial(f, threshold=4), a) 

其中partial創建包裝函數新的(在CPython的C級),將通過所提供的參數被包裝的函數當沒有明確覆蓋。

相關問題