Wie kann ich überprüfen, ob mein Python-Objekt eine Zahl ist? [duplicate]

Lesezeit: 6 Minuten

Wie kann ich uberprufen ob mein Python Objekt eine Zahl ist
Neal Ehardt

In Java stammen die numerischen Typen alle von Number ab, also würde ich verwenden

(x instanceof Number).

Was ist das Python-Äquivalent?

  • Nicht wirklich ein Duplikat, der andere ist ein sehr spezifischer Fall dieser Frage (prüfen Sie, ob etwas eine Zahl in einem Vektor ist), und die meisten Antworten beziehen sich wirklich auf dieses Detail.

    – jb.

    17. Januar ’14 um 19:16

  • Multiplizieren Sie x mit Null. Wenn das Ergebnis etwas anderes als Null ist, ist x keine Zahl, siehe: stackoverflow.com/a/44418960/3419693

    – Spitzmaus

    7. Juni ’17 um 17:16

Testen Sie, ob Ihre Variable eine Instanz von . ist numbers.Number:

>>> import numbers
>>> import decimal
>>> [isinstance(x, numbers.Number) for x in (0, 0.0, 0j, decimal.Decimal(0))]
[True, True, True, True]

Dies verwendet ABCs und funktioniert für alle eingebauten nummernähnlichen Klassen und auch für alle Klassen von Drittanbietern, wenn sie ihr Geld wert sind (registriert als Unterklassen der Number ABC).

In vielen Fällen sollten Sie sich jedoch keine Sorgen machen, Typen manuell zu überprüfen – Python ist Ente getippt und das Mischen einiger kompatibler Typen funktioniert normalerweise, aber es wird eine Fehlermeldung ausgegeben, wenn eine Operation keinen Sinn ergibt (4 - "1"), daher ist eine manuelle Überprüfung selten wirklich erforderlich. Es ist nur ein Bonus. Sie können es beim Beenden eines Moduls hinzufügen, um andere nicht mit Implementierungsdetails zu belästigen.

Das funktioniert ab Python 2.6. Bei älteren Versionen sind Sie ziemlich darauf beschränkt, nach einigen hartcodierten Typen zu suchen.

  • Dies führt zu einem falsch positiven Ergebnis, wenn Sie einen Booleschen Wert übergeben: isinstance(True, numbers.Number) kehrt zurück True obwohl True ist eindeutig keine Zahl.

    – Alex Kahn

    24. November ’15 um 21:34 Uhr

  • @AlexKahn In Python sind Boolesche Werte praktisch Zahlen: bool erbt von int, abs(True) == 1, "foo" * False == "", sum([True, False, True]) == 2, "%f" % True == "1.0", und so weiter.

    Benutzer395760

    24. November ’15 um 22:12

  • Frustrierend, isinstance(float('nan'), numbers.Number) kehrt zurück True

    – Nate

    30. Apr. ’18 um 19:31

  • um boolean auszuschließen, können Sie Folgendes verwenden. isinstance(x, numbers.Number) and not isinstance(x, bool)

    – Scott

    3. Dezember ’19 um 2:39


  • Sie können auch verwenden type(x) in (int, float, complex) um zu überprüfen, ob x ist direkt einer dieser Typen anstelle einer Instanz von ihnen

    – Brechen

    6. Februar ’21 um 21:08

Wie kann ich uberprufen ob mein Python Objekt eine Zahl ist
Matt

Python 3:

isinstance(x, (int, float, complex)) and not isinstance(x, bool)

Python 2:

isinstance(x, (int, long, float, complex)) and not isinstance(x, bool)

Beachten Sie, dass diese Antwort für Numpy-Objekte falsch funktioniert.

  • Danke, das ist es, was in Jython für mich funktioniert hat (das ist Python 2.5, also hat es nicht das ‘Zahlen’-Paket). Und ja, ich habe einen echten Grund, das Entenschreiben zu unterbrechen; Ich muss Zeichenfolgen und Zahlen anders behandeln.

    – Neal Ehardt

    15. November ’10 um 18:45


  • isinstance(Decimal(10), (int, long, float, complex)) gibt False. -1

    – jpmc26

    16. Dezember ’14 um 18:05

  • Das geht auch nicht, wenn x ist ein boolescher Wert. isinstance(True, (int, long, float, complex)) kehrt zurück True.

    – Alex Kahn

    24. November ’15 um 21:28

  • @AlexKahn isinstance(True, numbers.Number) oder isinstance(False, numbers.Number) gibt auch True zurück.

    – nbro

    13. Februar ’17 um 21:16

  • Kurze Anmerkung: float('nan') könnte als nicht numerisch angesehen werden, aber dies wird – natürlich – immer noch zurückkehren True.

    – Martin Thomas

    15. Okt ’18 um 21:03

Wie kann ich uberprufen ob mein Python Objekt eine Zahl ist
Steven Rumbalski

Benutzen Number von dem numbers Modul zum Testen isinstance(n, Number) (verfügbar seit 2.6).

isinstance(n, numbers.Number)

Hier ist es in Aktion mit verschiedenen Arten von Zahlen und einer Nicht-Zahl:

