Python Aufrufen einer Funktion in eine andere Funktion
Ich lese das Buch Python-Programmierung für die Absolute Beginner von Mike Dawson und ich war erstaunt, eine Frage, die ich hatte, bezüglich der Funktionen.
Beobachten Sie den code unten
def func_1():
name = input('What is your name?')
def func_2():
print(name)
func_2()
Ich weiß, dass ich nicht nennen Sie die variable name
in die Funktion 2, da es lokal zu der Funktion 1.
Jedoch, warum rufe ich eine Funktion innerhalb einer anderen Funktion, und suchen Sie dann den Wert an die Eingabe des Benutzers als solche weiter unten?
def func_1():
name = input('What is your name?')
return name
def func_2():
user_input = func_1()
print(user_input)
func_2()
- Was genau sind Sie verwirrt? Der Aufruf der Funktion oder der
return
ing der Wert an den Aufrufer? - Weil Sie
return
den Wert - Aufruf einer Funktion innerhalb einer anderen Funktion.
func_1
gibt einen Wert zurück, im zweiten Beispiel, den Sie speichern den Rückgabewert in einer Variablen namensuser_input
dann drucken.- Versuchen Sie
return name
- Ich denke, die Verwirrung ist zu verstehen, scoping, und warum
func_1
aufgerufen werden kann, innerhalbfunc_2
abername
nicht aufgerufen werden kann, innerhalbfunc_2
. Dies ist, abgesehen von dem, was diereturn
verantwortlich ist. - Ich bin mir nicht sicher, ob dies auch im Zusammenhang, aber nicht this etwas haben zu tun mit Ihrer Frage? Können Sie klären, was genau ist Ihnen unklar?
- Sie rufen eine Funktion (
input
) in eine andere Funktion (func_1
) in Ihrem ersten Beispiel. - Es ist, weil
func_1()
ist im globalen Raum. Wennfunc_1()
definiert waren, in einem anderen Bereich (z.B. innerhalb einer Klasse, einem anderen namespace oder eine Funktion), dann würden Sie nicht in der Lage sein, um es vonfunc_2()
- Warum all die downvotes? Dies scheint eine klare Frage und eine angemessene mis-Verständnis für einen Anfänger
- ich danke Ihnen sehr, ich war sehr verwirrt und wusste nicht, was das Buch bezog sich auf! Bitte upvote.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die wichtige Sache zu prüfen, hier ist die Umfang der Variablen und/oder Funktion Namen, die Sie verwenden. Globalen Umfang bedeutet, dass alles, was Sie sehen können, ob es auf der obersten Ebene innerhalb einer Funktion, oder sogar innerhalb einer Methode, die innerhalb einer Klasse.
Lokalen Umfang bedeutet, dass es gesperrt im Rahmen des Blocks, und nichts, was außerhalb des Blocks sehen können. In Ihrem Fall, dass die Sperrung ist eine Funktion.
(Hinweis: dies ist eine milde Vereinfachung und mehr komplexe Regeln existieren, um Module und umfasst, aber ist das ein gutes starter für 10...).
In deinem Beispiel oben die Funktion definiert wurde, die auf globaler Ebene, so sein name,
func_1
hat globalen Rahmen (man könnte auch sagen, dass es in der "global namespace". Das bedeutet, dass alles es sehen können, einschließlich der code, der in anderen Funktionen.Umgekehrt, die variable
name
hat lokalen Bereich, innenfunc_1
, was bedeutet, es ist nur sichtbar infunc_1
, und nirgendwo sonst.Wenn Sie
return name
Sie vorbei sind der Wertname
zurück auf das, was genannt wird, die Funktion. Das bedeutet, dass dieuser_input = func_1()
erhält den Wert, der zurückgegeben wurde, und speichert es in eine neue variable, genanntuser_input
.Die eigentliche variable
name
ist immer noch nur sichtbar fürfunc_1
, aber dieser Wert wurde ausgesetzt, die außerhalb von Funktionen durchreturn
ing es.Edit: Wunsch @Chris_Rands:
Gibt es eine Funktion in Python, die Ihnen ein Wörterbuch, enthaltend alle globalen Variablen an, die aktuell im Programm verfügbar.
Dies ist die
globals()
Funktion. Sie können prüfen, etwas auf den globalen Gültigkeitsbereich durch zu sehen, ob es ist in diesem Wörterbuch:Eine zusätzliche edit-der Vollständigkeit halber: ich Stand oben, dass Sie mit übergabe des Werts von
name
zurück. Dies ist nicht streng wahr, wie Python ist pass-by-reference, aber das Wasser erhalten trüben hier und ich wollte nicht verwirren das Problem. Weitere details hier für den interessierten Beobachter: Wie gebe ich eine variable per Referenz?func_1
ist Gültigkeitsbereich aufgerufen werden, indem Siefunc_2
und warum. Einen kleinen Klappentext über die globalen/lokalen Bereich würde hier helfen.name
und nicht die variablename
selbst. Die OP scheint verwirrt zu sein, weil er denkt, dassname
irgendwie zugänglich infunc_2
auf die Rückkehr vonfunc_1
.func_2 ruft func1, die einen Wert zurückgibt, mit dem Sie drucken können innerhalb func_2. In deinem ersten Beispiel func_2 nicht sehen kann, eine lokale variable function_1.