Lokale - globale Variablen; Übergabe von Parameter

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
lena_92
User
Beiträge: 28
Registriert: Donnerstag 24. Juli 2014, 15:00

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
Üpsilon
User
Beiträge: 222
Registriert: Samstag 15. September 2012, 19:23

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.
PS: Die angebotene Summe ist beachtlich.
garreth
User
Beiträge: 41
Registriert: Donnerstag 23. Oktober 2014, 12:04

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.
Zuletzt geändert von garreth am Donnerstag 23. Oktober 2014, 13:03, insgesamt 1-mal geändert.
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.
lena_92
User
Beiträge: 28
Registriert: Donnerstag 24. Juli 2014, 15:00

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
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
lena_92
User
Beiträge: 28
Registriert: Donnerstag 24. Juli 2014, 15:00

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
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
lena_92
User
Beiträge: 28
Registriert: Donnerstag 24. Juli 2014, 15:00

@ /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?
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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
lena_92
User
Beiträge: 28
Registriert: Donnerstag 24. Juli 2014, 15:00

@ /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!
Antworten