Typ Überprüfung

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
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

Hi Leuts,

das hier ist ein Ausschnitt aus meinem selbstgeproggten Matheprogramm:

Code: Alles auswählen

def a2(a, b):
   if a <= 0:
      print 'Geben Sie fuer die Laenge der Kathede a postive Zahlen an!'
   elif b <= 0:
      print 'Geben Sie fuer die Laenge der Kathede b postive Zahlen an!'
   elif type(a)!=type(str):
       print 'Geben Sie fuer die Laenge der Kathede a Zahlen an!'
   elif type(b)==type(str):
      print 'Geben Sie fuer die Laenge der Kathede b Zahlen an!'
   else:
      c=(a*a+b*b)**0.5
      print 'Die Hypotonuse c ist', c
Warum funktioniert die Typeüberprüfung nicht??


Und warum bekomme ich denn das ergebniss und den wert none, wenn ich das Programm aufrufe dann a eingebe und dann z.b. 3 und 4?Wie bekomme ich das none weg?

Hier ist das Vollständige Programm:

Code: Alles auswählen

#Dieses Programm ist ein Mathematikprogramm mit einigen bekannten Formeln und Berechnungen!

import time

print '                                        PyMath'
time.sleep(2)
print '                                      Version 1.0'
time.sleep(2)
print '                                 By Thomas Klostermann'
time.sleep(2)
print '\n'

print 'Funktionen:'
print '\n'

a=['a)', 'Berechnet', 'den', 'Satz', 'des', 'Pytagoras']
b=['b)', 'Berechnet', 'die', 'Flaeche', 'eines', 'Quadrates']
c=['c)', 'Berechnet', 'die', 'Flaeche', 'eines', 'Rechtecks']
d=['d)', 'Berechnet', 'das', 'Volumen', 'eines', 'Wuerfels']
e=['e)', 'Berechnet', 'das', 'Volumen', 'eines', 'Quaders']

for x in a:
   print x, 
   time.sleep(0.0625)
print '\n'

for x in b:
   print x,
   time.sleep(0.0625)
print '\n'

for x in c:
   print x,
   time.sleep(0.0625)
print '\n'

for x in d:
   print x,
   time.sleep(0.0625)
print '\n'

for x in e:
   print x,
   time.sleep(0.0625)

print '\n'
print '\n'

a1=['Sie', 'haben', 'die', 'Funktion', 'a', 'aufgerufen!']
b1=['Sie', 'haben', 'die', 'Funktion', 'b', 'aufgerufen!']
c1=['Sie', 'haben', 'die', 'Funktion', 'c', 'aufgerufen!']
d1=['Sie', 'haben', 'die', 'Funktion', 'd', 'aufgerufen!']
e1=['Sie', 'haben', 'die', 'Funktion', 'e', 'aufgerufen!']

Auswahl=raw_input('Geben Sie den Buchstaben fuer die Funktion ein, die Sie Ausfuehren wollen: ')

print '\n'

def a2(a, b):
   if a <= 0:
      print 'Geben Sie fuer die Laenge der Kathede a postive Zahlen an!'
   elif b <= 0:
      print 'Geben Sie fuer die Laenge der Kathede b postive Zahlen an!'
   elif type(a)!=type(float):
       print 'Geben Sie fuer die Laenge der Kathede a Zahlen an!'
       return
   elif type(b)==type(float):
      print 'Geben Sie fuer die Laenge der Kathede b Zahlen an!'
      return
   else:
      c=(a*a+b*b)**0.5
      print 'Die Hypotonuse c ist', c

def b2():
   for x in b1:
      print x,
      time.sleep(0.0625)
   print '\n'

def c2():
   for x in c1:
      print x,
      time.sleep(0.0625)
   print '\n'

def d2():
   for x in d1:
      print x,
      time.sleep(0.0625)
   print '\n'

def e2():
   for x in e1:
      print x,
      time.sleep(0.0625)
   print '\n'


