Seite 1 von 1

Zugriff auf Variable einer Funktion

Verfasst: Montag 23. Februar 2004, 16:54
von lbuega
Ein herzliches "Hallo" an die treuen Python-isten 8)

bei meiner Rumprogrammiererei ist mal wieder eine Frage aufgetaucht:
  • 1. Wie komme ich an den Inhalt einer Variablen in einer anderen Funktion?
    2. wie oben, nur Funktion noch in einem anderen Modul?
Gruß
lbuega

Verfasst: Montag 23. Februar 2004, 17:12
von Leonidas
Das geht doch glaube ich gar nicht.
Du kannst nur freie Variablen aus Modulen und Klassen von ausserhalb nutzen.

Verfasst: Montag 23. Februar 2004, 17:21
von TraX
Ich kenn mich noch net wirklich mir Python, oder einer anderen Programmier Sprache aus, aber, deine Frage, mit den Variablen usw. trifft das auch auch mein (folgendes) Problem zu?

Code: Alles auswählen

#==================================================================
def mSI_convert(m,mSI):
	if mSI == "1": #grammes
		m = m/1000
	if mSI == "2": #kilo
		m = m
	if mSI == "3": #tonnes
		m = m*1000
	return m
#==================================================================
def mSI_choix():
	mlist = ['Grammes', 'KiloGrammes', 'Tonnes']
	x = 0
	while x < len(mlist):
		print x + 1, mlist[x]
		x = x + 1
	mSI = 0
	while mSI != "1" and mSI != "2" and mSI != "3":
		mSI = raw_input ("Masse en... ? ")
#==================================================================
...
mSI_choix()
...
mSI_convert(m,mSI)
...
Denn irgendwie komm ich da net raus... Ich erhalte immer wieder einen Fehler in der "mSI_convert(m,mSI)" Zeile

Sorry, falls das ganze jetzt absolut nichts mit deiner Frage zu tun haben sollte :oops:

btw. das proggi ist auf französisch ;)

Verfasst: Montag 23. Februar 2004, 17:49
von Dookie
Hi Trax,

Wär interessant, was für ein Fehler kommt, am Besten die letzten 10 Zeilen vom Traceback.
Der Aufruf müsste auch heissen:

Code: Alles auswählen

m = mSI_convert(m, mSI)
Da m einen Float enthält und dieser unveränderbar (immutable) ist. Ausserden solltest Du besser in der Funktion m = m/1000.0 bzw. m = m*1000.0 oder gleich m /= 1000.0 und m *= 1000.0 schreiben.


Gruß

Dookie

Verfasst: Montag 23. Februar 2004, 18:01
von Dookie
Hi lbuega,

Du kannst Variablen an eine Funktion übergeben als Parameter und auch Werte zurückgeben, auch mehrere.

Code: Alles auswählen

def mal2(w1, w2, w3):
    return w1*2, w2*2, w3*2
e1, e2, e3 = mal2(1,2,3)
Du Kannst aber auch einer Funktion ein Attribut geben.

Code: Alles auswählen

def malx(w1, w2, w3):
    return w1*malx.x, w2*malx.x, w3*malx.x
malx.x = 5
print malx(2,4,6)
10, 20, 30

Gruß

Dookie

Verfasst: Montag 23. Februar 2004, 21:17
von wuf
Hallo TraX

Hier ist etwas zum ausprobieren.
Das Skript enthält einiges, welches
Dookie schon erwähnt hat.

Code: Alles auswählen

#==================================================================
def mSI_convert(m,mSI):
	if mSI == "1": #grammes
		m /= 1000.0
	if mSI == "2": #kilo
		m = m
	if mSI == "3": #tonnes
		m *= 1000.0
	return m
#==================================================================
def mSI_choix():
	mlist = ['Grammes', 'KiloGrammes', 'Tonnes']
	x = 0
	while x < len(mlist):
		print x + 1, mlist[x]
		x += 1
	mSI = 0
	while mSI != "1" and mSI != "2" and mSI != "3":
		mSI = raw_input ("Masse en... ? ")
	return mSI

 #==================================================================
#~~ Eingabe der Konvertiermethode
mSI = mSI_choix()
m = 1 # Zu verarbeitende Zahl

#~~ Umrechnung nach gewählter Methode
m = mSI_convert(m,mSI)
print m

Gruss wuf :wink:

Verfasst: Montag 23. Februar 2004, 21:53
von TraX
Hi :)

Das hat funktioniert :)
Ich werd mich morgen noch weiter mit der "def" funktion und dem späteren Aufrufen der Funktion beschäftigen, damit ich das dann komplett auf die Reihe bekomme :)

Vielen Dank an euch beide :wink:

Verfasst: Dienstag 24. Februar 2004, 10:23
von lbuega
Hi Dookie,
vielen Dank für die Antwort, waren interessante Sachen die mir z.T. noch unbekannt waren.

Allerdings ist mir immer noch unklar, ob es nun geht (s.Frage). Evtl. etwas verständlicher gefragt mit code:

Code: Alles auswählen

def malx(w1, w2, w3):
    x = 5
    ... 

#ich möchte soetwas wie:
print malx.x #also die Variable der Funktion
Krieg ich das nicht ohne ein "return x" in der Funktion? Ich Bekomme nämlich immer die Fehlermeldung "AttributeError: 'function' object has no attribute 'x'", dabei hat die Funktion doch die Variable/Attribut!?

Verfasst: Dienstag 24. Februar 2004, 14:48
von Dookie
Hi Ibuega,

"normale" Variablen von Funktionen, existieren nur solange die Funktion gerade ausgeführt wird. Sobald die Funktion beendet wird, werden die lokalen Variablen wieder vergessen. Auf nicht existente Variablen kannst Du dann natürlich nicht mehr zugreiffen.
Was willst Du damit eigentlich machen? Ich könnte mir höchstens einen Debugger vorstellen, der variablen traced. Aber dafür gibts andere Möglichkeiten.


Gruß

Dookie

Verfasst: Dienstag 24. Februar 2004, 20:57
von hans
So wie ich das sehe, muß du dir eine Containerklassse erstellen, welche die Variablen und die Funktionen enthält. Du musst halt dafür sorgen, dass du die Varablen über den Lebenszyklus der Funktion hinaus am Leben erhälst und das geht nur ausserhalb von Funktionen.

Hans

Re:

Verfasst: Dienstag 24. Februar 2004, 22:15
von Pythonaya
Hi @ all!

zu 1.) Kannst du nicht einfach das ganze mit return lösen?
so kannste näHHHmlich den Wert der Variable in der Funktion in eine externe Variable überführen, oder nich?

zu 2.) Kannst ja auch mit Vererbungen über Module hinweg basteln und dann einfach den return-Trick wiederholen..?!?


MFG,
Florian

Verfasst: Donnerstag 26. Februar 2004, 14:17
von lbuega
o.k. da muß ich dann glaub ein "broken by design" :oops: eingestehen und das Ganze mit einem anständigen "return" machen (wird wohl einiges an Arbeit werden - und evtl. weitere Fragen aufwerfen... :roll: )

Vielen Dank für alle Eure rasche Antworten
Gruß lbuega