Seite 1 von 1

Lokale - globale Variablen; Übergabe von Parameter

Verfasst: Donnerstag 23. Oktober 2014, 12:22
von lena_92
Hallo zusammen,

ich habe folgednes Porblem. Dazu erst einmal der Code.

Code: Alles auswählen


def Werte():
           i = 0
           while(i<2):
               i = 0 
                 if(i<1):
                Var_1 = i
                i = i + 1
          i = i + 1


Werte()
x_1 = Var_1

Werte()
x_2 = Var_1


Ich definiere eine Fuktion. Diese hat vereinfacht dargestellt eine while-Schleife und eine If-Bedingung. In der If-Bedinung entsteht die Variable "i" die ich dann der "Var_1" zuordne.
Wenn diese Funktion dann aufgerufen wird, soll diese Variable "Var_1" der Variable "x_1" zugeordnet werden. Diese Variable "x_1" wird später dann wieder gebraucht.
Durch die While-Schleife verändert sich "Var_1" dann im zweiten Schritt wieder.

Nun das Problem:
Da Var_1 eine lokale Variable ist, kann ich von außen nicht auf diese Zugreifen. Ich habe schon Nachforschungen angestellt.
Hier meine Idee:
1. Parameterübergabe
2. return - Funktion
3. in extra Datei schreiben
4. Dictonary verwenden

Idee 1 und 2 halte ich für sinnvoll, bekomme da aber kein vernümpftiges Ergebniss. 3 und 4 sind nur Notlösungen.
Gibt es eine einfache Möglichkeit lokale Variablen nach außen zu übergeben?

Grüße
Lena


Foldende Fehlermeldung taucht auf.
x1 = Var_1
NameError: name 'Var_1' is not defined

Re: Lokale - globale Variablen; Übergabe von Parameter

Verfasst: Donnerstag 23. Oktober 2014, 12:48
von Üpsilon
Nun, jede Funktion läuft in einem eigenen Namensraum, d.h. sie benutzen andere Variablen als das Hauptprogramm.

Funktionen kommunizieren mit dem Hauptprogramm, indem durch Parameter Werte hinein gegeben werden und durch den Rückgabewert ein Ergebnis rauskommt.

(Man kann zwar aus einer Funktion auf eine Variable des Hauptprogramms lesend zugreifen, aber verursacht Chaos und ist nur beim Zugriff auf Konstanten zu empfehlen.)

Dein Programm müsste also ungefähr so aussehn:

Code: Alles auswählen

def werte():
    # ... dein Berechnungscode ...
    return var

wert = werte()
Das von dir gezeigte Beispiel kann übrigens nicht funktionieren, da ist die Einrückung kaputt. (Oder spinnt mein Browser?)

Übrigens könntest du mal einen Blick auf die offiziellen Python-Stiltipps werfen. Da stehen solche Sachen drin wie: Variablennamen schreibt man meistens klein.

Hoffe, ich konnte dir helfen. Als ich mit dem Programmieren angefangen hab, hab ich auch ne Weile gebraucht, um das mit den Funktionen+Namensräumen zu kapieren. :D

Lg Y.

Re: Lokale - globale Variablen; Übergabe von Parameter

Verfasst: Donnerstag 23. Oktober 2014, 12:49
von garreth
Mir ist zwar schleierhaft was in deiner Funktion passieren soll, aber die gewünschte Ausgabe der Funktion erreichst du über einen "return" Befehl.

Code: Alles auswählen

def berechne_werte():
    i = 0
    while i < 2: # Schleife gibt keinen Sinn da
        i = 0 # bei jedem Durchlauf i immer wieder null zugewiesen wird
        if i < 1:
            var = i
            i = i + 1 # und hier ausschließlich i = 1 rauskommen kann
        i = i + 1 # und hier mit i = 2 die Schleife nach dem ersten Durchlauf beendet wird
    return var

x = berechne_werte() # So hättest du dann der Variable den Wert von alt Var_1 zugewiesen.
Die Ausgabe deiner Funktion ist allerdings immer 0 und ja an der Einrückung passt definitiv etwas nicht.

Re: Lokale - globale Variablen; Übergabe von Parameter

Verfasst: Donnerstag 23. Oktober 2014, 12:57
von BlackJack
@lena_92: Ergänzend zu den bisherigen Anmerkungen zum Quelltext: ``if`` und ``while`` sind keine Funktionen, also sollte man des Quelltext auch nicht so schreiben als wären es welche. Nach dem Schlüsselwort sollte ein Leerzeichen stehen und die Klammern um die Bedingung sind überflüssig und sollten weggelassen werden.