if Auswahl == 'a':
   for x in a1:
      print x,
      time.sleep(0.0625)
   print '\n'
   
   a=raw_input('Geben Sie die Laenge der Kathede a an: ')
   b=raw_input('Geben Sie die Laenge der Kathede b an: ')
   print '\n'
   
   c=a2(int(a), int(b))
   print c
   
elif Auswahl == 'b':
   print b2()
elif Auswahl == 'c':
   print c2()
elif Auswahl == 'd':
   print d2()
elif Auswahl == 'e':
   print e2()
   
P.S.:

Das Programm ist noch net fertig, es fehlen also noch die Funktionen für b-e und es sollen noch viel mehr Formeln dazukommen, darum ist das Programm auch noch in Version 1.0
mfg

Thomas :-)
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Naja, Du übergibst der Funktion a2 Integer-Werte, und prüfst dann, ob es Floats sind (im ersten Snippet sogar ob's Strings sind!?). Natürlich sinds keine.

PS: Ist wohl eher Version 0.01 :)

PPS: Nur mal eine kleine Anregung:

Code: Alles auswählen

for i in [a,b,c,d,e]:
    for x in i:
        print x,
        time.sleep(0.0625)
    print '\n'
Gruß, mawe
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

ja danke für die Antwort deine anregung hab ich auch schon gemacht :D

Naja aber das sollen ja wächter sein, die überprüfen ob es Bxuhstaben sind, den die sollen ja ne fehlermeldung ausgeben wenn jemand nen buchstaben eingibt.
Aber ich muss der funktion int übergeben, sonst geht ja die berechnung nicht.

Und wie bekomm ich das none weg?
mfg

Thomas :-)
Gast

Python Master 47 hat geschrieben:Warum funktioniert die Typeüberprüfung nicht??
Probiers doch mal in der Shell aus:

Code: Alles auswählen

>>> a = 2
>>> type(a)
<type 'int'>
>>> type(str)
<type 'type'>
>>> type(a) == type(str)
False
>>> a = '2'
>>> type(a)
<type 'str'>
>>> type(str)
<type 'type'>
>>> type(a) == type(str)
False
Das sollte die Frage beantworten...
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Python Master 47 hat geschrieben:Das Programm ist noch net fertig, es fehlen also noch die Funktionen für b-e und es sollen noch viel mehr Formeln dazukommen, darum ist das Programm auch noch in Version 1.0
Hi Python Master 47!

Der Anfang ist getan. Du hast dich hin gesetzt und schreibst dein erstes Programm. -- Das finde ich super! Und solche Fehler, wie sie dir jetzt noch passieren, sind reine Anfängerfehler -- das wird sich in kürzester Zeit ändern. :)

Hier ein paar Tipps von mir:

Meistens sind es Schlampigkeitsfehler oder Fehler, die sich mangels Struktur eingeschlichen haben. Deshalb empfehle ich dir --> gib deinen Programmen von Anfang an eine gute Struktur. Teile deinen Code in kleine, überschaubare Blöcke auf. Verwende Funktionen und später auch Klassen.

Schreibe z.B. die Begrüßung in eine eigene Funktion und rufe diese Funktion im Hauptcodebereich auf. Somit ist der Code für die Begrüßung nicht mehr im Hauptcodebereich im Weg. Der Hauptcodebereich wird dadurch schlanker und besser überschaubar. Weiters erleichterst du dir auch die Tests. Der Code für die Begrüßung kann unabhängig vom anderen Code getestet werden.

Und verlasse dich nicht darauf, dass immer die richtigen Datentypen an eine Funktion übergeben werden. Prüfe in der Funktion, ob es sich um den korrekten Typ für einen Vergleich handelt.

Wandle dazu den Parameter in das korrekte Format für den Vergleich um. Tritt dabei ein Fehler auf, kann der Vergleich gar nicht erst ein falsches Ergebnis liefern.