>>> from numbers import Number
... from decimal import Decimal
... from fractions import Fraction
... for n in [2, 2.0, Decimal('2.0'), complex(2,0), Fraction(2,1), '2']:
...     print '%15s %s' % (n.__repr__(), isinstance(n, Number))
              2 True
            2.0 True
 Decimal('2.0') True
         (2+0j) True
 Fraction(2, 1) True
            '2' False

Dies steht natürlich im Gegensatz zum Duck-Typing. Wenn Sie sich mehr Gedanken über die Funktionsweise eines Objekts machen als über das, was es ist, führen Sie Ihre Operationen aus, als ob Sie eine Zahl hätten, und verwenden Sie Ausnahmen, um Ihnen etwas anderes mitzuteilen.

  • Die Strategie “Sehen Sie, ob es eine Ausnahme gibt” ist oft wirkungslos. Python ist ein wenig aggressiv, wenn es darum geht, arithmetische Operationen für alle möglichen nicht-arithmetischen Dinge zuzulassen – nur weil ein Objekt dies zulässt + oder * bedeutet nicht, dass es so etwas wie eine Zahl ist.

    – Tom Swirly

    7. Mai ’16 um 13:59


Klar kannst du benutzen isinstance, aber beachten Sie, dass Python so nicht funktioniert. Python ist eine Enten-Typ-Sprache. Sie sollten Ihre Typen nicht explizit überprüfen. EIN TypeError wird ausgelöst, wenn der falsche Typ übergeben wurde.

Also nehmen Sie einfach an, es ist ein int. Kontrollieren Sie nicht.

So funktioniert Python nicht wirklich. Verwenden Sie es einfach wie eine Nummer, und wenn Ihnen jemand etwas übergibt, das keine Nummer ist, scheitern Sie. Es liegt in der Verantwortung des Programmierers, die richtigen Typen zu übergeben.

  • …aber nur, wenn sie ausgelöst werden. Im “normalen” Fall sind sie günstiger als ein if Erklärung.

    – Tim Pietzcker

    15. November ’10 um 17:51

  • nicht immer ganz so einfach, manchmal unterstützen beide Typen die Schnittstelle, aber man möchte sie anders handhaben. Stellen Sie sich eine Reduce-Funktion vor, die Zahlen hinzufügen, aber keine Zeichenfolgen verketten soll.

    – Rob Young

    20. Apr. ’11 um 13:49

  • Diese Antwort geht von den naivsten Skripten aus und berücksichtigt keine komplexen Fälle. Wie Rob sagt, gibt es legitime Notwendigkeiten, eine Zahl anders zu behandeln als eine Zeichenfolge. Es gibt auch viele Fälle, in denen sich eine benutzerdefinierte Klasse bei der Multiplikation mit einer Zahl auf eine Weise und bei der Multiplikation mit einer Instanz von sich selbst auf eine andere Weise verhalten muss. Sie können eine Matrixklasse auf diese Weise implementieren.

    – Nerdmeister

    4. Feb. ’12 um 14:06

  • @Falmarri tut es absolut… docs.python.org/2/reference/…

    – Matt Luongo

    4. Januar ’13 bei 4:18

  • Defensive Programmierung ist eine Notwendigkeit, insbesondere wenn Sie diese Werte verwenden, um Datenmanipulationsoperationen beispielsweise in einer Datenbank durchzuführen. Dynamische Sprachen sind fantastisch, aber manchmal brauchen Sie Ihre Garantien.

    – Chris

    12. August ’14 um 14:33

  • …aber nur, wenn sie ausgelöst werden. Im “normalen” Fall sind sie günstiger als ein if Erklärung.

    – Tim Pietzcker

    15. November ’10 um 17:51

  • nicht immer ganz so einfach, manchmal unterstützen beide Typen die Schnittstelle, aber man möchte sie anders handhaben. Stellen Sie sich eine Reduce-Funktion vor, die Zahlen hinzufügen, aber keine Zeichenfolgen verketten soll.

    – Rob Young

    20. Apr. ’11 um 13:49

  • Diese Antwort geht von den naivsten Skripten aus und berücksichtigt keine komplexen Fälle. Wie Rob sagt, gibt es legitime Notwendigkeiten, eine Zahl anders zu behandeln als eine Zeichenfolge. Es gibt auch viele Fälle, in denen sich eine benutzerdefinierte Klasse bei der Multiplikation mit einer Zahl auf eine Weise und bei der Multiplikation mit einer Instanz von sich selbst auf eine andere Weise verhalten muss. Sie können eine Matrixklasse auf diese Weise implementieren.

    – Nerdmeister

    4. Feb. ’12 um 14:06

  • @Falmarri tut es absolut… docs.python.org/2/reference/…

    – Matt Luongo

    4. Januar ’13 bei 4:18

  • Defensive Programmierung ist eine Notwendigkeit, insbesondere wenn Sie diese Werte verwenden, um Datenmanipulationsoperationen beispielsweise in einer Datenbank durchzuführen. Dynamische Sprachen sind fantastisch, aber manchmal brauchen Sie Ihre Garantien.

    – Chris

    12. August ’14 um 14:33

.

307720cookie-checkWie kann ich überprüfen, ob mein Python-Objekt eine Zahl ist? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy