Wurzelrechner

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
SemperPython

Ich möchte meinen Wurzelrechner vorstellen.
Vorschläge und Meinungen könnt ihr natürlich schicken.

Code: Alles auswählen

"""
"""

def Wurzelrechner():    
    b = False  
    while b is False:   
        try:
            eingabe = float(input("Bitte gebe eine Zahl ein um die Wurzel zu berechnen: ")) 
        except:
            print("Bitte eine Zahl eingeben")
            break

        print("Die Wurzel von", eingabe, "ist",eingabe**0.5)    
        b = True    
    weiter = str(input("Noch eine Aufgabe starten? Y/N "))
    if weiter == "Y":   
          Wurzelrechner()     
    if weiter == "N":
        pass

Wurzelrechner()   
Zuletzt geändert von SemperPython am Sonntag 19. Mai 2013, 11:15, insgesamt 1-mal geändert.
BlackJack

@SemperPython: Der rekursive Aufruf ist eine ganz schlechte Idee. So darf man den Programmfluss in Programmiersprachen nicht steuern die nicht garantieren endrekursive Aufrufe zu erkennen und weg zu optimieren. Das führt irgendwann unweigerlich zu einem `RuntimeError` weil der Aufrufstapel überläuft. Wenn man etwas einfach nur wiederholen möchte, schreibt man sich eine Schleife. Die kann potentiell endlos laufen ohne den Aufrufstapel vollzumüllen.

Ein ``if``-Zweig der nur ``pass`` enthält ist überflüssig. Weg damit.

`b` ist kein guter Name und man kann den Code auch ohne diese Variable schreiben mit einer ``while True:``-Schleife die an den entsprechenden Stellen einfach mit ``break`` verlassen wird.

Bei der Zuweisung an `weiter` ist der `str()`-Aufruf überflüssig.

Der Funktionsname hält sich nicht an den Style Guide for Python Code und ist auch keine gute Wahl für eine Funktion. Funktionen tun etwas und werden deshalb in der Regel mit Tätigkeiten benannt. Zum Beispiel `wurzel_berechnen()`. Worte die „Dinge” im weitesten Sinne bezeichnen wie `Wurzelrechner` sind eher Namen für Klassen.
SemperPython

Danke für die Antwort.
Das werde ich sofort ändern ;)
SemperPython

So.Hab ich jetzt abgeändert.
Der Code sieht nun so aus.Ich habe trotzdem das Gefühl,das ich irgendwas falsch gemacht hab/dass er unschön aussieht.

Code: Alles auswählen

"""
Danke an:
BlackJack fuer seine Kritik
"""

def wurzel_berechnen():    
    while True:  
        try:
            eingabe = float(input("Bitte gebe eine Zahl ein um die Wurzel zu berechnen: ")) 
        except:
            print("Bitte eine Zahl eingeben")
            continue

        print("Die Wurzel von", eingabe, "ist",eingabe**0.5)       
             

wurzel_berechnen()
lunar

@SemperPython "execpt ValueError:" statt einfach nur "exept:", damit wirklich nur der Fehler, dass der Nutzer keine Zahl eingegeben hat, abgefangen wird. Sonst werden alle Fehler abgefangen, insbesondere auch solche, die eigentlich Programmierfehler anzeigen, beispielsweise Tippfehler:

Code: Alles auswählen

def wurzel_berechnen():    
    while True:  
        try:
            # Tippfehler: "flaot" statt "float"
            eingabe = flaot(input("Bitte gebe eine Zahl ein um die Wurzel zu berechnen: ")) 
        except:
            # Der Nutzer sieht nun *immer* diese Nachricht
            print("Bitte eine Zahl eingeben")
            continue

        print("Die Wurzel von", eingabe, "ist",eingabe**0.5)       
             
wurzel_berechnen()
Generell gilt: Verwende niemals "except:" ohne einen konkreten Fehler dabei anzugeben.
SemperPython

Danke!
Ich arbeite nun an eine Version mit einer graphischen Oberfläche,da alles funktionieren scheint.
Ich werde bei Fehlern und Ergebnissen berichten :)
SemperPython

