31

Pythonで次のことができるかどうか疑問に思っていました:

def func1(a,b):
   return func2(c,d)

つまり、新しい関数を定義できるいくつかの係数につながる a,b を使用して何かを行うとします。a、b を使用した操作が実際に可能であり、func1 の外部でこれにアクセスできる場合は、この関数を作成したいと考えています。 .

例として、与えられた関数 f の単純なフーリエ級数 F(x) があります。

def fourier_series(f,N):
   ...... math here......
    return F(x)

これが意味することは、後で使用するためにこの新しい関数を作成して保存したいということです。おそらく、それを導出したり、統合したり、プロットしたり、やりたいことは何でもしたいのですが、ポイントxを送信したくありませんfourier_series (または func1(..)) での評価、私は単に fourier_series が変数 x を取る新しい関数を作成すると言います。この関数は後で y = F(3) のように外部で呼び出すことができます...私が十分に明確にすれば?

4

7 に答える 7

40

新しい関数をインラインで定義することで、これを実行できるはずです。

fourier_series(f, N):
    def F(x):
        ...
    return F

に渡す引数に限定されませんfourier_series

def f(a):
    def F(b):
        return b + 5
    return F

>>> fun = f(10)
>>> fun(3)
8
于 2012-10-05T00:53:17.487 に答える
4

(私はlambda他のソリューションがもう少し好きですが、私は思います:)):

>>> def func2(c, d):
...   return c, d
...
>>> def func1(a, b):
...   c = a + 1
...   d = b + 2
...   return lambda: func2(c,d)
...
>>> result = func1(1, 2)
>>> print result
<function <lambda> at 0x7f3b80a3d848>
>>> print result()
(2, 4)
>>>
于 2012-10-05T00:52:48.007 に答える
4

あなたが何をしようとしているのか、具体的にお答えすることはできませんが。(私のリーグ外の数学のように見えます。)

Python はfirst-class functionsをサポートしていると言えます。

Python は、関数から関数を返し、関数をリストなどのコレクションに格納し、通常はそれらを変数と同じように扱います。

他の関数で関数を定義したり、関数を返すなどのクールなことはすべて可能です。

>>> def func():
...     def func2(x,y):
...         return x*y
...     return func2
>>> x = func()
>>> x(1,2)
2

関数は変数に割り当ててリストに格納でき、他の関数の引数として使用でき、他のオブジェクトと同じくらい柔軟です。

于 2012-10-05T00:56:05.730 に答える
2

外側の関数内で関数を定義する場合、内側の関数の定義で外側の関数に渡されたパラメーターを使用し、その内側の関数を外側の関数の結果として返すことができます。

def outer_function(*args, **kwargs):
    def some_function_based_on_args_and_kwargs(new_func_param, new_func_other_param):
        # do stuff here
        pass
    return some_function_based_on_args_and_kwargs
于 2012-10-05T00:50:02.250 に答える
1

関数内で関数を定義し、これらを返すことができます (これらは技術的にクロージャーだと思います)。

def make_f(a, b):
    def x(a, b):
      return a+b
     return x(a, b)
于 2012-10-05T00:50:15.607 に答える
0

あなたがやりたいことは次のとおりだと思います:

def fourier_series(f,N):
    #...... math here......
    def F(x):
        #... more math here ...
        import math #blahblah, pseudo code
        return math.pi #whatever you want to return from F
    if f+N == 2: #pseudo, replace with condition where f,N turn out to be useful
        return F
    else:
        return None

外部では、これを次のように呼び出すことができます。

F = fourier_series(a,b)
if F:
    ans = F(x)
else:
    print 'Fourier is not possible :('

Python の観点から重要なことは次のとおりです。

  1. はい、関数内に関数を書くことができます
  2. はい、関数から関数を返すことができます。関数を呼び出して値を返すのとreturn F比較して、(関数オブジェクトを返す)を使用して必ず返すようにしてくださいreturn F(x)
于 2012-10-05T00:53:18.807 に答える