Übergabe mehrerer Funktionen incl. Parameter

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
MichaelM
User
Beiträge: 13
Registriert: Dienstag 15. Dezember 2020, 08:37

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
Benutzeravatar
kbr
User
Beiträge: 1501
Registriert: Mittwoch 15. Oktober 2008, 09:27

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)
Benutzeravatar
__blackjack__
User
Beiträge: 13937
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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()
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
MichaelM
User
Beiträge: 13
Registriert: Dienstag 15. Dezember 2020, 08:37

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
Antworten