Uiuiuiui,
ich dachte ich würde es schaffen :O
Bitte verprügelt mich nicht für so einen schlechten Code und einer so schlimme Oberfläche,dies wird ich alles verändern,
wenn es erstmal funktioniert.

Code: Alles auswählen

"""
Danke an:
BlackJack und lunar fuer ihre Verbesserungvorschläge
http://www.python-forum.de , ihr seit klasse!
"""
import tkinter

root = tkinter.Tk()

def wurzel_berechnen():    
    while True:  
        try:
            eingabe = int(en.get)
        except ValueError:
            lb["text"] = "Bitte eine Zahl eingeben"
            continue

        lb["text"] = "Ergebnis:" + eingabe**0.5


mt = tkinter.Label(root, text="Gebe eine Zahl ein um die Wurzel zu berechnen")
mt.pack()

en = tkinter.Entry(root)
en.pack()

bw = tkinter.Button(root, text="Berechnen", command=wurzel_berechnen)
bw.pack()

lb = tkinter.Label(root, text = "")
lb.pack()

root.mainloop()
Als Fehler bekomme ich:

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python32\lib\tkinter\__init__.py", line 1399, in __call__
    return self.func(*args)
  File "C:\Users\User\Desktop\Wurzelrechner_v3.py", line 15, in wurzel_berechnen
    eingabe = int(en.get)
