Ich bin auf Übung 41 in Python auf dem schwierigen Weg, und es fällt mir wirklich schwer, mich daran zu gewöhnen, dass die ganze Sache von einer laufenden Funktion abhängt, nur weil sie als Wert zugewiesen wurde eine Variable. Ich habe ein kleines Skript geschrieben, um zu bestätigen, dass es so funktioniert, und es tut:
%Vor%Mit den Ergebnissen:
%Vor%Das passiert offensichtlich, aber ich kann nicht verstehen, warum die Sprache so funktioniert - was die Logik hinter der Sprache ist, die dies zu einer wertvollen Arbeitsweise macht. Ich denke, es wäre hilfreich für mich, zu verstehen, warum das ist, anstatt nur "so funktioniert es".
Aus Gründen der Übersichtlichkeit: Ich frage (ich schätze), warum die Funktion ausgeführt wird, wenn ich sie nur als Wert für etwas festlege. Die print-Anweisungen sind nur da, also kann ich sehen, dass die Funktion tatsächlich ausgeführt wird.
Es ist die Tatsache, dass ich niemals wirklich laufe
Hosen () Shorts ()
das verwirrt mich.
Um eine gequälte Analogie zu schaffen, wenn ich-Kekse backen-zu-Hause "Kekse ()" waren, und ich an Samstagen Kekse machen sollte, könnte ich schließlich glauben, dass
Samstag = cookies ()
aber nur zu denken "hey, Samstag ist Cookie-Tag" ist nicht das gleiche wie tatsächlich Kekse backen ... also warum sagt nur
Samstag = cookies ()
backen tatsächlich die Kekse, anstatt nur Samstag mit der Variablen "cookies ()" für eine spätere Verwendung einzurichten?
Das passiert offensichtlich, aber ich kann nicht verstehen, warum die Sprache so funktioniert - was die Logik hinter der Sprache ist, die dies zu einer wertvollen Arbeitsweise macht. Ich denke, es wäre hilfreich für mich, zu verstehen, warum das so ist, anstatt nur "so funktioniert es."
Die Sprache braucht eine Möglichkeit, zwischen der Funktion und dem Aufruf der Funktion zu unterscheiden. Das sind die Klammern.
%Vor% Jetzt ist f
an die Funktion selbst gebunden. Die Funktion foo
könnte von f()
ausgeführt werden.
Dies ruft die Funktion foo
auf und bindet den Rückgabewert an f
.
Beachten Sie, dass es egal ist, ob Sie den Rückgabewert an einen Namen binden. Einfach schreiben
%Vor%führt auch die Funktion aus, aber der Rückgabewert wird einfach ignoriert.
Obwohl es so aussieht, als würden Ihre Funktionen nichts zurückgeben, tun sie das tatsächlich. Zitieren die Python.org-Dokumentation :
Die return-Anweisung gibt einen Wert aus einer Funktion zurück. return ohne ein Ausdruckargument gibt None zurück. Das Abfallen vom Ende einer Funktion gibt auch None zurück.
Ihre Funktionen sehen also so aus:
%Vor% Ihre Zuweisungen werden zap
was auch immer pants
zurückgegeben (d. h. der Wert von pants()
) und thing
was auch immer shorts
zurückgibt. In Ihrem Fall sind beide None
, aber natürlich müssen die Funktionen ausgeführt werden, um dies herauszufinden (*). Schließlich könnte pants
in Schaltjahren 42
zurückgeben, und shorts
gibt 'Foobar'
zurück, wenn ein Zufallszahlengenerator eine 6 "rollt".
(*) Exkurs: Dass die Funktionen "ausgeführt werden müssen" sollte nicht allgemeingültig sein. In einem reinen Setting , und abgesehen von den Besonderheiten von Python (von denen ich sehr wenig weiß), könnte ein Compiler das erkennen Beide Funktionen sind identisch None
und verursachen keine Aufrufe, wenn das Programm ausgeführt wird. Aber eine Funktion, die etwas ausdruckt (oder prüft, ob das aktuelle Jahr ein Schaltjahr ist oder einen Würfel würfelt), ist nicht rein.
zap = pants()
bindet den Rückgabewert der Funktion an die Variable, daher wird die Funktion natürlich ausgeführt, wenn Sie sie an eine Variable binden.
druckt 1
.
Ich hoffe, das hilft.
Edit: Wenn Sie erwarten, dass der Wert der Variable "auf eine Hose" gesetzt wird, verwirren Sie tatsächlich print
und return
, wie die Leute in den Kommentaren darauf hingewiesen haben.
Wenn der Interpreter einen Funktionsnamen sieht, gefolgt von (), weiß er, dass er diese Funktion ausführen soll.
Was Sie dort tun, sagt "Weisen Sie diesen Variablen das Ergebnis dieser Funktionen zu".
Da Sie jedoch keine Werte aus diesen Funktionen zurückgeben, sehen Sie in den Variablen nichts.
Da Sie jedoch eine print-Anweisung dort haben, sehen Sie, dass der Interpreter diese Funktionen ausführt, während er versucht, die Variable den Ergebnissen dieser Funktion zuzuordnen.
Ihre Funktionen werden wegen der Klammern nach dem Namen aufgerufen:
%Vor%Dies ruft die Funktion pants auf und setzt das Ergebnis in zap. Wenn Sie dies stattdessen getan hätten:
%Vor%Dann würde zap sich jetzt auf die Hosenfunktion selbst beziehen.
Und wenn du gerade geschrieben hast
%Vor%Dann würde die pants-Funktion ebenfalls aufgerufen, aber das Ergebnis (welches None ist) wäre niemals in eine Variable eingefügt worden.
Von Ihrer Frage aus, was ich denke, dass zap
den Wert "Put on some pants!"
und thing
den Wert "And don't forget your underwear!"
haben wird. Wenn das Ihr Problem ist, lassen Sie uns darüber sprechen. Ansonsten müssen Sie nicht weiterlesen, da ich gerade darüber diskutiert habe.
Lass es uns etwas Spaß machen. Wenn Sie eine Funktion definieren, sind Sie wie beim Erstellen eines Computers, der das ausführt, was Sie tun möchten. Nun denken wir an eine Maschine, die, wenn Sie etwas zu essen geben, es zerhackt und ... nichts tut! Ich meine, ich habe diese Maschine zum Hacken von Lebensmitteln und sonst nichts gemacht! Du wirst dein gehacktes Essen nicht zurück bekommen, aber es hat dein Essen gehackt, als du es gemacht hast.
Nun, da du dein gehacktes Essen zurück haben willst, erschaffst du eine andere Maschine, die dein Essen nimmt, sie hackt und dir zurückgibt. Fruchtbare Maschine, nicht wahr? ; -)
Sie sind alle wahr für Funktionen in Programmierung oder Mathematik (obwohl ich keine Leerfunktion in Mathematik kenne!: P). Wenn Sie die Funktion erstellen, müssen Sie ihr mitteilen, ob es nur funktioniert oder ob funktioniert und das Ergebnis zurückgibt . Die Art, eine Funktion zu benennen, ist die return
-Anweisung. In deinen Funktionen hast du gerade gesagt, dass du etwas tun musst. Und das ist print "......"
, also auch die Funktionen. Du rufst das with () am Ende auf und das macht ihre Arbeit, sie druckt es aus. Aber wie gesagt, wenn Sie es nicht sagen, um ein Ergebnis zurückzugeben, wird es nicht. Und weil es kein Ergebnis liefert, wird der Variablen nichts zugewiesen (verwechseln Sie ihn nicht mit None
). Wenn Sie diese Zeilen geschrieben haben (im Interpreter) oder das Skript ausführen, werden diese Zeilen gedruckt, aber Ihre zap
und thing
haben keine Werte.
So, wie man es repariert? Sagen Sie ihnen, dass sie die Zeilen an die Variablen zurückgeben sollen. Um das den Funktionen mitzuteilen, ersetzen Sie die print
-Anweisungen durch return
-Anweisungen. Und nichts dagegen zu experimentieren, was du weißt, zu wissen, was du über dein Wissen weißt, ist wahr: -)
Hoffe es hilft: -)