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.

3voto

seberg Punkte 8417

Wenn Sie nur die Wert , operator.index ( __index__ spezielle Methode) ist meiner Meinung nach der richtige Weg. Da es für alle Typen, die sicher in eine Ganzzahl gecastet werden können, funktionieren sollte. D.h. Floats scheitern, Integer, sogar ausgefallene Integer-Klassen, die nicht die abstrakte Klasse Integral implementieren, funktionieren durch Duck Typing.

operator.index wird für die Indexierung von Listen usw. verwendet. Und meiner Meinung nach sollte es für viel mehr genutzt/gefördert werden.

Ich würde sogar behaupten, dass dies der einzig korrekte Weg ist, um Integer-Werte zu erhalten, wenn man sicher sein will, dass Fließkommazahlen aufgrund von Abschneideproblemen usw. abgelehnt werden, und es funktioniert mit allen Integral-Typen (d.h. Numpy usw.), auch wenn sie die abstrakte Klasse (noch) nicht unterstützen.

Das ist es, was __index__ war eingeführt für!

0 Stimmen

Scheint genau das Richtige zu sein. Seltsame Sache aber: es akzeptiert True und False, aber nicht mappen sie auf 1 und 0, es gibt den gleichen Wert (mit py2.7). Es könnte sein, dass das daran liegt, dass bool eine Unterklasse von int ist und das als gut genug für einen Index angesehen wird. Du kannst immer tun int(operator.index(x)) um einen echten int zu gewährleisten.

3voto

Nick T Punkte 23882

Wenn Sie ohne Rücksicht auf die Python-Version (2.x vs. 3.x) prüfen wollen, verwenden Sie six ( PyPI ) und es ist integer_types Attribut:

import six

if isinstance(obj, six.integer_types):
    print('obj is an integer!')

Unter six (ein sehr leichtgewichtiges Einzeldateimodul), tut es genau das:

import sys
PY3 = sys.version_info[0] == 3

if PY3:
    integer_types = int,
else:
    integer_types = (int, long)

2voto

jcchuks Punkte 812

Ein allgemeinerer Ansatz, der versucht, sowohl ganze Zahlen als auch ganze Zahlen, die als Zeichenketten angegeben werden, zu prüfen, ist

def isInt(anyNumberOrString):
    try:
        int(anyNumberOrString) #to check float and int use "float(anyNumberOrString)"
        return True
    except ValueError :
        return False

isInt("A") #False
isInt("5") #True
isInt(8) #True
isInt("5.88") #False *see comment above on how to make this True

2voto

Tom Punkte 21

Ich habe ein Programm geschrieben, um zu prüfen, ob eine Zahl quadratisch ist, und bin auf dieses Problem gestoßen. Code, den ich verwendet habe, war:

import math
print ("this program will tell you if a number is square")
print ("enter an integer")
num = float(input())
if num > 0:
    print ("ok!")
    num = (math.sqrt(num))
    inter = int(num)
    if num == inter:
            print ("It's a square number, and its root is")
            print (num)
    else:
            print ("It's not a square number, but its root is")
            print (num)
else:
    print ("That's not a positive number!")

Um festzustellen, ob es sich bei der Zahl um eine ganze Zahl handelt, habe ich die Fließkommazahl, die man durch Quadratwurzelung der Benutzereingabe erhält, in eine gerundete ganze Zahl umgewandelt (die als Wert gespeichert wird); wenn diese beiden Zahlen gleich sind, muss die erste Zahl eine ganze Zahl gewesen sein, so dass das Programm reagieren kann. Dies ist vielleicht nicht der kürzeste Weg, aber bei mir hat es funktioniert.

0 Stimmen

Das scheint kein korrekter Algorithmus zu sein, da er bei ganzen Zahlen, die größer sind als die Mantisse einer Fließkommazahl, fehlschlägt. Versuchen Sie es mit 12345678901234567890123456789012 (das kein Quadrat ist) und prüfe, ob es die richtige Antwort gibt. Sie sollten stattdessen einen ganzzahligen Quadratwurzel-Algorithmus implementieren.

0 Stimmen

Ver diese Frage bezüglich ganzer Quadratwurzeln.

2voto

Wenn Sie einen Python 2-3 kompatiblen Code schreiben wollen

Um zu prüfen, ob es sich bei einem Wert um eine ganze Zahl handelt (egal welcher Art), können Sie wie folgt vorgehen:

# Python 2 and 3: 
import sys
if sys.version_info < (3,):
    integer_types = (int, long,)
else:
    integer_types = (int,)

>>> isinstance(1, integer_types)
True

# Python 2 only:
if isinstance(x, (int, long)):
     ...

# Python 3 only:
if isinstance(x, int):
    ...

Quelle: http://python3porting.com/differences.html

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