Liste von Funktionen

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
hubertgrassmann
User
Beiträge: 61
Registriert: Montag 26. Dezember 2022, 14:53

Ich habe eine Matrix m mit integers belegt und möchte in Abhängigkeit von m[z][s] eine plot-Funktion aufrufen, dazu habe ich eine Liste f mit Funkionsnamen angelegt und den Wert der zu übergebenden Parameter festgelegt.
Der Aufruf f(m[z][s]) ergibt
TypeError: 'list' object is not callable
Das kann ich verstehen; ich möchte aber nicht für jedes Paar (z,s) den m-Inhalt ansehen und die entsprechende Funktion 'von Hand' aufrufen.
Kann man da was machen?
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@hubertgrassmann: Das ist ja erwartbar das man eine Liste nicht aufrufen kann. Und eine Liste mit Funktions*namen* nützt ja auch nicht direkt etwas, da würde man eher eine Liste mit *Funktionen* anlegen. Und dann holt man sich die Funktion über den Index aus der Liste und ruft *das* Objekt dann auf. Also ``functions[matrix[zoidberg][starfish]]()``.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
hubertgrassmann
User
Beiträge: 61
Registriert: Montag 26. Dezember 2022, 14:53

Danke, eine gute Idee. Aber:
NameError: name 'functions' is not defined

Wie kann ich eine Liste von Funktionen anlegen? Deren Deklaration "def f(ab):" angeben?
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@hubertgrassmann: Natürlich ist `functions` unbekannt wenn man das nicht definiert. Komme mir leicht veralbert vor…

Alles was man an einen Namen binden kann ist in Python ein Objekt. Auch Funktionen. Und Objekte kann man in Listen speichern. Zum Beispiel in dem man eine literale Liste hinschreibt, in die man die Objekte schreibt. Also bei Funktionen einfach den Namen, der wird dann ja zu dem Objekt ausgewertet.

Code: Alles auswählen

functions = [function_a, another_function, super_duper_function]
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
hubertgrassmann
User
Beiträge: 61
Registriert: Montag 26. Dezember 2022, 14:53

Ja, meine Liste heißt f, ich dache, 'functions' wäre ein Typ.
Die Liste besteht aus Funtionsnamen, und das klappt ja auch.
Ich dachte, ich stelle keine richtig dumme Fragen, will auch keinen veralbern, bin aber ein Neuling bei python.
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du zeigst nicht ausreichend Code. Sondern beschreibst deine vermeintlichen Probleme, obwohl du - weil ja Neuling - gar nicht vollumfaenglich verstehst, was du da treibst. Das ist nicht ideal. Mehr Kontext ist besser. Dann koennen wir helfen.
hubertgrassmann
User
Beiträge: 61
Registriert: Montag 26. Dezember 2022, 14:53

Ich will doch keinen mit langen codes belästigen, blackjack hat mich darauf hingewiesen, wie man eine Funtion aufruft, bei mir heißt das
f[m[z][s]]([z,s],'r')
und das klappt ja auch (am Punkt [z,s] wird die Funktion f[m[z][s](...) ausgeführt).
Ich bedanke mich für den Hinweis.
imonbln
User
Beiträge: 149
Registriert: Freitag 3. Dezember 2021, 17:07

Die Grundlagen der Programmiersprache musst Du selbst lernen. Aber in Python sind auch Funktionen und Klassen ein First-Class-Objekt (im englischen First-class citizen). Das heißt unter andern, dass Du sie wie alle anderen Objekte auch in einer Liste zusammenfassen kannst und dann aus der Liste heraus aufrufen. Wenn nötig könnte man das auch Dynamsich über die Funktionsnamen machen, aber das ist im Augenblick zu Komplex, daher werde ich Dir das nicht zeigen, sondern nur denn einfachen Fall.

Code: Alles auswählen

def func1(param):
    print(f"function 1: {param}")


def func2(param):
    print(f"function 2: {param}")


def func3(param):
    print(f"function 3: {param}")


def main():
    functions = [func1, func2, func3]
    for funktion in functions:
        fkt(2)


if __name__ == '__main__':
    main()

Es kann sinnvolle Anwendungen für sowas geben, aber Deine Fragestellung lässt vermuten, dass Du noch nicht an einem Punkt bist, wo es wirklich sinnvoll ist so ein Design zu wählen. Am besten Du belästigt uns doch mit etwas mehr Code, um zu sehen, ob es nicht vielleicht ein besseres Design gibt.
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@hubertgrassmann: Die Liste besteht nicht aus Funktionsnamen. Jedenfalls nicht die in meinem Beispiel. Die besteht aus Funktionen. Der Name wäre ja nur eine Zeichenkette. Wenn man die Namen in einer Liste hätte, müsste man noch einen Schritt einbauen der den Namen auf die Funktion abbildet. Zum Beispiel über ein Wörterbuch (`dict`) oder das man die Funktionen alle in *einem* Modul definiert und die dort mit `getattr()` über den Namen abfragt.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
hubertgrassmann
User
Beiträge: 61
Registriert: Montag 26. Dezember 2022, 14:53

an imonbln:
Ich bin dabei, keltische Knoten herzustellen, alle meine Fragen sind geklärt (s.o.). Und ich bin kein heuriger Hase, aber ein python-Anfänger.
Antworten