2016-08-03 52 views
1

假設我想定義一個接受函數作爲參數的元函數並返回一個新的修改後的函數。像對函數起作用並返回函數的函數

metaf(f) -> f**2 

所以,無論f會導致,metaf東西會導致與答案的兩個電源(如果結果不能被提升到2的冪,就這樣吧。引發錯誤)。

目前我發現做到這一點的方式,需要在metaf定義明確提及的f的說法,即定義

metaf = lambda f, x : f(x)**2 

然後

mynewf = lambda x : metaf(f, x) 

這工作,但我想知道它是否適用於輸入參數可能有很多變化的複雜參數函數。

所以我想知道你是否可以建議一種不同的方式,尤其是那種不需要在metaf定義中指定參數的方法。

編輯:以下兩個答案都很有幫助。僅供參考,在回答問題之後,我也意識到如何使用lambda表達式來定義metaf。略顯繁瑣,但可能仍然是值得注意的:

metaf = lambda func: lambda *args, **kwargs : func(*args, **kwargs)**2 
+1

你想實現一個裝飾器嗎? – cdarke

回答

3

您應該能夠使用*args**kwargs吞噬所有其他參數,並把它們像這樣:

def squarer(f): 
    return lambda *args, **kwargs: f(*args, **kwargs)**2 


>>> squarer(lambda x: x+1)(3) 
16 
>>> squarer(lambda x: x+1)(4) 
25 
>>> squarer(lambda x,y: x+1)(4) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 2, in <lambda> 
TypeError: <lambda>() takes exactly 2 arguments (1 given) 
>>> squarer(lambda x,y=1: x+y)(4) 
25 
>>> squarer(lambda x,y=1: x+y)(4,2) 
36 
4

我相信這是你所追求的:

def metaf(f): 
    def func(*r, **kw): 
     return f(*r, **kw) ** 2 
    return func 

現在我們定義一些f ...

def f(a, b): 
    return a + b 

,這裏是將其轉換:

mynewf = metaf(f) 

試試:

In [148]: f(10, 20) 
Out[148]: 30 

In [149]: mynewf(10, b=20) 
Out[149]: 900 

請注意mynewf的使用率使用正常參數和關鍵字參數的。我按照你的預期工作。