Tipos de Datos y Conversión de Tipos

Resumen

Enseñando: 10 min
Ejercicios: 10 min
Preguntas
  • ¿Qué tipo de datos almacenan los programas?

  • ¿Cómo puedo convertir un tipo a otro?

Objectivos
  • Explicar las diferencias clave entre números enteros y números de punto flotante.

  • Use las funciones de la biblioteca de Python para convertir entre enteros, números de punto flotante, y secuencia de caracteres.

Cada valor tiene un tipo.

Use la función integrada type para encontrar el tipo de un valor.

print(type(52))
<class 'int'>
fitness = 'average'
print(type(fitness))
<class 'str'>

Los tipos controlan qué operaciones (o métodos) se pueden realizar en un valor dado.

print(5 - 3)
2
print('hello' - 'h')
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-2-67f5626a1e07> in <module>()
----> 1 print('hello' - 'h')

TypeError: unsupported operand type(s) for -: 'str' and 'str'

Puede usar los operadores “+” y “*” en secuencia de caracteres

full_name = 'Ahmed' + ' ' + 'Walsh'
print(full_name)
Ahmed Walsh
separator = '=' * 10
print(separator)
==========

Las secuencias de caracteres tienen una longitud (pero los números no).

print(len(full_name))
11
print(len(52))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-f769e8e8097d> in <module>()
----> 1 print(len(52))

TypeError: object of type 'int' has no len()

Debe convertir los números en secuencia de caracteres o viceversa cuando realizando operaciones sobre ellos.

print(1 + '2')
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-4-fe4f54a023c6> in <module>()
----> 1 print(1 + '2')

TypeError: unsupported operand type(s) for +: 'int' and 'str'
print(1 + int('2'))
print(str(1) + '2')
3
12

Puede mezclar enteros y números de punto flotantes libremente en las operaciones.

print('half is', 1 / 2.0)
print('three squared is', 3.0 ** 2)
half is 0.5
three squared is 9.0

Las variables solo cambian de valor cuando se les asigna algo.

first = 1
second = 5 * first
first = 2
print('first is', first, 'and second is', second)
first is 2 and second is 5

Fracciones

¿Qué tipo de valor es 3.4? ¿Cómo puedes averiguarlo?

Solución

Es un número de punto flotante (a menudo abreviado “float”).

print(type(3.4))
<class 'float'>

Conversión Automática de Tipos

¿Qué tipo de valor resulta de 3.25 + 4?

Solución

Es float: Enteros son convertidos automáticamente en números de puntos flotantes según sea necesario.

result = 3.25 + 4
print(result, 'is', type(result))
7.25 is <class 'float'>

Elige un Tipo

¿Qué tipo de valor (integer, float, o string) usarías para representar cada uno de los siguientes? Intenta encontrar más de una buena respuesta para cada problema. Por ejemplo, en el n. ° 1, ¿cuándo tendría más sentido contar días con una variable de punto flotante que usar un entero?

  1. Número de días desde el comienzo del año.
  2. Tiempo transcurrido desde el inicio del año hasta ahora en días.
  3. Número de serie de un equipo de laboratorio.
  4. Edad de un espécimen de laboratorio
  5. Población actual de una ciudad.
  6. Población media de una ciudad a lo largo del tiempo.

Solución

Las respuestas a las preguntas son:

  1. Entero, ya que el número de días estaría entre 1 y 365.
  2. Punto flotante, ya que se requieren días fraccionados
  3. Secuencia de caracteres si el número de serie contiene letras y números; de lo contrario, entero si el número de serie consta solo de números
  4. ¡Esto variará! ¿Cómo define la edad de un espécimen? días completos desde la colección (entero)? fecha y hora (secuencia de caracteres)?
  5. Elija punto flotante para representar la población como grandes agregados (por ejemplo, millones), o entero para representar la población en unidades de individuos.
  6. Punto flotante, ya que es probable que un promedio tenga una parte fraccionaria.

Tipos de División

En Python 3, el operador // realiza una división de piso de número entero ( devuelve la parte entera de la división), el operador / realiza una división de número de punto flotante, y el operador ‘%’ (o módulo) calcula y devuelve el resto de la división entera:

