Ir al contenido
wannacode

Variables y tipos

En resumen: Una variable es un nombre bajo el que el programa guarda un valor; el tipo viene del valor: int un número entero, float un número decimal, bool sí o no, str texto.

Problema

El precio está en tres sitios

En una tienda en línea, un mismo precio aparece en varios sitios: en el catálogo, en el carrito y al pagar. Si en todos está escrito como número, pasa esto:

print("Auriculares: 49.90 €")
print("En el carrito: auriculares, 49.90 €")
print("A pagar: 49.90 €")

Mañana los auriculares están en oferta. Tienes que encontrar y corregir cada 49.90. Si se te escapa uno, el cliente ve dos precios distintos.

La idea

Una variable: un nombre para un valor

Escribe el precio una sola vez y dale un nombre. Después escribe el nombre en todas partes.

price = 49.90
print(f"Auriculares: {price} €")
print(f"En el carrito: auriculares, {price} €")
print(f"A pagar: {price} €")
Salida
Auriculares: 49.9 €
En el carrito: auriculares, 49.9 €
A pagar: 49.9 €

price = 49.90 crea una variable: un nombre (price) bajo el que el programa guarda un valor (49.90). Donde el código dice price, el programa toma el valor de ahí. El tipo no lo escribes: Python lo ve por el valor. De los tipos trata la siguiente tarjeta.

La f delante de las comillas crea una f-string: un texto en el que escribes un valor directamente entre llaves, {price}. Al imprimir, en ese lugar sale el valor.

El cero del final desapareció: 49.90 salió como 49.9. Para el número es lo mismo. Cómo mostrar el precio con dos cifras decimales lo verás en la lección de entrada y salida.

Más precisamente, para curiosos
  • Un nombre empieza con una letra y no tiene espacios. Escríbelo en minúsculas, y une las palabras con un guion bajo: price, price_per_night. Las mayúsculas y las minúsculas importan: price y Price son dos nombres distintos.
  • El lenguaje también permite nombres con letras como ñ o con tilde (año, situación), pero no lo hagas. El código de todo el mundo usa nombres en latín básico, y así escribirán también tus compañeros.
  • Un nombre al que todavía no has dado un valor no se puede usar. Python se detiene con NameError: name 'total' is not defined cuando llega a esa línea.
  • Un texto y un número no se unen con +:
stock = 12
print("En stock: " + stock + " uds.")
Salida
TypeError: can only concatenate str (not "int") to str

Python lleva la cuenta del tipo de los valores y no convierte el número en texto por su cuenta. Por eso escribimos una f-string. Si quieres usar +, convierte el número en texto: "En stock: " + str(stock) + " uds.".

La idea

Tipos de valores

El tipo dice qué puede guardar la variable. Estos son los principales:

name = "Mochila"
price = 39.90
stock = 12
on_sale = True
size = "M"
print(f"{name}, talla {size}")
print(f"Precio: {price} €")
print(f"En stock: {stock} uds.")
print(f"En oferta: {on_sale}")
Salida
Mochila, talla M
Precio: 39.9 €
En stock: 12 uds.
En oferta: True
  • int: un número entero, por ejemplo una cantidad.
  • float: un número decimal, por ejemplo un precio o un peso. En el código el separador decimal es un punto: 39.90.
  • bool: sí o no, True o False, con mayúscula.
  • str: texto, entre comillas: "Mochila". Esto es una cadena (string), una secuencia de caracteres. No hay un tipo aparte para un solo carácter: "M" es un texto de longitud 1.

type(...) te dice el tipo de un valor. Si añades estas líneas al mismo programa:

print(type(name))
print(type(price))
print(type(stock))
print(type(on_sale))
print(type(size))
Salida
<class 'str'>
<class 'float'>
<class 'int'>
<class 'bool'>
<class 'str'>
Más precisamente, para curiosos

En Python int no tiene límite: un número entero puede tener tantas cifras como quieras, y las cuentas con él son exactas. float es como double en Java y C#: un número decimal en 8 bytes, con unas 15 o 16 cifras significativas. Los guiones bajos entre las cifras solo ayudan a leerlo:

population = 8_100_000_000
weight = 1.5
huge = 123_456_789_012_345_678_901_234_567_890
print(f"{population} {weight}")
print(huge + 1)
Salida
8100000000 1.5
123456789012345678901234567891

float guarda los números en binario, y algunos valores decimales como 0.1 no quedan exactos: 0.1 + 0.2 es 0.30000000000000004. Para el dinero, los programas reales usan Decimal del módulo decimal. En este curso, para abreviar, escribimos los precios como float.

Pruébalo

Encuentra el error

El programa debe imprimir «Cuaderno: 3 uds. a 2.4 €». Se ejecuta, pero imprime «Cuaderno: 3 uds. a (2, 40) €». ¿En qué línea está el error?

Elige la línea con el error.

La idea

= guarda una copia

El signo = no es «igual» como en matemáticas. Significa: toma el valor de la derecha y guárdalo en la variable de la izquierda. Esto se llama asignación. El valor anterior de la variable desaparece.

Cuando a la derecha hay otra variable, se guarda una copia de su valor en ese momento. Las dos variables no quedan conectadas:

seats = 40
seats_at_start = seats
seats = 37
print(f"Al inicio: {seats_at_start}")
print(f"Ahora: {seats}")
Salida
Al inicio: 40
Ahora: 37