Wenn nicht damit gerechnet werden kann, dass dieser Fehler später noch einmal auftritt, dann hat es sich damit schon erledigt. Wenn das nicht ausgeschlossen werden kann, dann fange den Fehler ab und gib dem Benutzer eine aussagekräftige Rückmeldung.

Wenn es z.B. wichtig ist, dass nur ein bestimmter Wertbereich übergeben werden darf, dann kannst du mit "assert" auf die Einhaltung des Bereiches prüfen. Der Befehl

Code: Alles auswählen

assert wert >= 1
prüft, ob der Wert der Variable "wert" >= 1 ist. Ist das nicht der Fall, dann wird ein Fehler ausgelöst. Diese Art der Prüfung ist interessant, wenn man dem Programmierer einen Wink geben möchte. Da ist es egal, wenn ein Fehler ausgelöst wird. Kann der Wert von einem Anwender falsch übergeben werden, dann solltest du diesem Anwender eine aussagekräftige Rückmeldung liefern und keinen Fehler auslösen.

Hier ein Beispiel:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

#-----------------------------------------------------------------
def meine_funktion(laenge, breite):
    """
    Multipliziert die Länge mit der Breite.
    Gibt eine Fließkommazahl zurück.

    :laenge: Muss eine Zahl größer 0 sein.
    :breite: Muss eine Zahl größer 0 sein.
    """

    laenge = float(laenge)
    breite = float(breite)
    
    assert laenge > 0.0
    assert breite > 0.0
    
    return laenge * breite


#-----------------------------------------------------------------
def main():
    """
    Hauptfunktion - ruft drei mal hintereinander die
    Funktion ``meine_funktion`` auf.
    """
    
    for i in range(3):
        laenge = float(i) + 1
        breite = float(i) + 2
        print meine_funktion(laenge, breite)
    

#-----------------------------------------------------------------
if __name__ == "__main__":
    main()
Damit das Programm ohne Änderung auch unter Linux, ohne direktes Aufrufen von Python, läuft, solltest du in der ersten Zeile hinschreiben, mit welchem Programm Linux dein Programm ausführen soll. Diese Zeile beginnt immer mit #!, gefolgt vom Pfad zum Programm, mit dem das Skript ausgeführt werden soll. Da du nicht immer wissen kannst, wo sich auf einem fremden Linux-System der Python-Interpreter befindet, gibt es ein Programm, das immer genau weiß, wo sich Python befindet und es korrekt aufruft. Dieses Programm heißt "env" und befindet sich im Ordner "/usr/bin". Und hier die korrekte, erste Zeile:

Code: Alles auswählen

#!/usr/bin/env python
Das muss zwar nicht sein, erleichtert es aber, dein Programm auch unter Linux zu benutzen.

Unterhalb der Angabe des Python-Interpreters sollte die Angabe des verwendeten Codings stehen.
Wenn du mit Windows arbeitest, dann bist du mit "iso-8859-1" nicht schlecht beraten. Das sieht so aus:

Code: Alles auswählen

# -*- coding: iso-8859-1 -*-
Gib jeder Funktion einen Docstring mit. Das ist der erste String unterhalb der Funktionsdefinition. Beschreibe die Parameter im Docstring. Wie willst du denn später einmal wissen, welche Werte übergeben werden sollen. Du willst ja sicher nicht, jedes mal wenn du die Funktion verwenden möchtest, den Code der Funktion durchlesen müssen nur um herauszufinden, welche Werte du übergeben musst. Diesen Docstring und die erforderliche Syntax, kannst du später auch interaktiv mit dem Befehl "help()" abfragen. Du musst dir dazu also nicht mal mehr die Funktionsdefinition ansehen.

Schreibe den Hauptcode nicht direkt in das Modul, sondern schreibe den Hauptcode in eine Funktion. Meistens verwendet man dafür die Funktion "main()". Prüfe ganz am Ende des Moduls mit

Code: Alles auswählen

