Wurzelrechner

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

Samstag 1. Dezember 2012, 10:51

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

Samstag 1. Dezember 2012, 11:16

@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

Samstag 1. Dezember 2012, 11:17

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

Samstag 1. Dezember 2012, 11:23

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

Samstag 1. Dezember 2012, 14:34

@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

Samstag 1. Dezember 2012, 15:18

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

Samstag 1. Dezember 2012, 15:41

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

Samstag 1. Dezember 2012, 16:41

@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

Samstag 1. Dezember 2012, 17:06

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

Samstag 1. Dezember 2012, 17:23

@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

Samstag 1. Dezember 2012, 17:35

@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

Samstag 1. Dezember 2012, 17:48

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

Samstag 1. Dezember 2012, 17:50

@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

Samstag 1. Dezember 2012, 18:47

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: 1090
Registriert: Mittwoch 15. Oktober 2008, 09:27

Samstag 1. Dezember 2012, 20:00

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.
Antworten