TypeError: int() argument must be a string or a number, not 'method'
Bitte helft mir :(
Zuletzt geändert von SemperPython am Sonntag 19. Mai 2013, 11:16, insgesamt 1-mal geändert.
BlackJack

@SemperPython: Im Grunde sagt es die Fehlermeldung recht deutlich: `int()` kann nichts mit einer Methode als Argument anfangen. `en.get` ist eine Methode. Was Du möchtest ist der Rückgabewert dieser Methode, also musst Du sie *aufrufen*. Der Rückgabewert von dem Aufruf ist der Text in dem Eingabefeld und damit kann `int()` etwas anfangen.
SemperPython

Arrgh,
tut mir Leid,ich hab sehr viel herumversucht,hab den Fehler wegbekommen,aber nun bekomm ich einen anderen Fehler.

Code: Alles auswählen

"""
Danke an:
BlackJack und lunar fuer ihre Verbesserungvorschläge
http://www.python-forum.de , ihr seit klasse!
"""
import tkinter

root = tkinter.Tk()

def wurzel_berechnen():    
    while True:  
        try:
            eingabe = en.get()
        except ValueError:
            lb["text"] = "Bitte eine Zahl eingeben"
            continue

        lb["text"] = "Ergebnis:" + int(en**0.5)


mt = tkinter.Label(root, text="Gebe eine Zahl ein um die Wurzel zu berechnen")
mt.pack()

en = tkinter.Entry(root)
en.pack()

bw = tkinter.Button(root, text="Berechnen", command=wurzel_berechnen)
bw.pack()

lb = tkinter.Label(root, text = "")
lb.pack()

root.mainloop()
Fehler:

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python32\lib\tkinter\__init__.py", line 1399, in __call__
    return self.func(*args)
  File "C:\Users\User\Desktop\Wurzelrechner_v3.py", line 20, in wurzel_berechnen
    lb["text"] = "Ergebnis:" + int(en**0.5)
TypeError: unsupported operand type(s) for ** or pow(): 'Entry' and 'float'
Zuletzt geändert von SemperPython am Sonntag 19. Mai 2013, 11:16, insgesamt 1-mal geändert.
BlackJack

@SemperPython: Also wenn Du solche Fehler nicht selber beheben kannst, solltest Du dringend Pause machen. Das ist doch jetzt sowas von offensichtlich. Was sollte denn dabei heraus kommen wenn man die Wurzel von einem `Entry`-Objekt zieht‽
SemperPython

@BlackJack
Ich bin mir nicht sicher,aber ich glaube,dass ein String herauskommen sollte?!
In einem anderen Programm hat es schonmal geklappt,hier ein kleiner Ausschnitt:

Code: Alles auswählen

"Ergebnis:" + str(zahl * zahl)
Das hab ich nämlich schon versucht.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Code: Alles auswählen

int(2**0.5)
funktioniert.

Code: Alles auswählen

int(tkinter.Entry(tkinter.Tk())**0.5)
dagegen nicht.

Siehst du den Unterschied?
BlackJack

@SemperPython: Du hast Datentypen anscheinend ganz grundsätzlich nicht verstanden. Es macht keinen Sinn das Wurzelziehen, oder irgendeine andere mathematische Operation, mit *GUI-Elementen* zu versuchen. Das ist völliger Unsinn. Wurzelziehen macht bei Zahlen Sinn. Ein `Entry` ist aber alles andere als eine Zahl. Das geht nicht. Und beim Wurzelziehen kommt auch keine Zeichenkette bei heraus. Sondern sinvollerweise wieder eine Zahl.
SemperPython

Datentypen hab ich verstanden, aber ich war eben etwas verwirrt,da ich soviel rumprobiert habe und dann noch das andere Programm :|
Tut mir Leid.

Es gibt also keine Möglichkeiten die Wurzel in einer graphischen Oberfläche in Python zu berechnen?
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

SemperPython hat geschrieben:Datentypen hab ich verstanden, aber ich war eben etwas verwirrt,da ich soviel rumprobiert habe und dann noch das andere Programm :|
Tut mir Leid.

Es gibt also keine Möglichkeiten die Wurzel in einer graphischen Oberfläche in Python zu berechnen?
Mit Python hat das nichts zu tun. Eine graphische Oberfläche ist (simplifiziert) eine spezielle Form von IO. Die Verarbeitung von Daten erfolgt zwischen I und O. Damit sind wir wieder bei den Datentypen: Du bekommst einen Input, dieser hat einen Datentyp. Wenn dieser zu Float konvertiert werden kann, ziehst Du die Wurzel und gibst das Resultat in dem für den Output geeigneten Format wieder zurück.
SemperPython

Ich komm nicht mehr weiter, möchte das Projekt aber nicht aufgeben.
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Beispielhaft gesprochen versuchst du die Wurzel aus einem Schildchen auf dem eine Zahl steht zu ziehen. Das schlägt fehl, da du aus Schildern keine Wurzeln ziehen kannst. Das bedeutet also du musst irgendwie an die Zahl auf dem Schild kommen und diese weiterverwenden.
SemperPython

Ich komm wirklich nicht mehr weiter.Ich hab jetzt vieles ausprobiert.
Ich hab wirklich keine Ahnung mehr was ich tun soll... :K
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

SemperPython hat geschrieben:Ich komm wirklich nicht mehr weiter.Ich hab jetzt vieles ausprobiert.
Ich hab wirklich keine Ahnung mehr was ich tun soll... :K
Du solltest dich fragen, woher die Fehlermeldung kommt.

Du versuchst en**0.5 zu berechnen. Jetzt schau dir bitte dein Programm an. Was ist en für ein Datentyp?
BlackJack

@SemperPython: Ich habe so ein bisschen den Eindruck Du probierst grundsätzlich einfach nur herum ohne wirklich zu wissen was Du tust. So funktioniert Programmieren nicht. Du musst im Zweifelsfall wissen welchen Typ und Wert jeder einzelne Teilausdruck bei gegebenen Eingabedaten ergibt. Wenn Du das wüsstest, dann wäre Dir auch klar wo der Fehler liegt und wie man ihn behebt. Und zwar durch Anwendung von Wissen und nicht durch herumprobieren. Manchmal findet man etwas auf diese Weise heraus, durch Versuch und Irrtum. Dann muss man aber hinterher auch erklären können warum es vorher nicht funktionierte und nach den Versuchen dann funktioniert. Sonst hat man einfach nur Glück gehabt und nichts dabei gelernt was einen weiter bringt.
Antworten