Verzweigung if x == type(int)

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
duodiscus
User
Beiträge: 97
Registriert: Sonntag 6. April 2014, 16:10

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')
    
Benutzeravatar
pillmuncher
User
Beiträge: 1530
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

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'>
In specifications, Murphy's Law supersedes Ohm's.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
Benutzeravatar
Kebap
User
Beiträge: 776
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

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: ...
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
BlackJack

Alternativer Nachkommastellen-Test: ``if x % 1 != 0: # hat nachkommastellen``
Zuletzt geändert von BlackJack am Freitag 27. Juni 2014, 10:41, insgesamt 1-mal geändert.
Grund: Buchstabendreher
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

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')
a fool with a tool is still a fool, www.magben.de, YouTube
bb1898
User
Beiträge: 216
Registriert: Mittwoch 12. Juli 2006, 14:28

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
>>> 
Benutzeravatar
snafu
User
Beiträge: 6873
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
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.
Benutzeravatar
snafu
User
Beiträge: 6873
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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).
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

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")
a fool with a tool is still a fool, www.magben.de, YouTube
BlackJack

@MagBen: Jo, matplotlib ist da vom Entwurf her kaputt. :-)
Benutzeravatar
snafu
User
Beiträge: 6873
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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