print('5 // 3:', 5//3)
print('5 / 3:', 5/3)
print('5 % 3:', 5%3)
5 // 3: 1
5 / 3: 1.6666666666666667
5 % 3: 2

Sin embargo, en Python 2 (y otros lenguajes), el operador / entre dos enteros realiza una división de piso (//). Para realizar una división de punto flotante, tenemos que convertir uno de los enteros a punto flotante.

print('5 // 3:', 1)
print('5 / 3:', 1 )
print('5 / float(3):', 1.6666667 )
print('float(5) / 3:', 1.6666667 )
print('float(5 / 3):', 1.0 )
print('5 % 3:', 2)

Si num_subjects es el número de sujetos que participan en un estudio, y num_per_survey es el número sujetos que pueden participar en una sola encuesta, escriba una expresión que calcule la cantidad de encuestas necesarias para alcanzar a todos los participantes de una sola vez.

Solución

Queremos la cantidad mínima de encuestas que alcance a todos los participantes de una sola vez, que es el valor redondeado de num_subjects / num_per_survey. Esto es equivalente a realizar una división entera con // y sumar 1.

num_subjects = 600
num_per_survey = 42
num_surveys = num_subjects // num_per_survey + 1

print(num_subjects, 'subjects,', num_per_survey, 'per survey:', num_surveys)
600 subjects, 42 per survey: 15

Secuencia de caracteres a Números

Donde sea razonable, float() convertirá una secuencia de caracteres a un número de punto flotante, y int() convertirá un número de punto flotante a un entero:

print("string to float:", float("3.4"))
print("float to int:", int(3.4))
string to float: 3.4
float to int: 3

Sin embargo, si la conversión no tiene sentido, aparecerá un mensaje de error

print("string to float:", float("Hello world!"))
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-5-df3b790bf0a2> in <module>()
----> 1 print("string to float:", float("Hello world!"))

ValueError: could not convert string to float: 'Hello world!'

Dada esta información, ¿qué espera que haga el siguiente programa?

¿Qué hace realmente?

¿Por qué crees que hace eso?

print("fractional string to int:", int("3.4"))

Solución

¿Qué esperas que haga este programa? No sería tan irracional esperar que el comando int de Python 3 convierta la string “3.4” a 3.4 y una conversión de tipo adicional a 3. Después de todo, Python 3 realiza muchas otras magia - ¿no es esa parte de su encanto?

Sin embargo, Python 3 arroja un error. ¿Por qué? Para ser consistente, posiblemente. Si le pide a Python que realice dos typecasts, debe indicar la conversión explícitamente en el código.

int("3.4")
int(float("3.4"))
In [2]: int("3.4")
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-2-ec6729dfccdc> in <module>()
----> 1 int("3.4")
ValueError: invalid literal for int() with base 10: '3.4'
3

Aritmética con Diferentes Tipos

¿Cuál de los siguientes devolverá el float 2.0? Nota: puede haber más de una respuesta correcta.

first = 1.0
second = "1"
third = "1.1"
  1. first + float(second)
  2. float(second) + float(third)
  3. first + int(third)
  4. first + int(float(third))
  5. int(first) + int(float(third))
  6. 2.0 * second

Solución

Respuesta: 1 y 4

Números Complejos

Python proporciona números complejos, que son escritos como 1.0+2.0j. Si val es un número imaginario, Se puede acceder a sus partes reales e imaginarias usando notación de punto como val.real y val.imag.

complex = 6 + 2j
print(complex.real)
print(complex.imag)
6.0
2.0
  1. ¿Por qué crees que Python usa j en lugar de i para la parte imaginaria?
  2. ¿Qué esperas que produzca 1+2j + 3 ?
  3. ¿Qué esperas que sea 4j ? ¿Y qué esperas de 4 j o 4 + j ?

Solución

  1. Los tratamientos matemáticos estándar suelen usar i para denotar un número imaginario. Sin embargo, según informan los medios fue una convención temprana establecida a partir de la ingeniería eléctrica que ahora presenta un área técnicamente costosa para cambiar. [Stack Overflow proporciona una explicación adicional y discusión.] (http://stackoverflow.com/questions/24812444/why-are-complex-numbers-in-python-denoted-with-j-instead-of-i)
  2. (4 + 2j)
  3. 4j, Syntax Error: invalid syntax, en este caso j se considera una variable y esto depende de si j está definido y, de ser así, su valor asignado

Puntos Clave

  • Cada valor tiene un tipo.

  • Use la función type para encontrar el tipo de un valor.

  • Los tipos controlan qué operaciones se pueden hacer con los valores.

  • A las secuencias de caracteres se les pueden agregar y multiplicar.

  • Las secuencias de caracteres tienen una longitud (pero los números no).

  • Se deben convertir números a secuencias de caracteres o viceversa cuando se opera con ellas.

  • Se pueden mezclar enteros y puntos flotantes libremente en operaciones.

  • Las variables solo cambian de valor cuando se les asigna algo.