2017-11-09 20 views
0

私は、引数を数学関数、引数、反復回数としてとる関数を定義したいと思います(私は固定点定理を持つ関数のゼロを探しています)。 私はゼロを探す方法を知っていますが、私は数式を関数自体から引数を取る方法を知らない。pythonで関数を定義する方法。関数を入力して引数をとり、それを関数に適用する。

def f(function,x,iterations) 

私は例えば、このような何かの関数を呼び出そう:関数はxの既存の変数を取って(私は、コードの別の平和のためにdefindedしていること)とされていない

f(x**2+3,-1,20) 

x = -1ここで私が探している。 私が探している結果は+4

この問題を解決するにはどうすればよいですか?私は自分の関数に別の関数を定義しようとしましたが、私はこれら3つの引数を自分の関数に持たせるよう明示的に求められています。

ありがとうございました。

+0

*数学的な式は単純なPython関数の '' def f(x):return x ** 2 + 3'か、それとも文字列でなければなりませんか? –

答えて

1

Pythonでは、関数は引数として渡すことができるファーストクラスのオブジェクトです。ベース関数を外側に定義することができます。

def my_f(x): 
    return x**2+3 

def my_functor(f, x, iterations): 
    for i in xrange(iterations): 
     x = f(x) 
    return x 

print my_functor(my_f, -1, 20) 

おそらく、デコレータを使用して同じファンクタを定義するより暗黙的な方法があります。この場合

def iterated(fn): 
    """ 
    A decorator to make a function iterate over its outputs. 
    """ 
    def iterated_func(*args, **kwargs): 
     x = args[0] 
     iterations = args[1] 
     for i in xrange(iterations): 
      x = fn(x) 
     return x 
    return iterated_func 

@iterated 
def my_g(x): 
    return x**2+3 

my_g(3,1)==my_f(3)Trueと評価されます。つまり、定義した関数にデコレータ@iteratedを追加することで、反復回数を引数として取得するようにビヘイビアを変更することができます。

+0

あなたの助けていただきありがとうございます。私の例ではこれが私の必要なものです。 –

0

関数を文字列に格納すると 'x ** 2'になり、関数内で関数を使用するときに関数を使用するとevalメソッドが使用されます。 eval()

+0

'eval()'を使用すると、[セキュリティリスク](https://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html)が発生する可能性があります。 – Megabeets

1

sympyを使用すると、数式を安全に評価できます。

まず、sympyをインストールします。

pip install sympy 

を次に、あなたはこのような何かを訴えることができます。

>>> int(myformula(formula="x**2+3", x=-1, iterations=20)) 
4 

かによって:

import sympy as sy 

def mathfunc(formula, **kwargs): 
    expr = sy.sympify(formula) 
    return expr.evalf(subs=kwargs) 


mathfunc(formula="x**2+3", x=-1, iterations=20) 

をあなたはこのようなintとしてそれをキャストすることができます013のreturn文にint()を追加する。

iterationsを使用していないことに注意してください。あなたが望むことについて言及していないので、mathfuncの中で使用できます。

+0

ご協力ありがとうございます、これは私が必要としていたものです。私はsympyについてもっと学ぶ必要がありますが、実用的なようです。 –

関連する問題