Neben der Schreibweise gibt es auch Konventionen was für Namen man für Funktionen und andere Objekte vergibt. Funktionen tun etwas und werden deshalb üblicherweise mit der Tätigkeit benannt die sie ausführen. Also nicht `Werte` sondern beispielsweise `berechne_werte()`.

Man sollte auch keine Namen durchnummerieren. Das ist in der Regel ein Zeichen dafür das man die Werte eigentlich in einer Datenstruktur zusammenfassen möchte.

Re: Lokale - globale Variablen; Übergabe von Parameter

Verfasst: Donnerstag 23. Oktober 2014, 13:21
von lena_92
Vielen Dank erst einmal an alle Antworten.
@ Üpsilon, danke für deinen Link. Den schaue ich mir definitiv mal an. Da habe ich bei mir schon Definzite erkannt :-(

Der Code ergibt in der Tat keinen Sinn. Der wurde im Sinne der Übersichtlichkeit zusammen gekürzt. Dadurch wurde die Einrückung in Mitleidenschaft gezogen.

Ich schaue mir den "return"-Befehl mal an.
Danke
Lena

Re: Lokale - globale Variablen; Übergabe von Parameter

Verfasst: Donnerstag 23. Oktober 2014, 13:35
von /me
lena_92 hat geschrieben:Ich schaue mir den "return"-Befehl mal an.
Tu das. Das ist elementar. Werte sollten Funktionen nur über Parameter betreten und über Rückgabe mit return verlassen.

Re: Lokale - globale Variablen; Übergabe von Parameter

Verfasst: Donnerstag 23. Oktober 2014, 14:53
von lena_92
Hey,

also der "return"-Befehl ist ja super. Habe einige Beispiele durch und habe es nun in meinen Code eingefügt.

Nun bekomme ich aber folgenden Fehler:

"UnboundLocalError: local variable 'erster_knotenpunkt' referenced before assignment"

Dies passiert nur wenn ich den Befehl das zweite Mal aufrufe. D.h. bei einem einmaligen Aufrufen des Befehles funktioniert dieser.
Ich würde dem zweiten Befehl auch gerne eine andere Variable zuordnen.
y = berechne_werte()
y[0]
y[1]
Wisst ihr voran es liegt? Muss ich weitere wichtigen Dinge bei "return" beachten?
Grüße

Re: Lokale - globale Variablen; Übergabe von Parameter

Verfasst: Donnerstag 23. Oktober 2014, 15:00
von /me
lena_92 hat geschrieben:"UnboundLocalError: local variable 'erster_knotenpunkt' referenced before assignment"
Wie sieht der zugehörige Code aus?

Hier mal ein simples Beispiel, wie so ein Fehler zustande kommen kann.

Code: Alles auswählen

def do_things(x):
    if not x:
        value = 1
    value += 1
    return value

x = do_things(0)
y = do_things(1)
Beim zweiten Aufruf versuche ich value zu ändern obwohl value noch nicht definiert wurde. value ist lokal, die Funktion merkt sich die Existenz dieser Variablen nicht vom ersten Aufruf.

Re: Lokale - globale Variablen; Übergabe von Parameter

Verfasst: Donnerstag 23. Oktober 2014, 15:41
von lena_92
@ /me - danke für den Hinweis. Daran liegt es tatsächlich. Jetzt ist die Frage, wie du das bei deinem Beispiel elegant lösen würdest?!
Die Variable erst einmal auf "0" definieren ist ja auch nicht stilistisch gut, oder?

Re: Lokale - globale Variablen; Übergabe von Parameter

Verfasst: Donnerstag 23. Oktober 2014, 16:17
von /me
Wenn es so simpel ist:

Code: Alles auswählen

value = 1 if x else 0
Wenn es mehr Code ist:

Code: Alles auswählen

if x:
    # code code code
    value = 1
else:
    # other code
    value = 0

Re: Lokale - globale Variablen; Übergabe von Parameter

Verfasst: Donnerstag 23. Oktober 2014, 16:22
von lena_92
@ /me
Danke!!!
Das hat wirklich geholfen. Mit Hilfe von dir und einigen Stunden Arbeit ist der SCH*** Fehler endlich weg. :P :P :P
Ich bin sehr glücklich.
Danke
you saved the day!