Frage Erstellen einer neuen Funktion als Rückgabe in Python-Funktion?


Ich habe mich gefragt, ob es in Python möglich ist, Folgendes zu tun:

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

Was ich meine, ist, dass ich etwas mit a, b mache, was zu einigen Koeffizienten führt, die eine neue Funktion definieren können. Ich möchte diese Funktion erstellen, wenn die Operationen mit a, b tatsächlich möglich sind und auf diese außerhalb von func1 zugreifen können .

Ein Beispiel wäre eine einfache Fourier-Reihe F (x) einer gegebenen Funktion f:

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

Was ich damit meine, ist, dass ich diese neue Funktion für den späteren Gebrauch erstellen und speichern möchte, vielleicht möchte ich sie ableiten oder integrieren oder plotten oder was auch immer ich machen möchte, ich möchte den Punkt nicht für x senden Auswertung in fourier_series (oder func1 (..)), ich sage einfach, dass fourier_series eine neue Funktion erzeugt, die eine Variable x nimmt, diese Funktion kann später wie y = F (3) außerhalb aufgerufen werden ... wenn ich mich klar genug gemacht habe ?


5
2017-10-05 00:45


Ursprung


Antworten:


Sie können dies tun, indem Sie eine neue Funktion inline definieren:

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

Sie sind nicht auf die Argumente beschränkt, an die Sie sich wenden fourier_series:

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

>>> fun = f(10)
>>> fun(3)
8

7
2017-10-05 00:53



Während ich Ihnen keine Antwort geben kann, die spezifisch ist, was Sie vorhaben zu tun. (Sieht aus wie Mathe außerhalb meiner Liga.)

Ich kann dir sagen, dass Python unterstützt erstklassige Funktionen.

Python kann Funktionen aus Funktionen zurückgeben, Funktionen in Auflistungen wie Listen speichern und sie im Allgemeinen wie jede andere Variable behandeln.

Coole Dinge wie das Definieren von Funktionen in anderen Funktionen und das Zurückgeben von Funktionen sind alle möglich.

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

Funktionen können Variablen zugewiesen und in Listen gespeichert werden, sie können als Argumente für andere Funktionen verwendet werden und sind so flexibel wie jedes andere Objekt.


3
2017-10-05 00:56



Sie können Funktionen innerhalb von Funktionen definieren und diese zurückgeben (ich denke, das sind technische Schließungen):

def make_f(a, b):
    def x(a, b):
      return a+b
     return x(a, b)

1
2017-10-05 00:50



Du könntest einen benutzen lambda (obwohl ich die anderen Lösungen ein bisschen mehr mag, denke ich :)):

>>> 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)
>>>

1
2017-10-05 00:52



Wenn Sie eine Funktion innerhalb Ihrer äußeren Funktion definieren, können Sie die Parameter verwenden, die an die äußere Funktion in der Definition der inneren Funktion übergeben werden, und diese innere Funktion als Ergebnis der äußeren Funktion zurückgeben.

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

0
2017-10-05 00:50



Ich denke, was du machen willst ist:

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

Draußen kannst du das wie:

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

Aus der Sicht von Python ist Folgendes wichtig:

  1. Ja, Sie können eine Funktion in eine Funktion schreiben
  2. Ja, Sie können eine Funktion von einer Funktion zurückgeben. Stellen Sie sicher, dass Sie es mit zurückgeben return F (die das Funktionsobjekt zurückgibt) im Vergleich zu return F(x) welche die Funktion aufruft und den Wert zurückgibt

0
2017-10-05 00:53