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?
Liste von Funktionen
- __blackjack__
- User
- Beiträge: 13069
- 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
-
- 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?
NameError: name 'functions' is not defined
Wie kann ich eine Liste von Funktionen anlegen? Deren Deklaration "def f(ab):" angeben?
- __blackjack__
- User
- Beiträge: 13069
- 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.
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
-
- 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.
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.
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.
-
- 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.
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.
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.
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.
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()
- __blackjack__
- User
- Beiträge: 13069
- 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
-
- 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.
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.