Existenz einer Variable überprüfen???

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
SubSilver
User
Beiträge: 3
Registriert: Donnerstag 28. Dezember 2006, 19:24

hallooo zusammen!

Kennt jemand eine Möglichkeit die Existenz einer Variable zu ermitteln??

ich hab das versucht folgendermassen zu lösen (Der Wert der Variable ist - falls sie existiert - immer grösser 0):

Code: Alles auswählen

try:
   if x > o:
      print 'x existiert!'
except:
   print 'x existiert nicht!'
Das ist natürlich nicht ganz optimal! :-) Ich bin auf der Suche nach einer Funktion oder so etwas ähnlichem.. :D

SubSilver

Edit (Leonidas): Highlighting eingeschaltet.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Funktionen gibt es nicht, aber wenn du versuchst auf einen Namen zuzugreifen, die es nicht gibt, wird eine `NameError`-Exception geworfen die du abfangen kannst:

Code: Alles auswählen

try:
    print x
except NameError:
    print "x existiert nicht"
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
SubSilver
User
Beiträge: 3
Registriert: Donnerstag 28. Dezember 2006, 19:24

Danke erstmals für deine schnelle Antwort :wink:

Ich hab das Problem sogar so lösen können ohne Fehler abfangen zu müssen (Es geht darum die Häufigkeit der Zeichen in einem Text zu ermitteln):

Code: Alles auswählen

#! /usr/bin/python
def anzahl(text):
	pos = 0
	anzahl = len(text)
	zeichen = { }
	while pos != anzahl:
		symbol = text[pos:pos+1]
		if zeichen[symbol] > 0:
			zeichen[symbol] = zeichen[symbol] + 1
		else:
			zeichen[symbol] = 1
anzahl('dasisteintest')
Allerdings funktioniert irgendwo irgendetwas nicht, sodass ich folgende Fehlermeldung bekomme:

Code: Alles auswählen

me@notebook:~/Desktop/krypto/huffman$ ./anzahl2.sh
Traceback (most recent call last):
  File "./anzahl2.sh", line 12, in ?
    anzahl('dasisteintest')
  File "./anzahl2.sh", line 8, in anzahl
    if zeichen[symbol] > 0:
KeyError: 'd'
Was bedeutet denn 'KeyError'?? Wo ist/sind der/die :) Fehler im Code??
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

SubSilver hat geschrieben:Danke erstmals für deine schnelle Antwort :wink:
Kein Problem - ich hab sogar noch vergessen, dich im Forum willkommen zu heißen. Hole ich hiermit nach.
SubSilver hat geschrieben:Ich hab das Problem sogar so lösen können ohne Fehler abfangen zu müssen (Es geht darum die Häufigkeit der Zeichen in einem Text zu ermitteln):
Eben, das ist ja das Problem: du hast nicht gesagt, wozu du das brauchst. Daraus folgt, dass die Antwort zwar richtig ist, aber die Lösung für dich ganz anders aussieht. Daher ist es am besten sein wirkliches Problem zu beschrieben und einen Quelltext zu isolieren, der dieses Problem hat.
SubSilver hat geschrieben:Allerdings funktioniert irgendwo irgendetwas nicht, sodass ich folgende Fehlermeldung bekomme:

Code: Alles auswählen

me@notebook:~/Desktop/krypto/huffman$ ./anzahl2.sh
Traceback (most recent call last):
  File "./anzahl2.sh", line 12, in ?
    anzahl('dasisteintest')
  File "./anzahl2.sh", line 8, in anzahl
    if zeichen[symbol] > 0:
KeyError: 'd'
Was mich an dieser Stelle am meisten wunder wundert - warum nennst du das Skript anzahl2.sh? Es ist doch gar kein Shellskript. Ich würde dir wirklich dringend empfehlen es anzahl2.py zu nennen - so kann es auch als Modul verwendet werden.
SubSilver hat geschrieben:Was bedeutet denn 'KeyError'?? Wo ist/sind der/die :) Fehler im Code??
Das ist ganz einfach zu erklären, gehen wir mal deinen Code durch:
du versuchst mit der Zählvariablen pos die Position im String zu markieren und versuchst in der while-Schleife durch den String zu iterieren. Klappt auch für das erste Zeichen. Da du aber vergisst, pos jemals zu erhöhen, wird das eine Endlosschleifen werden. Aber es bricht schon vorher ab. Denn di pfüfst ob zeichen['d'] größer als null ist, Zeile 8. zeichen['d'] existiert jedoch nicht. In einem Dictionary sind nicht existente schlüssel nicht null, sie sind einfach nicht existend. Daher wird der KeyError geworfen, welcher aussagt, dass es den Key nicht gibt. Also muss er erstmal angelegt werden, wie du es auch in Zeile 11 Versuchst. Nur dass die Schleife schon vorher abbricht.

