1175 Stimmen

Prüfung, ob eine Variable eine ganze Zahl ist oder nicht

Wie prüfe ich, ob eine Variable eine ganze Zahl ist?

0 Stimmen

@katrielalex: Wenn er meine Antwort als die richtige gewählt hat, bedeutet das nicht, dass Hulk den von Ihnen erwähnten Eindruck hatte. Es gibt auch die ValueError Ausnahmemöglichkeit, die VOR der type() .

0 Stimmen

@Hulk: Ich will wirklich nicht dafür werben, dass Sie meine Antwort akzeptieren - Sie können sie gerne an Ashish zurückgeben; er hat eine absolut gültige und technisch korrekte Antwort gegeben. Ich wollte nur sicherstellen, dass Sie auch den Rest der Ratschläge auf dieser Seite gelesen haben.

0 Stimmen

@katrielalex: Ashish hatte Recht, aber die Kodierungsszenarien brauchten die Ausnahmeklausel, und so habe ich meine Antwort geändert, nichts für ungut, Ashish.

13voto

flow Punkte 3496

Es ist wirklich erstaunlich, dass eine so hitzige Diskussion aufkommt, wenn eine so grundlegende, gültige und, wie ich glaube, banale Frage gestellt wird.

einige Leute haben darauf hingewiesen, dass die Typüberprüfung gegen int (und long ) könnte in Fällen, in denen eine große Dezimalzahl auftritt, verloren gehen. ganz richtig.

einige Leute haben darauf hingewiesen, dass man "einfach tun sollte x + 1 und sehen Sie, ob das scheitert. Nun, zum einen funktioniert das auch bei Floats, und zum anderen ist es einfach, eine Klasse zu konstruieren, die definitiv nicht sehr numerisch ist, aber die + Operator in irgendeiner Form.

Ich bin im Widerspruch zu vielen Beiträgen, die energisch erklären, dass man nicht nach Typen suchen sollte. Nun, GvR sagte einmal etwas in der Richtung, dass dies in der reinen Theorie richtig sein mag, aber in der Praxis, isinstance dient oft einem nützlichen Zweck (das ist schon eine Weile her, ich habe den Link nicht mehr; Sie können lesen, was GvR über verwandte Themen sagt in Beiträge wie dieser hier ).

lustig ist, wie viele Leute anscheinend davon ausgehen, dass die Absicht des Auftraggebers darin bestand, zu prüfen, ob die Typ einer bestimmten x ist ein numerischer Integer-Typ - was ich verstanden habe, ist das, was ich normalerweise meine, wenn ich die Worte des Auftraggebers verwende: ob x repräsentiert eine ganze Zahl. Und das kann sehr wichtig sein: Wenn Sie jemanden fragen, wie viele Artikel er auswählen möchte, möchten Sie vielleicht sicherstellen, dass Sie eine nicht-negative ganze Zahl zurückbekommen. solche Anwendungsfälle gibt es zuhauf.

Meiner Meinung nach ist es auch wichtig zu sehen, dass (1) Typüberprüfung nur EIN - und oft ziemlich grobes - Maß für die Korrektheit eines Programms ist, weil (2) es oft begrenzte Werte sind, die Sinn machen, und Werte außerhalb der Grenzen, die Unsinn machen. Manchmal machen nur einige intermittierende Werte Sinn - wie wenn man alle Zahlen betrachtet, nur die reellen (nicht-komplexen), ganzzahligen Zahlen könnten in einem bestimmten Fall möglich sein.

Seltsam, dass niemand zu erwähnen scheint, dass man nach x == math.floor( x ) . wenn das sollte ein Fehler mit einigen großen Dezimal-Klasse, gut, dann vielleicht ist es Zeit, OOP-Paradigmen zu überdenken. es gibt auch PEP 357 die sich mit der Frage beschäftigt, wie man nicht so offensichtliche- int -aber-bestimmt-ganzzahlige Werte als Listenindizes verwendet werden. nicht sicher, ob ich die Lösung mag.

