Anfängerfrage : Variablenübergabe aus einer Definition

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
Thomas Hoppe
User
Beiträge: 2
Registriert: Dienstag 5. Oktober 2021, 20:40

Hallo in die Runde,

ich beschäftige mich erst seit einigen Tagen mit Python und habe gerade eine Blockade. Unter www.python-lernen.de habe ich das folgende kurze Programm im Abschnitt "Rückgabewert bei Funktionen" gefunden:

def bspfunktionfuerrueckgabe(eingabewert):
rueckgabewert = eingabewert * 2
return rueckgabewert

ergebnisausfunktion = bspfunktionfuerrueckgabe (5)
print(ergebnisausfunktion)
print(rueckgabewert)

Ist mir auch alles klar,

Wenn ich das jetzt bei mir in IDLE unter Python 3.9.7 eingebe und starte bekomme ich folgende Fehlermeldung:

Python 3.9.7 (tags/v3.9.7:1016ef3, Aug 30 2021, 20:19:38) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license()" for more information.
>>>
======= RESTART: C:\Users\user\Documents\Python\Variable in Definition.py ======
10
Traceback (most recent call last):
File "C:\Users\user\Documents\Python\Variable in Definition.py", line 7, in <module>
print(rueckgabewert)
NameError: name 'rueckgabewert' is not defined
>>>

Über einen kleinen Gedankenanstoss würde ich mich freuen;=)

Thomas
Benutzeravatar
sparrow
User
Beiträge: 4528
Registriert: Freitag 17. April 2009, 10:28

Die Einrückung bein Code bleibt bestehen, wenn du ihn in Code-Tags schreibst. Die erscheinen automatisch, wenn du den </>-Button im vollständigen Editor drückst. Dazwischen gehört dein Code.

An der Stelle, wo due "rueckgabewert" ausgeben möchtest, ist diese Variable nicht definiert. Funktionen haben einene eigenen Namensraum. Außerhalb dieses Namensraums existiert dieser Name nicht.
Thomas Hoppe
User
Beiträge: 2
Registriert: Dienstag 5. Oktober 2021, 20:40

Danke für den Tipp mit dem Einrücken, so sieht es dann richtig aus;=)

Code: Alles auswählen

def bspfunktionfuerrueckgabe(eingabewert):
    rueckgabewert = eingabewert * 2
    return rueckgabewert

ergebnisausfunktion = bspfunktionfuerrueckgabe (5)
print(ergebnisausfunktion)
print(rueckgabewert)
Wie mache ich es denn richtig, wenn ich in einer Definition eine Variable übergeben will, die ich dann im Hauptprogramm weiter nutzen möchte. Sollte ich die Variable dann auf Global setzen?

Mit besten Grüßen

Thomas :
Sirius3
User
Beiträge: 18253
Registriert: Sonntag 21. Oktober 2012, 17:20

Benutze keine Abkürzungen und so lange Funktionsnamen gliedert man am besten mit _: beispielfunktion_fuer_rueckgabe.
Ich denke, das Beispiel soll nur zeigen, dass man `rueckgabewert` nicht verwenden kann, das steht ja so auch im Begleittext. Ebenso, wie es richtig ist, nämlich so, wie es im ersten Abschnitt auf der verlinkten Seite steht.
Leider steht auch auf dieser Seite nicht, dass man niemals (ausdrücklich niemals) `global` verwenden darf (bis auf so wenige Ausnahmen, dass man die erst nach drei Jahren Programmiererfahrung zu Gesicht bekommt). Daher frage ich mich jedesmal, warum das überhaupt bei Anfängertutorials überhaupt vorkommt.
Buchfink
User
Beiträge: 193
Registriert: Samstag 11. September 2021, 10:16

Hallo Thomas

wenn du sehen möchtest, was in rueckgabewert steht, müsste das imo so aussehen

Code: Alles auswählen

def bspfunktionfuerrueckgabe(eingabewert):
    rueckgabewert = eingabewert * 2
    print(rueckgabewert)
    return rueckgabewert

ergebnisausfunktion = bspfunktionfuerrueckgabe (5)
print(ergebnisausfunktion)
Global würde wohl auch gehen. Aber ehrlichgesagt, würde ich in meinem Code "gloabal" nur verwenden, wenn ich damit den Weltuntergang verhindern könnte ;-)
Ich bin auch Python-Anfänger. Aber mit "global" möchte ich lieber nicht anfangen. Ich weiß zwar nicht wie problematisch das im Python-Universum ist, aber ich vermute mal dass es da auch nicht gern gesehen ist. Es kann zu schwer zu findenden Fehlern führen.
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

Hallo Thomas, du braucht die Variable "rueckgabewert" doch gar nicht, das du dessen Wert bereits in "ergebnisausfunktion" geschrieben hast. Daher kannst du jetzt mit "ergebnisausfunktion" weiter arbeiten.

Globale Variablen sind z.B. richtig nervig, wenn man einen Fehler im Programm hat und versucht heraus zu bekommen, wo bzw. wann der falsche Wert in die Variable geschrieben wird.
LukeNukem
User
Beiträge: 232
Registriert: Mittwoch 19. Mai 2021, 03:40

Thomas Hoppe hat geschrieben: Mittwoch 6. Oktober 2021, 06:56

Code: Alles auswählen

def bspfunktionfuerrueckgabe(eingabewert):
    rueckgabewert = eingabewert * 2
    return rueckgabewert

ergebnisausfunktion = bspfunktionfuerrueckgabe (5)
print(ergebnisausfunktion)
print(rueckgabewert)
Wie mache ich es denn richtig, wenn ich in einer Definition eine Variable übergeben will, die ich dann im Hauptprogramm weiter nutzen möchte. Sollte ich die Variable dann auf Global setzen?
Nunja, die Variable "eingabewert", die Du der Funktion übergibst, die kannst Du natürlich weiterverwenden. Das ist in Deinem Beispiel etwas unglücklich, weil Du beim Aufruf der Funktion die Variable "eingabewert" nicht als Variable übergibst, sondern als Konstante ("5"). Wenn Du stattdessen

Code: Alles auswählen

def bspfunktionfuerrueckgabe(eingabewert):
    rueckgabewert = eingabewert * 2
    return rueckgabewert

meine_variable = 5
ergebnisausfunktion = bspfunktionfuerrueckgabe (meine_variable)
print(meine_variable)
print(ergebnisausfunktion)
schreiben würdest: genau, das würde funktionieren.

Deine Variable "rückgabewert" hingegen... Nun, in Python (und den meisten anderen Programmiersprachen) haben Variablen einen Sichtbarkeitsbereich (englisch: "scope"). Und die Variable "rückgabewert" hat nur einen lokalen Sichtbarkeitsbereich, das heißt: sie wird in Deiner Funktion erzeugt, und wenn die Funktion abgearbeitet ist, verschwinden der Sichtbarkeitsbereich und damit auch die darin angelegte Variable automatisch wieder. Deswegen haben Funktionen einen Rückgabewert, der mit "return" zurückgegeben wird. Üblicherweise ist man ja weniger an den inneren Abläufen einer Funktion interessiert, sondern daran, was die Funktion berechnet, also: zurückgibt.

Über "global" möchtest Du Dir bitte keine weiteren Gedanken machen. Das ist etwas für Fortgeschrittene, die genau wissen, was sie tun -- und es, aus guten Gründen, auch dann scheuen wie der Teufel das Weihwasser.
Antworten