Ich gebe dir mal eine, im Python-Jargon heißt es pythonische Lösung: Paste 497. Was darin anders ist? Ich spare mir die while-Schleife komplett, stattdessen iteriere ich gleich über die Zeichen. Simpel, einfach, warum geht das in anderen Sprachen nicht auch so schön? Dann versuche ich in Zeile 8 die Häufigkeit zu erhöhen und für den Fall dass das zeichen nicht im Dictionary existiert lege ich es in Zeile 10 an. Fertig.

Eine Bitte nur: nutze nicht mehrere Frage- und Ausrufzeichen hintereinander. Ich habe langsam eine Allergie dagegen entwickelt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Statt ``try``/``except`` kann man auch die `get()`-Methode von Dictionaries benutzen. Bei der Methode kann man einen Wert vorgeben der zurückgegeben werden soll, falls der Schlüssel nicht existiert.

Code: Alles auswählen

def histogram(iterable):
    result = dict()
    for item in iterable:
        result[item] = result.get(item, 0) + 1
    return result


def main():
    print histogram('das ist ein test')
    print histogram([1, 2, 3, 2, 4, 6, 1])
Und ich habe die Namen etwas allgemeiner gehalten, weil man mit der Funktion die Häufigkeiten von allen möglichen Objekten ermitteln kann, die man als Schlüssel für Dictionaries verwenden kann.
SubSilver
User
Beiträge: 3
Registriert: Donnerstag 28. Dezember 2006, 19:24

Eben, das ist ja das Problem: du hast nicht gesagt, wozu du das brauchst. Daraus folgt, dass die Antwort zwar richtig ist, aber die Lösung für dich ganz anders aussieht. Daher ist es am besten sein wirkliches Problem zu beschrieben und einen Quelltext zu isolieren, der dieses Problem hat.
Joo, werds nächstes Mal wohl so machen... :-)



Ich hab den Code wie folgt abgeändert:

Code: Alles auswählen

#! /usr/bin/python
def anzahl(text):
	pos = 0
	anzahl = len(text)
	zeichen = { }
	while pos != anzahl:
		symbol = text[pos:pos+1]
		try:
			zeichen[symbol] = zeichen[symbol] + 1
		except KeyError:
			zeichen[symbol] = 1
		pos = pos + 1
	return zeichen
Das Ganze funktioniert jetz auch ganz gut (Auch wenn alles etwas länger als deine Lösung ist...) :)
Doch scheint die Rückgabe von 'zeichen' nicht ganz zu funktionieren! Wenn ich beispielsweise folgendes versuche bekomm ich einen NameError :

Code: Alles auswählen

anzahl('dasisteintest')
symbole = zeichen.keys()
for i in symbole:
	print zeichen[i]
Fehlermeldung:
me@notebook:~/Desktop/krypto/huffman$ ./anzahl2.py
Traceback (most recent call last):
File "./anzahl2.py", line 16, in ?
symbole = zeichen.keys()
NameError: name 'zeichen' is not defined
(Man sieht übrigens: Das Skript heisst jetzt anzahl2.py) 8)


Statt ``try``/``except`` kann man auch die `get()`-Methode von Dictionaries benutzen. Bei der Methode kann man einen Wert vorgeben der zurückgegeben werden soll, falls der Schlüssel nicht existiert.
Ich hab noch eine Methode gefunden um ''try''/'except'' zu vermeiden: mit der Funktion has_key() kann man überprüfen ob ein bestimmter Schlüssel existiert oder nicht. :)

Danke noch für eure Geduld beim Beantworten meiner Fragen.... :)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

SubSilver hat geschrieben:Das Ganze funktioniert jetz auch ganz gut (Auch wenn alles etwas länger als deine Lösung ist...) :)
Kannst du mir erklären, wearum du an deiner C-Style while-Schleife festhältst?
SubSilver hat geschrieben:Doch scheint die Rückgabe von 'zeichen' nicht ganz zu funktionieren! Wenn ich beispielsweise folgendes versuche bekomm ich einen NameError :
Du Rückgabe funktioniert durchaus, aber du Verwirfst den Rückgabewert. Wo ist denn ``zeichen`` definiert? Nur in der Funktion anzahl, aber lokale Namen innerhalb einer Funktion sind nach außen nicht sichtbar. Also musst du es mit ``zeichen = anzahl('dasisteintest')`` aufrufen. Dann geht es auch.
SubSilver hat geschrieben:Ich hab noch eine Methode gefunden um ''try''/'except'' zu vermeiden: mit der Funktion has_key() kann man überprüfen ob ein bestimmter Schlüssel existiert oder nicht. :)
Warum? EAFP ist in Python häufig anzutreffen und durchaus gut. Persönlich finde ich an dieser Stelle BlackJacks Ansatz natürlich am gelungensten. get() so zu verwenden ist tatsächlich geschickt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten