El truco es buscar en SO todas las otras veces que se hizo esta pregunta. Cada uno de ellos proporcionará una repetición de la misma respuesta estándar.
assert isinstance(inNumber, (int, float)), "inNumber is neither int nor float, it is %s" % type(inNumber)era lo que estaba buscando cuando encontré esta pregunta con Google.
@David: issubclasssería un error, ya que funciona en clases. isinstancecomprueba si un objeto dado es una instancia de una clase o una de las subclases de esa clase , por lo que es perfectamente genérico. isinstance(obj, cls)issubclass(obj.__class__, cls)
77
Esto no funciona para otros tipos enteros, por ejemplo, si x = 12L. Sé que solo intse le pidió, pero es bueno solucionar otros problemas antes de que sucedan. El más genérico es probablemente isinstance(x, numbers.Integral).
Scott Griffiths
9
Para Python 2, también existe la doble verificación directa: isinstance(x, (int, long)).
Eric O Lebigot
1
ADVERTENCIA: los bools son instancias de enteros también. Verisinstance(True, int)
jtschoonhoven
95
Me gusta más la respuesta de @ ninjagecko.
Esto también funcionaría:
para Python 2.x
isinstance(n,(int, long, float))
Python 3.x no tiene mucho tiempo
isinstance(n,(int, float))
También hay un tipo complejo para números complejos
Una nota al margen, ya que los booleanos se resolverán en Verdadero (por ejemplo isinstance(False, (int, float)) = True), necesitaba en su not isinstance(n, bool) and isinstance(n, (int, float))lugar
Es más fácil pedir perdón que pedir permiso. Simplemente realice la operación. Si funciona, el objeto era de un tipo aceptable, adecuado y adecuado. Si la operación no funciona, el objeto no era del tipo adecuado. Conocer el tipo rara vez ayuda.
Simplemente intente la operación y vea si funciona.
inNumber = somenumber
try:
inNumberint = int(inNumber)print"this number is an int"exceptValueError:passtry:
inNumberfloat = float(inNumber)print"this number is a float"exceptValueError:pass
¿Hay alguna razón para hacer esto cuando typey isinstancepuede hacer el trabajo?
user225312
9
int (1.5) no aumenta ValueError, y obviamente lo sabes, ¿dar una respuesta incorrecta a propósito? ¿Seriamente?
Glenn Maynard
44
@Glenn: Supongo que S.Lott entendió la pregunta como "verificar si una cadena es int o flotante" (en cuyo caso, en realidad sería una buena solución).
@AA: class MetaInt(type): pass; class Int(int): __metaclass__ = MetaInt; type(Int(1)) == int. (Perdón por la mala sintaxis, pero no puedo hacer más en una línea.)
mg.
2
@AA: Sí La razón es que esto es más simple y más confiable. La distinción entre inty floatpuede incluso no ser relevante para muchos algoritmos. Solicitar el tipo explícitamente suele ser un signo de mal polimorfismo o un problema de diseño aún más grave. En breve. No verifique los tipos. Es más fácil pedir perdón que pedir permiso.
S.Lott
10
Lo que también puedes hacer es usar el type()
Ejemplo:
if type(inNumber)== int :print"This number is an int"elif type(inNumber)== float :print"This number is a float"
Esto fallaría en el caso [ciertamente raro] de que el número en cuestión sea una SUBCLASE de int o float. (Por eso, "isinstance" se consideraría "mejor", OMI.)
Dan H
7
Aquí hay un código que verifica si un número es un número entero o no, funciona tanto para Python 2 como para Python 3.
import sys
if sys.version <'3':
integer_types =(int, long,)else:
integer_types =(int,)
isinstance(yourNumber, integer_types)# returns True if it's an integer
isinstance(yourNumber, float)# returns True if it's a float
Tenga en cuenta que Python 2 tiene ambos tipos inty long, mientras que Python 3 solo tiene tipo int. Fuente .
Si desea verificar si su número es un floatque representa un int, haga esto
(isinstance(yourNumber, float)and(yourNumber).is_integer())# True for 3.0
Si no necesita distinguir entre int y float, y está bien con cualquiera de ellos, entonces la respuesta de ninjagecko es el camino a seguir
Sé que es un hilo viejo, pero esto es algo que estoy usando y pensé que podría ayudar.
Funciona en python 2.7 y python 3 <.
def is_float(num):"""
Checks whether a number is float or integer
Args:
num(float or int): The number to check
Returns:
True if the number is float
"""returnnot(float(num)).is_integer()classTestIsFloat(unittest.TestCase):def test_float(self):
self.assertTrue(is_float(2.2))def test_int(self):
self.assertFalse(is_float(2))
Puede usar el módulo para determinar si x es un número entero numéricamente. El isinstance(x, int)método solo determina si x es un número entero por tipo:
def isInt(x):if x%1==0:print"X is an integer"else:print"X is not an integer"
3.2 % 2rendimientos 1.4. ¿Qué talkin '' pelea, Willi (s | am)? Además, para empezar, obtendrá un TypeErrorsi x no es un número, por lo que su programa se cerraría prematuramente si seguía este consejo ...
dylnmc
@dylnmc Entonces puede usar el método isinstance () para determinar si x es un número. Además, 3.2% 1 rinde 0.2. Si un número es divisible por 1, es un número entero numéricamente. Este método fue útil para mí aunque no haya sido para ti.
William Gerecke
Esto es verdad; x%1 == 0debe ser cierto solo para ints (pero también será cierto para flotantes con solo un cero después del punto decimal). Si sabe que va a ser un int (p. Ej., Si se trata de un parámetro de una función), puede verificar con el módulo. Apuesto a que es más rápido que Math.floor(x) == x. En el lado no tan brillante, esto será Truesi pasas un flotador como 1.0o 5.0, y encontrarás el mismo problema usando lo que el cartel original mencionó en su pregunta.
dylnmc
5
Probado en Python versión 3.6.3 Shell
>>> x =12>>>import numbers
>>> isinstance(x, numbers.Integral)True>>> isinstance(x,int)True
import math
a =1.1-0.1print a
print isinstance(a, numbers.Integral)print math.floor( a )if(math.floor( a )== a):print"It is an integer number"else:printFalse
Aunque X es flotante, pero el valor es entero, por lo tanto, si desea verificar que el valor sea entero, no puede usar isinstance y necesita comparar valores, no tipos.
inNumber =[32,12.5,'e',82,52,92,'1224.5','12,53',10000.000,'10,000459','This is a sentance, with comma number 1 and dot.','121.124']try:def find_float(num):
num = num.split('.')if num[-1]isnotNoneand num[-1].isdigit():returnTrueelse:returnFalsefor i in inNumber:
i = str(i).replace(',','.')if'.'in i and find_float(i):print('This is float', i)elif i.isnumeric():print('This is an integer', i)else:print('This is not a number ?', i)exceptExceptionas err:print(err)
def is_int(x):
absolute = abs(x)
rounded = round(absolute)if absolute - rounded ==0:print str(x)+" is an integer"else:print str(x)+" is not an integer"
is_int(7.0)# will print 7.0 is an integer
func busca entradas pero también devuelve verdadero para flotadores que son .0
Gideon Lytes
Explique por qué / cómo su contribución resuelve la pregunta de los OP.
Heri
@Heri está buscando verificar si un número es un int o un flotante, la función que definí puede hacer eso, abs es una función de Python incorporada que devuelve el valor absoluto del número, round también es una función incorporada que completa el número, si resta el número redondeado del número absoluto, y obtengo un cero, entonces el número es un int, o tiene un cero como después de sus lugares decimales
assert isinstance(inNumber, (int, float)), "inNumber is neither int nor float, it is %s" % type(inNumber)
era lo que estaba buscando cuando encontré esta pregunta con Google.Respuestas:
El uso es instancia .
Entonces:
_EDITAR:_
Como se señaló, en el caso de los enteros largos, lo anterior no funcionará. Entonces debes hacer:
fuente
issubclass
sería más genérico?issubclass
sería un error, ya que funciona en clases.isinstance
comprueba si un objeto dado es una instancia de una clase o una de las subclases de esa clase , por lo que es perfectamente genérico.isinstance(obj, cls)
issubclass(obj.__class__, cls)
x = 12L
. Sé que soloint
se le pidió, pero es bueno solucionar otros problemas antes de que sucedan. El más genérico es probablementeisinstance(x, numbers.Integral)
.isinstance(x, (int, long))
.isinstance(True, int)
Me gusta más la respuesta de @ ninjagecko.
Esto también funcionaría:
También hay un tipo complejo para números complejos
fuente
isinstance(False, (int, float)) = True
), necesitaba en sunot isinstance(n, bool) and isinstance(n, (int, float))
lugarUn trazador de líneas:
Esto evita algunos problemas:
Manifestación:
fuente
isinstance(99**10,int)
esTrue
.Es más fácil pedir perdón que pedir permiso. Simplemente realice la operación. Si funciona, el objeto era de un tipo aceptable, adecuado y adecuado. Si la operación no funciona, el objeto no era del tipo adecuado. Conocer el tipo rara vez ayuda.
Simplemente intente la operación y vea si funciona.
fuente
type
yisinstance
puede hacer el trabajo?class MetaInt(type): pass; class Int(int): __metaclass__ = MetaInt; type(Int(1)) == int
. (Perdón por la mala sintaxis, pero no puedo hacer más en una línea.)int
yfloat
puede incluso no ser relevante para muchos algoritmos. Solicitar el tipo explícitamente suele ser un signo de mal polimorfismo o un problema de diseño aún más grave. En breve. No verifique los tipos. Es más fácil pedir perdón que pedir permiso.Lo que también puedes hacer es usar el
type()
Ejemplo:fuente
Aquí hay un código que verifica si un número es un número entero o no, funciona tanto para Python 2 como para Python 3.
Tenga en cuenta que Python 2 tiene ambos tipos
int
ylong
, mientras que Python 3 solo tiene tipoint
. Fuente .Si desea verificar si su número es un
float
que representa unint
, haga estoSi no necesita distinguir entre int y float, y está bien con cualquiera de ellos, entonces la respuesta de ninjagecko es el camino a seguir
fuente
¿Qué tal esta solución?
fuente
Sé que es un hilo viejo, pero esto es algo que estoy usando y pensé que podría ayudar.
Funciona en python 2.7 y python 3 <.
fuente
Puede usar el módulo para determinar si x es un número entero numéricamente. El
isinstance(x, int)
método solo determina si x es un número entero por tipo:fuente
3.2 % 2
rendimientos1.4
. ¿Qué talkin '' pelea, Willi (s | am)? Además, para empezar, obtendrá unTypeError
si x no es un número, por lo que su programa se cerraría prematuramente si seguía este consejo ...x%1 == 0
debe ser cierto solo para ints (pero también será cierto para flotantes con solo un cero después del punto decimal). Si sabe que va a ser un int (p. Ej., Si se trata de un parámetro de una función), puede verificar con el módulo. Apuesto a que es más rápido queMath.floor(x) == x
. En el lado no tan brillante, esto seráTrue
si pasas un flotador como1.0
o5.0
, y encontrarás el mismo problema usando lo que el cartel original mencionó en su pregunta.Probado en Python versión 3.6.3 Shell
No se pudo encontrar nada para trabajar.
fuente
por favor verifique esto: números de importación
Aunque X es flotante, pero el valor es entero, por lo tanto, si desea verificar que el valor sea entero, no puede usar isinstance y necesita comparar valores, no tipos.
fuente
fuente
Actualización: prueba esto
fuente
Puedes hacerlo con una simple declaración if
Para verificar el flotador
si tipo (a) == tipo (1.1)
Para verificar el tipo entero
si tipo (a) == tipo (1)
fuente
fuente
Prueba esto...
fuente
variable.isnumeric
comprueba si un valor es un entero:fuente