2016-04-04 5 views
1
def f(x): 
    return (x - 2)/2 
def g(x): 
    return x 

このコードは、これを行います。関数の本体を変更せずに関数の戻り値を変更する方法はありますか?

func = g(f) 

今FUNC(1)= -1/2

私はグラムを変更したい場合(x)は(とFではない(x))をそのように

func = g(f) 
func(1) = 1/2 

これを行う方法はありますか?

はあなたに 編集に感謝:f(x)が、おそらくあなたは別の関数をラップ機能を探している負の数

+0

'g 'に1/2を返す関数を返します。 – interjay

+0

多分gの戻り値は次のようになります。return abs(x)? –

+0

ポイントは関数f(x)は負の数を返す任意の関数になります – Mrfuzzy

答えて

3

を返す任意の関数とすることができます。これはPythonでdecoratorsを使って行うことができます。

あなたの関数f(x)が与えられたら、の負の関数値を受け取りたいとします。 f(x)は任意の数の引数を持つ任意の関数である可能性があります。おそらくあなたは実際にはf(x)を全く知らないでしょう。

def g(func): 
    @wraps(func) 
    def wrapper(*args, **kwargs): 
     func_value = func(*args, **kwargs) 
     return -func_value 
    return wrapper 

func後処理その出力包むラッパーを返しg(func)機能:

>>> new_func = g(f) # your original f(x) 
>>> print(new_func(1)) 
0.5 

これを

Pythonの標準ライブラリには、この場合には本当に便利ですfunctools.wraps、付属していますファンクションfuncで動作し、任意の数の位置またはキーワード引数を使用できます。一般的なアプリケーションのための

4
>>> def f(x): 
...  return (x - 2)/2 
... 
>>> def g(function): 
...  return lambda x: abs(function(x)) 
... 
>>> func = g(f) 
>>> func(1) 
0.5 
1

def absfunc(f): 
    def absf(*args): 
     return abs(f(*args)) 
    return absf 

@absfunc 
def f(x) :return (x-2)/2 

f(1)は今0.5です。戻り値は、本体と名前の両方を変更することなく変更できます。

関連する問題