seats_at_start recibe 40. Después seats pasa a 37, pero la copia en seats_at_start sigue siendo 40.

Más precisamente, para curiosos

Más precisamente: en Python = no hace una copia, sino que le da a seats_at_start el mismo valor, 40. Cuando después seats = 37, seats recibe un valor nuevo, y seats_at_start se queda con 40. Con los números y el texto, esto se comporta exactamente como una copia. La diferencia se verá con las listas.

Pruébalo

¿Qué valor se queda?

¿Qué imprimirá el programa?

room_a = 12
room_b = 20
room_a = room_b
room_b = 25
print(f"{room_a} y {room_b}")
Respuesta

Problema

Las medidas están al revés

Un programa para imprimir fotos recibe las medidas al revés: ancho 120 y alto 80, cuando deberían ser 80 x 120. Parece que basta con guardar una en la otra y viceversa:

width = 120
height = 80
width = height
height = width
print(f"{width} x {height}")
Salida
80 x 80

Salió 80 x 80. ¿Adónde fue el 120?

Míralo

Intercambio con una variable auxiliar

width = 120
height = 80
temp = width
width = height
height = temp
print(f"{width} x {height}") # 80 x 120
Paso a paso, en palabras
  1. El ancho y el alto se introdujeron al revés: 120 y 80.
  2. temp = width: una copia de 120 va a temp. En width sigue estando 120.
  3. width = height: una copia de 80 entra en width. El 120 anterior desaparece de ahí, pero está guardado en temp.
  4. height = temp: 120 vuelve de temp a height.
  5. Ya están intercambiados: 80 x 120.

En la versión ingenua, width = height guarda 80 en width, y el 120 anterior desaparece. Cuando después viene height = width, width ya guarda 80, y eso es lo que se copia de vuelta.

La solución es una tercera variable auxiliar, temp. Guarda el 120 antes de que width se sobrescriba. Después el 120 pasa de temp a height, y las medidas quedan 80 x 120.

Más precisamente, para curiosos
En Python el intercambio también se puede escribir en una línea. A la derecha se toman los dos valores a la vez, y solo después se guardan a la izquierda:
width = 120
height = 80
width, height = height, width
print(f"{width} x {height}")
Salida
80 x 120

Lo verás en código ajeno. Aquí lo escribimos con temp, para que veas qué pasa paso a paso.

Pruébalo

Ordena el intercambio

En la tienda, dos compañeros se cambian el turno. morning es «Iván», y evening es «María». Ordena las líneas para que se intercambien.

  1. morning = evening
  2. evening = temp
  3. print(f"Mañana: {morning}, tarde: {evening}")
  4. temp = morning

La idea

El tipo es del valor

En Python no escribes el tipo de la variable. El tipo es del valor: 3 es un int, "tres" es un str. Por eso la misma variable puede recibir después un valor de otro tipo:

nights = 3
print(type(nights))
nights = "tres"
print(type(nights))
Salida
<class 'int'>
<class 'str'>

Python no se queja. Esto se llama tipado dinámico: el tipo se conoce solo mientras el programa se ejecuta. Es cómodo, pero también lleva a errores con facilidad: si en un sitio nights es un número y en otro es texto, las cuentas con ella se detendrán. Guarda un solo tipo de valor en una variable.

Más precisamente, para curiosos

Puedes escribir el tipo como una nota: nights: int = 3. Esto se llama anotación de tipo. Python no la comprueba, y nights = "tres" después de ella sigue pasando. La comprueban programas aparte como mypy. En este curso no los usamos.

Ejercicio

Tus variables

Resuelve las tareas en tu editor. Los valores están escritos en el código, sin leer del teclado. La lectura llega en la siguiente lección.

1. Intercambio. En el estante de arriba hay 15 libros, en el de abajo 27. Guárdalos en dos variables, intercambia sus valores e imprime el antes y el después.

Salida
Antes: arriba 15, abajo 27
Después: arriba 27, abajo 15

2. Edad. Guarda un nombre y una edad en dos variables e imprímelos en una frase.

Salida
María tiene 19 años.

3. La ficha de un hotel. Guarda en variables el nombre del hotel (texto), las estrellas (un número entero), la valoración (un número decimal), si tiene desayuno (sí o no) y la categoría (un solo carácter). Imprímelos.

Salida
Hotel «Estrella de Mar»
Estrellas: 4
Valoración: 8.7
Desayuno: True
Categoría: B

Más tareas

  • Tres en círculo. Tres cajas empiezan el día con 120, 85 y 240 €. Mueve las cantidades en círculo: la primera pasa a la segunda, la segunda a la tercera, la tercera a la primera. Usa una sola variable auxiliar. Imprime 240 120 85.
  • Los tipos. Imprime con type() el tipo de cada valor de la tarea 3.
  • Un error a propósito. Une un texto y un número con +: print("Estrellas: " + stars). Lee lo que dice Python. Después escribe la valoración con coma, rating = 8,7, y mira qué se imprime.

Test

Ponte a prueba

1. ¿Qué hace la línea count = 5?
2. ¿De qué tipo es 12.99 en Python?
3. a = 5, b = a, a = 9. ¿Cuánto vale b?
4. ¿Por qué intercambiar dos valores necesita una tercera variable?
5. nights = 3 y luego nights = "tres". ¿Qué pasa?

Creado por Ivo Gergov como parte de la campaña de Evo Tech por una educación accesible en programación ·