Seite 1 von 1

Verzweigung if x == type(int)

Verfasst: Freitag 27. Juni 2014, 10:15
von duodiscus
Hallo zusammen,
ich möchte gerne eine Liste durchsuchen lassen, in der Ganzzahlen und float Zahlen enthalten sind. Warum funktioniert diese if Verzweigun nicht?

Code: Alles auswählen

    for c in liste:
        if c == type(int):
            print('Ganzzahl')
        elif c == type(float):
            print('Float')
    

Re: Verzweigung if x == type(int)

Verfasst: Freitag 27. Juni 2014, 10:20
von pillmuncher
Hm, mal sehen:

Code: Alles auswählen

>>> c = 3
>>> c
3
>>> type(c)
<type 'int'>
>>> int
<type 'int'>
>>> type(int)
<type 'type'>
>>> c = 3.5
>>> c
3.5
>>> type(c)
<type 'float'>
>>> float
<type 'float'>
>>> type(float)
<type 'type'>

Re: Verzweigung if x == type(int)

Verfasst: Freitag 27. Juni 2014, 10:25
von EyDu
Und wenn du schon unbedingt Typen testen willst, dann verwende dazu "isinstance". Allerdings sollte das Testen auf Typen möglichst vermeiden werden. Das ist in den meisten Fällen ein Zeichen für einen schlechten Entwurf und sollte anders gelöst werden.

Re: Verzweigung if x == type(int)

Verfasst: Freitag 27. Juni 2014, 10:28
von Kebap
Was soll das denn bedeuten? Ich vermute du meinst: if type(x) == ...

Wenn du prüfen willst, ob eine Zahl Nachkommastellen hat, geht vielleicht auch: if round(x) == x: ...

Re: Verzweigung if x == type(int)

Verfasst: Freitag 27. Juni 2014, 10:33
von BlackJack
Alternativer Nachkommastellen-Test: ``if x % 1 != 0: # hat nachkommastellen``

Re: Verzweigung if x == type(int)

Verfasst: Freitag 27. Juni 2014, 10:38
von MagBen
Du warst schon fast richtig, so geht's

Code: Alles auswählen

liste = [1, 1., 2, 2., 3.4, 34]
for c in liste:
    if isinstance(c, int):
        print('Ganzzahl')
    elif isinstance(c, float):
        print('Float')

Re: Verzweigung if x == type(int)

Verfasst: Freitag 27. Juni 2014, 16:28
von bb1898
Es wäre jetzt allerdings ganz wichtig zu wissen, worauf es denn wirklich ankommt: geht es um Zahlen vom Typ float oder geht es um Zahlen mit Nachkommastellen?

Code: Alles auswählen

Python 3.4.1 (v3.4.1:c0e311e010fc, May 18 2014, 10:45:13) [MSC v.1600 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> testzahl = 3.
>>> isinstance(testzahl, float)
True
>>> round(testzahl) == testzahl
True
>>> testzahl % 1 == 0
True
>>> 

Re: Verzweigung if x == type(int)

Verfasst: Freitag 27. Juni 2014, 17:04
von snafu
Richtig, denn in einigen Fällen macht Python eben doch Typprüfungen, wenn es mit Zahlen (z.B. als Indexwert) arbeiten soll. Da ist es dann vorbei mit dem schönen Ducktyping. ;)

Typprüfungen sollte man aber trotzdem nicht via ``type(obj) == zieltyp`` durchführen, sondern entweder mit ``isinstance(obj, zieltyp)`` oder ``issubclass(testtyp, zieltyp)``. Meistens möchte man die erste Variante.

Und wohlgemerkt programmiert man Python eher mit der Tendenz, dass man stets korrekte Eingaben vermutet und "falsche" Typen meistens nicht selbst behandelt, sondern sich auf die Fehlerbehandlung der Standardbibliothek verlässt. Klar: Ausnahmen bestätigen die Regel, aber man sollte keinesfalls in jede Funktion irgendwelche Typprüfungen einbauen.

Re: Verzweigung if x == type(int)

Verfasst: Freitag 27. Juni 2014, 17:14
von BlackJack
@snafu: Auch wenn man in Ausnahmefällen Typprüfung braucht, frage ich lieber nach dem Anwendungsfall statt gleich zu sagen wie man den Typ prüft. Denn oft denkt der fragende nur er bräuchte eine Typprüfung obwohl man das auch anders lösen kann.

Re: Verzweigung if x == type(int)

Verfasst: Freitag 27. Juni 2014, 17:30
von snafu
Jepp. Eine Liste, die verschiedene Typen als Elemente hat (so wurde es ja im Eingangsbeitrag beschrieben), ist IMHO eh bereits ein kaputtes Design. Da sollte man sich eher fragen, ob man bereits diese Art von Liste vermeiden kann anstatt nachträglich typabhängig irgendwas hinzupfuschen.

Die Frage nach der Typprüfung hatten allerdings auch schon ein paar Leute vor mir beantwortet. Zumal ich persönlich nicht soviel von "didaktischer Bevormundung" halte. Man kann Fragen IMHO durchaus beantworten und ggf nötige Warnungen mitgeben. Wenn der Threadersteller stumpf auf seine Typprüfung ohne Wenn und Aber aus ist, dann hätte er seine Antwort so oder so bekommen - notfalls durch eine Suchmaschine (entsprechende Fähigkeiten vorausgesetzt).

Re: Verzweigung if x == type(int)

Verfasst: Freitag 27. Juni 2014, 17:45
von MagBen
snafu hat geschrieben:Jepp. Eine Liste, die verschiedene Typen als Elemente hat (so wurde es ja im Eingangsbeitrag beschrieben), ist IMHO eh bereits ein kaputtes Design.
In Matplotlib funktionieren viele Funktionen in dieser Art:

Code: Alles auswählen

def totalVariabel(*args):
    for arg in args:
        if isinstance(arg, int):
            print("tu dies")
        elif isinstance(arg, float):
            print("tu das")
        elif isinstance(arg, (str,unicode)):
            print("tu sonstwas")       

totalVariabel(1, 2., "drei")

Re: Verzweigung if x == type(int)

Verfasst: Freitag 27. Juni 2014, 17:49
von BlackJack
@MagBen: Jo, matplotlib ist da vom Entwurf her kaputt. :-)

Re: Verzweigung if x == type(int)

Verfasst: Freitag 27. Juni 2014, 18:26
von snafu
Das wäre aber zumindest ein Grund, warum man diese komischen Typprüfungen von Listenelementen überhaupt machen möchte. Gut durchdacht sieht jedoch anders aus.