Seite 1 von 1

Übergabe mehrerer Funktionen incl. Parameter

Verfasst: Sonntag 17. Januar 2021, 13:12
von MichaelM
Hallo zusammen,
ich möchte eine Gruppe von Funktionen ggf. in einem Array übergeben. Soweit ich Informationen gefunden habe, kann man eine Funktion ohne Parameter einfach übergeben, aberwie ist es mit?

Beispiel ohne:

Code: Alles auswählen

def func_1(x,y):
    fu=x+y
    return(fu)

def func_2(x,y):
    fu=x*y
    return(fu)


list_of_functions=[]
list_of_functions.append(func_1)
list_of_functions.append(func_2)

for function in list_of_functions:
   print(function(3,4))


Wie kann ich nun wahlweise x oder /und y mit in die Liste aufnehmen?
Also in der Art:
list_of_functions.append(func_1,x=3,y=4)


Danke

Re: Übergabe mehrerer Funktionen incl. Parameter

Verfasst: Sonntag 17. Januar 2021, 13:25
von kbr
Das geht indem du beispielsweise die Parameter mit in die Liste aufnimmst, so dass die Funktionsobjekte zusammen mit den jeweiligen Parametern als Tuple vorliegen.

Code: Alles auswählen

functions = [(func1, 3, 4), (func2, 5, 6)]

for function, x, y in functions:
    function(x, y)

Re: Übergabe mehrerer Funktionen incl. Parameter

Verfasst: Sonntag 17. Januar 2021, 13:34
von __blackjack__
@MichaelM: Erst einmal Anmerkungen zum Beispielcode:

Grunddatentypen haben nichts in Namen verloren. Den Typen ändert man gar nicht so selten mal während der Programmentwicklung und dann muss man überall im Programm die betroffenen Namen ändern, oder man hat falsche, irreführende Namen im Quelltext. Also statt `list_of_functions` einfach nur `functions`.

Dann ist das recht umständlich eine leere Liste anzulegen, nur um gleich darauf mit mehreren `append()`-Aufrufen einzelne Elemente anzuhängen. Die kann man da auch gleich in die literale Liste schreiben.

Keine kryptischen Abkürzungen in Namen oder gar Namen die nur aus einer kryptischen Abkürzung bestehen. `fu`?

Man muss auch nichts an einen Namen binden was gleich darauf ausschliesslich mit einer ``return``-Anweisung verwendet wird.

``return`` ist keine Funktion, das sollte man also nicht so schreiben, dass es wie ein Funktionsaufruf aussieht. Da gehört ein Leerzeichen hin und die unnötigen Klammern gehören weg.

`func_1` und `func_2` sind auch schlechte Namen, weil nummeriert. Ich weiss, das ist nur ein Beispielcode, aber die Funktionalität der beiden Beispielfunktionen gibt es bereits in der Standardbibliothek im `operator`-Modul. Das ist jetzt auch nicht aufwändiger für ein Beispiel diese zu verwenden, statt sich die beiden Funktionen selbst zu schreiben. 🙂

Dann sähe das Beispiel als Zwischenstand so aus:

Code: Alles auswählen

#!/usr/bin/env python3
from operator import add, mul


def main():
    functions = [add, mul]
    for function in functions:
        print(function(3, 4))


if __name__ == "__main__":
    main()
Argumente pro Funktion kann man jetzt entweder ins Spiel bringen in dem man in der Liste Tupel aus Funktion und Argumenten speichert:

Code: Alles auswählen

#!/usr/bin/env python3
from operator import add, mul


def main():
    functions = [(add, (3, 4)), (mul, (42, 23))]
    for function, arguments in functions:
        print(function(*arguments))


if __name__ == "__main__":
    main()
Oder Closures mit `functools.partial()` erzeugt:

Code: Alles auswählen

#!/usr/bin/env python3
from functools import partial
from operator import add, mul


def main():
    functions = [partial(add, 3, 4), partial(mul, 42, 23)]
    for function in functions:
        print(function())


if __name__ == "__main__":
    main()

Re: Übergabe mehrerer Funktionen incl. Parameter

Verfasst: Sonntag 17. Januar 2021, 16:37
von MichaelM
Vielen Dank für die Antworten und Anmerkungen.
Es waren tatsächlich nur Beispiele um möglichst wenig Code hier zu verwenden.
Meine Frage ist beantwortet und mein kleines Problem gelöst.

Grüße