Verificar el tipo de variable contra múltiples tipos no produce el resultado esperado

Tarea:

  1. Defina una función, distance_from_zero con un parámetro.
  2. Haga que esa función haga lo siguiente:
    • Compruebe el tipo de entrada que recibe.
    • Si el tipo es int o float , la función debe devolver el valor absoluto de la entrada de función.
    • Si el tipo es cualquier otro tipo, la función debe devolver "Not an integer or float!"

Mi respuesta que no funciona:

 def distance_from_zero(d): if type(d) == int or float: return abs(d) else: return "Not an integer or float!" 

No puede utilizar este tipo de “concatenación lógica basada en lenguaje natural”. Lo que quiero decir es que debe indicar explícitamente las partes de sus condiciones lógicas.

 if type(d) == int or type(d) == float 

De esta manera, tiene las dos comparaciones, que se destacan por sí mismas: if type(d) == int , así como type(d) == float . Los resultados de esto se pueden combinar con el operador or .

El tipo de verificación debe ser

 if isinstance(d, int) or isinstance(d, float): 

que puede ser abreviado

 if isinstance(d, (int, float)) 

Lo que tu código actual está probando es

 (type(d) == int) or float 

o, en palabras: “o el tipo de d es int , o float es verdadero”. Por razones técnicas, toda esta expresión es siempre cierta. Las expresiones lógicas en los lenguajes de progtwigción deben especificarse un poco más precisamente que en el lenguaje natural.

Debes usar isinstance aquí en lugar de type :

 def distance_from_zero(d): if isinstance(d, (int, float)): return abs(d) else: return "Not an integer or float!" 

si type(d) == int or float siempre va a ser True ya que se evalúa como float y es un valor True :

 >>> bool(float) True 

ayuda en isinstance :

 >>> print isinstance.__doc__ isinstance(object, class-or-type-or-tuple) -> bool Return whether an object is an instance of a class or of a subclass thereof. With a type as second argument, return whether that is the object's type. The form using a tuple, isinstance(x, (A, B, ...)), is a shortcut for isinstance(x, A) or isinstance(x, B) or ... (etc.). 

Relacionado: ¿Cómo comparar el tipo de un objeto en Python?

Aquí hay un código correcto:

 def distance_from_zero(d): if type(d) in (int, float): return abs(d) else: return "Not an integer or float!" print distance_from_zero(3) print distance_from_zero(-5.4) print distance_from_zero("abc") 

Salida:

 3 5.4 Not an integer or float! 

Tenga en cuenta la indentación, en Python es muy importante en comparación con otros idiomas.

En progtwigción, si las declaraciones no funcionan como lo hacen en lenguaje sencillo. Si quieres decir algo como This fruit is an apple or an orange , debes progtwigrla como

 if type(fruit) == Apple or type(fruit) == Orange 

Más específico para su problema, desea utilizar isinstance() lugar de type() , ya que isinstance() contabilizará adecuadamente las subclases. Ver esta respuesta para más detalles.

Así que deberías terminar con algo como

 def distance_from_zero(d): if isinstance(d, int) or isinstance(d, float):  return abs(d) else:  return "Not an integer or float!" 

El error que estás cometiendo es usar demasiado poco de los formatos cortos en inglés.

 if type(d) == int or float: 

Esto significa que debes verificar si el tipo es int o si float es True , que no es lo que quieres.

 if type(d) == int or type(d) == float: 

Esto dará el resultado requerido.