Variabel nicht deffiniert

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
Zap-B
User
Beiträge: 4
Registriert: Samstag 30. Juni 2007, 09:28
Wohnort: Sandhausen bei Heidelberg

Hallo ihr.
Bin zwar nicht sehr lange am Python-Lernen, aber wie das halt so ist
bekommt man gerade in der Zeit viele Probleme.
Meins ist Folgendes:

Ich will mir ein kleinen Pythagoras machen der mir schnell beim rechnen hilft. Klar, warum nicht einfach Rechner her oder im Kopf schnell rechnen?
Naja, man möchte eben selber einen "Rechner" schreiben. Also ein kleiner Anfang mit Pythagoras.
Jetzt hab ich erstmal den simplen Code geschrieben nur hab ich ein Problem was mir schon häufig aufgefallen ist. Wenn ich am Anfang die Variablen aufzähl, und sie im Laufe des Skripts einen anderen Wert bekommt, hat sie bei der Ausgabe immer noch den gleichen Anfangswert.
Bei mir hier weiß ich jetzt nicht wie ich es richtig machen muss. Kann da jemand helfen? :)

Code: Alles auswählen

#!/usr/bin/python

def pyth(erg, a = raw_input("Kathete a (in cm)"), b = raw_input("Kathete b (in cm)"),) :
    a = float(a)
    b = float(b)
    erg = (a**2 + b**2)**0.5
print erg
[size=75]Edit (Leonidas): Bild nach vorheriger Warnung gelöscht[/size]
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Hallo Zap-B 8)

Ich habe das gefühl das es daran liegt, dass das "print" nicht
richtig eingerückt ist, also zum Methodenaufruf gehört.

Weiter finde ich die Lösung mit dem "raw_input"s als default values
etwas merkwürdig. Das würde ich ehr in der Mehtode mit einem "try:/else" oder einem "if" Block abfragen.

So eingerückt sollte das mit der Ausgabe gehen (denke ich)

Code: Alles auswählen

#!/usr/bin/python
def pyth(erg, a = raw_input("Kathete a (in cm)"), b = raw_input("Kathete b (in cm)"),) :
    a = float(a)
    b = float(b)
    erg = (a**2 + b**2)**0.5
    print erg
Wenn nicht, bitte zeigen wie du die Funktion aufrufst und was raus kommt.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Warum uebergibst du erg als ersten Parmeter? Erinnert mich an C, wo man Zeiger uebergibt, wenn eine Funktion etwas anderes als einfache Datentypen zurueckliefern soll...

Am besten ist es, wenn man die Berechnung von der Ein- und Ausgabe trennt, also z.B. so (ungetestet):

Code: Alles auswählen

def pyth(a, b):
    return (a**2 + b**2)**0.5

a = float(raw_input("a")
b = float(raw_input("b")

print pyth(a, b)
Zap-B
User
Beiträge: 4
Registriert: Samstag 30. Juni 2007, 09:28
Wohnort: Sandhausen bei Heidelberg

Hi Zap :P

Danke für die Antwort, leider:
Mit deiner Lösung wird gar nichts ausgegeben. Einfach ein leeres Ergebniss. Ohne das eingerückte print (wie ich es vorher hatte) kam die Meldung in meinem PyScripter:

Code: Alles auswählen

Traceback (most recent call last):
  File "<string>", line 212, in run_nodebug
  File "C:\Python25\progs\Pythagoras.py", line 7, in <module>
    print erg
NameError: name 'erg' is not defined
Zu dem "raw_input" als default values kann ich wenig sagen. Ich weiß nämlich nicht genau was diese "default values" sind. Das ist mir nicht klar geworden beim erlernen (Bin ja noch im Anfangsstadium) :idea:
Wie sähe es aus wenn man deine Methode nehmen würde?
[size=75]Edit (Leonidas): Bild nach vorheriger Warnung gelöscht[/size]
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Du kannst dir Rebeccas Beispiel als Vorlage nehmen:
(Abschliessende Klammern hinzugefügt)

Code: Alles auswählen

def pyth(a, b):
    return (a**2 + b**2)**0.5

a = float(raw_input("a"))
b = float(raw_input("b"))

print pyth(a, b)
Defaultwerte sind die Werte die eine Variable bekommen wenn beim
Methodenaufruf keine Parameter dafür übergeben wurden.

Beispiel:

Code: Alles auswählen

>>> def  func(a=1):
...     return a
...
>>> print func()
1
>>> print func(100)
100
>>>
Zap-B
User
Beiträge: 4
Registriert: Samstag 30. Juni 2007, 09:28
Wohnort: Sandhausen bei Heidelberg

Danke Rebecca. Mit deinem Vorschlag und von Zap editiert, klappt's hervorragend.
Danke Zap, jetzt weiß ich wofür die sind. Hat "klick" gemacht. :)

Aber jetzt noch eine Frage, ich möchte schließlich verstehen und nicht einfach -zack zack- Fertig ist das Prog:
Was war an meiner Lösung jetzt falsch? Und wieso nimmt eine Variable mit dem Wert zB. '50' nicht einen neuen Wert an, den ich ihr im laufe des Programmes zuweise?
[size=75]Edit (Leonidas): Bild nach vorheriger Warnung gelöscht[/size]
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Mach es so wie Rebecca Vorgeschlagen hat. Das andere ist nicht schön und die Funktionen in der Argumentliste funktionieren bestenfalls beim ersten Aufruf.
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Vielleicht hilft dir das beim Verständnis

Code: Alles auswählen

def f1():
    print "aufruf f1()"
    return 10
    
def f2(a=f1()):
    print "a:", a

print "Ich hab f1() nicht selber aufgerufen"
f2()
f2()
Der Methodenaufruf von f1 ist schon im Konstukt der Methode
f2() verankert und wird unmittelbar ausgeführt.

Ausgabe:

Code: Alles auswählen

aufruf von f1()
Ich hab f1() nicht selber aufgerufen
a: 10
a: 10
Zap-B hat geschrieben:Und wieso nimmt eine Variable mit dem Wert zB. '50' nicht einen neuen Wert an, den ich ihr im laufe des Programmes zuweise?
Das kommt dadurch das du den Wert erg nicht zurück gibst (Zauberwort return) sondern Methodenintern ein eigenes "erg" existiert.
Wahrscheinlich hast du ausserhalb des Methodenaufruf auch eine Variable erg gesetzt, die du per print einfach ausgibst. Zur eindeutigen Anlayse fehlt da aber noch ein Stück Code.
Übe einfach noch ein wenig. Und wenn du ein bisschen sicherer im Umgang mit Funktionen bist wirst du sehen was du da verbrochen hast :)
Zap-B
User
Beiträge: 4
Registriert: Samstag 30. Juni 2007, 09:28
Wohnort: Sandhausen bei Heidelberg

Deine Antwort hilft mir sehr viel! Danke Zap.
Noch ist es mir nicht 100% klar, aber das wird -wie du sagst- noch kommen (hoff ich 8) )
Werd mich dann mal wieder ran machen :)
[size=75]Edit (Leonidas): Bild nach vorheriger Warnung gelöscht[/size]
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Bitte Zap-B (hat irgendwie was von einem Selbstgespräch ;) )
Antworten