Zugriff auf Variable einer Funktion

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
lbuega
User
Beiträge: 75
Registriert: Dienstag 15. April 2003, 08:51
Wohnort: Weissach

Montag 23. Februar 2004, 16:54

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
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 23. Februar 2004, 17:12

Das geht doch glaube ich gar nicht.
Du kannst nur freie Variablen aus Modulen und Klassen von ausserhalb nutzen.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
TraX
User
Beiträge: 6
Registriert: Sonntag 22. Februar 2004, 20:14
Wohnort: Luxemburg
Kontaktdaten:

Montag 23. Februar 2004, 17:21

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 ;)
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Montag 23. Februar 2004, 17:49

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
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Montag 23. Februar 2004, 18:01

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
Benutzeravatar
wuf
User
Beiträge: 1497
Registriert: Sonntag 8. Juni 2003, 09:50

Montag 23. Februar 2004, 21:17

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:
Take it easy Mates!
TraX
User
Beiträge: 6
Registriert: Sonntag 22. Februar 2004, 20:14
Wohnort: Luxemburg
Kontaktdaten:

Montag 23. Februar 2004, 21:53

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:
"Nicht durch Zorn, sondern durch Lachen tötet man"
--Nietzsche
lbuega
User
Beiträge: 75
Registriert: Dienstag 15. April 2003, 08:51
Wohnort: Weissach

Dienstag 24. Februar 2004, 10:23

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!?
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Dienstag 24. Februar 2004, 14:48

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
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Dienstag 24. Februar 2004, 20:57

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
Pythonaya
User
Beiträge: 90
Registriert: Sonntag 26. Januar 2003, 11:34
Wohnort: Großbeeren (nahe Berlin)

Dienstag 24. Februar 2004, 22:15

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
lbuega
User
Beiträge: 75
Registriert: Dienstag 15. April 2003, 08:51
Wohnort: Weissach

Donnerstag 26. Februar 2004, 14:17

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
Antworten