1 Stimmen

Einige der Anwendungsfälle für einen solchen Test beinhalten die Behandlung einer ganzen Zahl als Sonderfall; dafür können Sie sich einfach auf x==math.floor(x) o x == int(x) eine Ausnahme auslösen und diese dann als "nein" behandeln. In anderen Anwendungsfällen möchte man jedoch lieber eine frühe, klarere Ausnahme erhalten, als später eine verwirrende, wenn ein nicht ganzzahliger Parameter einfach keinen Sinn ergibt. Wir haben eine Reihe von Antworten auf diese Frage, für verschiedene Anwendungsfälle.

8voto

premvardhan Punkte 61

Es ist sehr einfach, dies in Python zu überprüfen. Sie können wie folgt vorgehen:

Angenommen, Sie wollen prüfen, ob eine Variable eine ganze Zahl ist oder nicht!

## For checking a variable is integer or not in python

if type(variable) is int:
     print("This line will be executed")
else:
     print("Not an integer")

0 Stimmen

Kann keine negativen ganzen Zahlen verarbeiten

8voto

sudokode Punkte 81

Wenn Sie prüfen wollen, ob eine Zeichenkette nur aus Ziffern besteht, aber die Konvertierung in eine int-Zahl nicht hilft, können Sie einfach regex verwenden.

import re
x = "01234"
match = re.search("^\d+$", x)
try: x = match.group(0)
except AttributeError: print("not a valid number")

Result: x == "01234"

Wäre x in diesem Fall "hallo", würde die Konvertierung in einen numerischen Typ einen ValueError auslösen, aber dabei würden auch Daten verloren gehen. Die Verwendung einer Regex und das Abfangen eines AttributeFehlers würde es Ihnen ermöglichen, numerische Zeichen in einer Zeichenkette zu bestätigen, die z. B. führende 0-Zeichen enthalten.

Wenn Sie nicht wollten, dass ein AttributeError ausgelöst wird, sondern nur nach spezifischeren Problemen suchen wollten, könnten Sie die Regex variieren und nur die Übereinstimmung prüfen:

import re
x = "h01234"
match = re.search("\D", x)
if not match:
    print("x is a number")
else:
    print("encountered a problem at character:", match.group(0))

Result: "encountered a problem at character: h"

Das zeigt Ihnen, wo das Problem auftritt, ohne dass Ausnahmen verwendet werden. Auch hier geht es nicht darum, den Typ zu testen, sondern die Zeichen selbst. Dies gibt Ihnen viel mehr Flexibilität als die einfache Prüfung auf Typen, insbesondere wenn bei der Konvertierung zwischen Typen wichtige Zeichenkettendaten verloren gehen können, wie z. B. führende 0s.

0 Stimmen

Dazu braucht man keine Regex: all(ch in set(string.digits) for ch in x) aber wie bereits an anderer Stelle auf dieser Seite erwähnt, ist dies ohnehin eine schlechte Methode.

7voto

NotNamedDwayne Punkte 585

Warum nicht einfach prüfen, ob der Wert, den Sie überprüfen möchten, gleich sich selbst als Ganzzahl wie unten dargestellt ist?

def isInt(val):
    return val == int(val)

3 Stimmen

Müssen Sie den Test mit einem der folgenden Elemente umschließen (oder ersetzen) try/except Block, oder es wird eine Ausnahme ausgelöst, wenn val ist, zum Beispiel, 'a'

1 Stimmen

Kann ersetzt werden durch return val == int(val) und der Ausnahmeblock wird wie von MestreLion erwähnt benötigt.

5voto

PradeepNama Punkte 451

Hier ist ein einfaches Beispiel, wie Sie eine ganze Zahl bestimmen können

def is_int(x):
    print round(x),
    if x == round(x):
        print 'True',
    else:
        print 'False'

is_int(7.0)   # True
is_int(7.5)   # False
is_int(-1)    # True

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X