if __name__ == "__main__":
ob das Modul direkt aufgerufen wurde oder ob es importiert wurde. Das erspart dir später Ärger, wenn du dein Modul auch noch in anderen Modulen verwenden möchtest.

Das war`s mit meinen Tipps. Muss mich wieder um andere Dinge kümmern. Vielleicht kannst du ja mit meinen Tipps etwas anfangen.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

Vielen Danke für die nette und umfangreiche Antwort!

Ich werde morgen den Code etwas Verbessern und wenn noch problem auftreten, und ich wirklich keine Lösung finde, dann kann ich ja nochmal nachfragen!
mfg

Thomas :-)
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

So also:

Hier erstmal das ganze Programm:

Code: Alles auswählen

#Dieses Programm ist ein Mathematikprogramm mit einigen bekannten Formeln und Berechnungen!

import os
import time

def Einleitung():
   print '                                        PyMath'
   time.sleep(2)
   print '                                     Version 1.0.1'
   time.sleep(2)
   print '                                 By Thomas Klostermann'
   time.sleep(2)
   print '\n'

Einleitung()

def Funktionen():
   print 'Funktionen:'
   print '\n'

   a=['a)', 'Berechnet', 'den', 'Satz', 'des', 'Pytagoras']
   b=['b)', 'Berechnet', 'die', 'Flaeche', 'eines', 'Quadrates']
   c=['c)', 'Berechnet', 'die', 'Flaeche', 'eines', 'Rechtecks']
   d=['d)', 'Berechnet', 'das', 'Volumen', 'eines', 'Wuerfels']
   e=['e)', 'Berechnet', 'das', 'Volumen', 'eines', 'Quaders']

   for i in [a,b,c,d,e]:
      for x in i:
         print x,
         time.sleep(0.0625)
      print '\n'
   
Funktionen()
Auswahl=raw_input('Geben Sie den Buchstaben fuer die Funktion ein, die Sie Ausfuehren wollen: ')

a1=['Sie', 'haben', 'die', 'Funktion', 'a', 'aufgerufen!']
b1=['Sie', 'haben', 'die', 'Funktion', 'b', 'aufgerufen!']
c1=['Sie', 'haben', 'die', 'Funktion', 'c', 'aufgerufen!']
d1=['Sie', 'haben', 'die', 'Funktion', 'd', 'aufgerufen!']
e1=['Sie', 'haben', 'die', 'Funktion', 'e', 'aufgerufen!']

print '\n'

def a2(a, b):
   if a <= 0:
      print 'Geben Sie fuer die Laenge der Kathede a postive Zahlen an!'
   elif b <= 0:
      print 'Geben Sie fuer die Laenge der Kathede b postive Zahlen an!'
   else:
      c=(a*a+b*b)**0.5
      print 'Die Hypotonuse c ist', c
      
def b2(a):
   if a<=0:
      print 'Geben Sie fuer die Laenge von a positive Zahlen an!'
   else:
      A=a*a
      print 'Die Flaeche des Quadrats ist', A
      
def c2(a, b):
   if a<=0: 
      print 'Geben Sie fuer die Laenge von a positive Zahlen an!'
   elif b<=0:
      print 'Geben Sie fuer die Laenge von b positive Zahlen an!'
   else:
      A=a*b
      print 'Die Flaeche des Rechtecks ist', A
      
def d2(a):
   if a<=0:
      print 'Geben Sie fuer die Laenge von a positive Zahlen an!'
   else:
      V=a**3
      print 'Das Volumen des Wuerfels ist', V
      
def e2(a, b, c):
   if a<=0:
      print 'Geben Sie fuer die Laenge von a positive Zahlen an!'
   elif b<=0:
      print 'Geben Sie fuer die Laenge von b positive Zahlen an!'
   elif c<=0:
      print 'Geben Sie fuer die Laenge von c positive Zahlen an!'
   else:
      V=a*b*c
      print 'Das Volumen des Quaders ist', V
      
if Auswahl == 'a':
   for x in a1:
      print x,
      time.sleep(0.0625)
   print '\n'
   a=raw_input('Geben Sie die Laenge der Kathede a an: ')
   b=raw_input('Geben Sie die Laenge der Kathede b an: ')
   print '\n'
   a2(float(a), float(b))
   
elif Auswahl == 'b':
   for x in b1:
      print x,
      time.sleep(0.0625)
   print '\n'
   a=raw_input('Geben sie die Laenge von a an: ')
   print '\n'
   b2(float(a))
   
elif Auswahl == 'c':
   for x in c1:
      print x,
      time.sleep(0.0625)
   print '\n' 
   a=raw_input('Geben sie die Laenge von a an: ')
   b=raw_input('Geben sie die Laenge von b an: ')
   print '\n'
   c2(float(a), float(b))

elif Auswahl == 'd':
   for x in d1:
      print x,
      time.sleep(0.0625)
   print '\n' 
   a=raw_input('Geben sie die Laenge von a an: ')
   print '\n'
   d2(float(a))

elif Auswahl == 'e':
   for x in e1:
      print x,
      time.sleep(0.0625)
   print '\n'
   a=raw_input('Geben sie die Laenge von a an: ')
   b=raw_input('Geben sie die Laenge von b an: ')
   c=raw_input('Geben sie die Laenge von c an: ')
   print '\n'
   e2(float(a), float(b), float(c))

else:
   print 'Diese Funktion gibt es nicht!'
Also warum ich am anfang os importiere ist egal, der zweck kommt erst später im Programm. :wink:

Das Programm ist noch sehr in der Entwicklungsphase.

Klassen, ein Converter und ein Lexikon, mit Mathematischen Fachbegriffen und deren Erläuterung kommen noch dazu!

So jetzt aber meine Frage:

Also ich baue dann noch ein Haupmenü ein, ungefähr so:

1.Formeln und Berechnungen
2.Converter
3.Lexikon

Was wollen Sie auführen?

Wenn jemand jetzt z.B. 1 auswählt und dann eine Berechnung durchführt, will ich es so machen, dass der Benutzer nach der Berechnung wieder ins Hauptmenü kommt, bzw. entscheiden kann ob er wieder ins Hauptmenü will oder das Programm beenden will.

Wie stelle ich das an, das der Benutzer wieder ins Hauptmenü gelangt?
Ich möchte also einen Jump vornehmen!Wie mach ich das?

Danke!!
mfg

Thomas :-)
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Mit einer Schleife:

Pseudocode:

Code: Alles auswählen

while True:
    <auswaehlen lassen>
    if auswahl == "ende":
        break
    <auswahl ausfuehren>
Dijkstra (auch ein sehr vernünftiger Holländer wie GvR) hat schon 1965 gesagt das Goto's unnötig sind, dass man alles mit anderen Flow-Controls (also while und if) ausdrücken kann. Und jede vernünftige (TM) Programmiersprache beschränkt sich auf Schleifen und Bedingungen, und bietet keine Sprünge an.

Wenn Dir also ein Problem mit Sprüngen vorkommt, überleg erst, was Du genau machen willst. Willst Du etwas überspringen, kommt eine Bedingung für Dich in Frage. Willst Du etwas mehrmals machen, eine Schleife.

Bedingungen werden mit if ... eingeleitet (das Konstrukt kennst Du ja auch), Schleifen mit while <Bedingung>: <Block>, wie oben.

Hoffe das hilft erstmal!

Unabhängig davon haben Dir schon andere gesagt dass Du eine Hauptfunktion (main()) irgendwo einbauen sollst, und noch so ein paar andere stilistische Tipps gegeben. Die will ich hier nicht wiederholen. ;-)

--- Heiko.
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

Ja das kommt ja alles noch! :wink:

Ich kenne Bedingungen und Schleifen :wink:

Ich hab mich vielleicht mir dem Jump etwas blöd ausgedrückt!

Trotzdem vielen Dank!
mfg

Thomas :-)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Python Master 47 hat geschrieben: Wenn jemand jetzt z.B. 1 auswählt und dann eine Berechnung durchführt, will ich es so machen, dass der Benutzer nach der Berechnung wieder ins Hauptmenü kommt, bzw. entscheiden kann ob er wieder ins Hauptmenü will oder das Programm beenden will.

Wie stelle ich das an, das der Benutzer wieder ins Hauptmenü gelangt?
Ich möchte also einen Jump vornehmen!Wie mach ich das?
Hi Python Master 47!

Schade eigentlich, dass du keine meiner Ratschläge angenommen hast. Würdest du deinen Code besser in Funktionen einteilen und überhaupt schöner strukturieren, dann würde sich deine Frage mit dem Menü von selber lösen.

Weil ich noch nicht schlafen kann -- hier ein kleines Beispiel:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import sys

OUTCODING = sys.stdout.encoding or sys.getfilesystemencoding()


#----------------------------------------------------------------------
def hauptmenue():
    """
    Gibt das Hauptmenü aus, wartet auf eine Antwort und gibt diese
    zurück.
    """
    
    print
    print "1 - Berechne x * y"
    print "2 - Berechne x + y"
    print "0 - Beenden"
    
    retval = raw_input(
        u"Wählen Sie aus und drücken Sie dann ENTER: ".encode(OUTCODING)
    )
    
    while not retval in ("1", "2", "0"):
        print 
        print "Geben Sie eine der folgenden Zahlen ein. 1, 2 oder 0"
        retval = hauptmenue()
    return retval


#----------------------------------------------------------------------
def get_x_y():
    """
    Fragt nach x und y und gibt diese als Float in einem Tupel zurück.
    """
    
    print
    retval = raw_input(
        (
            u"Geben Sie x und y getrennt durch einen Strichpunkt ein "
            u"und drücken Sie dann ENTER (z.B. 1; 2): "
        ).encode(OUTCODING)
    )
    
    try:
        x, y = retval.split(";", 2)
        x = float(x.strip())
        y = float(y.strip())
        return (x, y)
    except:
        retval = get_x_y()
    

#----------------------------------------------------------------------
def multiplikation(x, y):
    """
    Gibt x * y zurück.
    
    :x: Float
    :y: Float
    """
    
    x = float(x)
    y = float(y)
    
    return x * y


#----------------------------------------------------------------------
def addition(x, y):
    """
    Gibt x + y zurück.
    
    :x: Float
    :y: Float
    """
    
    x = float(x)
    y = float(y)
    
    return x + y 


#----------------------------------------------------------------------
def main():
    """
    Hauptfunktion. Ruft das Hauptmenü auf, lässt ein paar
    Dinge auswählen und ruft die Berechnungen auf.
    """
    
    retval = hauptmenue()
    
    while retval in ("1", "2"):
        if retval == "1":
            print 
            print "Jetzt wird x * y berechnet."
            x, y = get_x_y()
            print 
            print "Ergebnis:"
            print "%s * %s = %s" % (x, y, multiplikation(x, y))
            
        elif retval == "2":
            print 
            print "Jetzt wird x + y berechnet."
            x, y = get_x_y()
            print 
            print "Ergebnis:"
            print "%s + %s = %s" % (x, y, addition(x, y))

        retval = hauptmenue()
        
    print "Auf wiedersehen :-)"
    

#----------------------------------------------------------------------
if __name__ == "__main__":
    main()
Das Beispiel ist nicht perfekt, aber es wird dir sicher weiter helfen.

lg
Gerold
:-)

Edit: Habe noch die Umwandlung der Umlaute in das STDOUT-Encoding eingebaut.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

Danke!

Ich werde alle Ratschläge von dir und den anderen befolgen!

Ich werde, wenn es dann fertig ist, in die Codesnips posten.

Aber das kann noch dauern!
mfg

Thomas :-)
Antworten