Variables y tipos — cómo recuerda un programa
Guardar valores en variables, las reglas para nombrarlas y los cuatro tipos básicos —int, float, str, bool—, además del error con el que los principiantes se encuentran más a menudo.
¿Cómo quieres aprender?
El problema que vamos a resolver
Hasta ahora nuestros programas no podían recordar nada. Lo que se imprimía, desaparecía.
El trabajo real no funciona así. En un programa de facturación un precio se calcula una vez y hace falta en tres sitios. En un informe hay que calcular un total primero y usarlo después. El programa tiene que recordar.
Y hay un segundo problema junto al primero. En el capítulo anterior "2" + "3" dio 23 mientras que 2 + 3 dio 5 —el mismo símbolo, dos comportamientos—. Eso es porque, a ojos de Python, esas dos cosas son de distinta categoría. A esa categoría se le llama tipo, y de ahí viene la mayor parte de los errores de un principiante.
Al terminar este capítulo podrás
- Guardar un valor en una variable y cambiarlo después
- Elegir nombres que Python acepte y que una persona pueda leer
- Reconocer los cuatro tipos básicos:
int,float,str,bool - Inspeccionar el tipo de cualquier valor con
type() - Leer un
TypeErrory decir exactamente de qué se queja
Requisitos previos: Ver con print, explicar con comentarios.
Una variable es un nombre
city_count = 4Lee esa línea de derecha a izquierda: el valor 4 apareció, y la etiqueta city_count se le pegó. A partir de ahora, escribir city_count te entrega ese valor.
city_count = 4
print("Cities:", city_count)
print("Double:", city_count * 2)Cities: 4
Double: 8=no significa igual. En las matemáticasx = 4es una afirmación: x y 4 son lo mismo. En Python=es una instrucción: "guarda este valor bajo ese nombre". Por esototal = total + 5—imposible como matemática— es Python perfectamente normal. Significa "toma lo quetotalguarda ahora, suma 5 y devuelve el resultado atotal". Comprobar si dos cosas son iguales tiene su propio símbolo,==, que veremos más adelante.
Cambiar un valor
Asignar un nuevo valor a una variable no deja nada del anterior:
stock = 20
print("Before:", stock)
stock = stock - 3
print("After:", stock)Before: 20
After: 17Mira qué pasa cuando dos nombres apuntan al mismo valor:
a = 10
b = a
a = 99
print(a, b)99 10La línea b = a significa: pon la etiqueta b en el mismo valor al que está pegada a. Ahora los dos nombres se refieren al mismo 10. Luego a = 99 quita la etiqueta a y la pone en el valor nuevo 99 —b se queda donde estaba, en 10—. Asignar un nuevo valor a un nombre mueve solo a ese nombre, no al otro.
Ten presente esta imagen: dos nombres pueden referirse al mismo valor. Con números y cadenas eso no causa problemas, pero más adelante, cuando aprendas las listas —cuyo contenido se puede modificar in situ—, este punto se vuelve muy importante.
Reglas para los nombres
Lo que Python no acepta:
- Empezar por un dígito:
2nd_priceno vale,price_2sí - Un guion en medio:
total-priceno vale, Python lo lee como una resta - Un espacio en medio:
total priceno vale - Las palabras clave de Python:
class,for,if,import,return,Noneno se pueden usar como nombres
Lo que Python acepta pero tú no deberías escribir:
x1 = 4500 # clear today, meaningless in three weeks
Total_Price = 4500 # legal Python, but not the Python convention
l = 4500 # lowercase L and the digit one look almost identicalLa convención profesional de Python es snake_case —minúsculas, con guiones bajos entre palabras—:
total_price = 4500
customer_name = "Rafi"
items_in_cart = 3Darle vueltas a los nombres puede parecer tiempo perdido, pero el código se escribe una o dos veces y se lee veinte. Un nombre que se explica solo hace el trabajo de un comentario.
Los cuatro tipos básicos
items = 7 # int — a whole number
price = 249.50 # float — a number with a decimal point
name = "Rafi" # str — text, inside quotes
is_paid = True # bool — only True or False
print(type(items))
print(type(price))
print(type(name))
print(type(is_paid))<class 'int'>
<class 'float'>
<class 'str'>
<class 'bool'>type() es tu instrumento para disipar la duda. Cuando una variable se comporta de forma rara, el primer movimiento es imprimir su tipo. Casi siempre la respuesta está ahí mismo.
Dos notas pequeñas pero importantes:
True y False empiezan con mayúscula. Si escribes true, Python lo toma como un nombre de variable y dice que no lo conoce.
"7" y 7 no son la misma cosa. El primero es una cadena, el segundo un número. Se parecen y para Python son completamente distintos:
a = 7
b = "7"
print(type(a), type(b))
print(a * 3)
print(b * 3)<class 'int'> <class 'str'>
21
777El error que todo el mundo tiene
age = "22"
print(age + 1)Traceback (most recent call last):
File "C:\Users\Rafi\python-lab\lesson-04\demo.py", line 2, in <module>
print(age + 1)
~~~~^~~
TypeError: can only concatenate str (not "int") to strEl mensaje da miedo y en realidad es preciso: a un str solo se le puede unir otro str, no un int. Python no puede saber si querías sumar o unir —así que, en vez de adivinar, se detuvo—.
La línea File muestra la ruta completa de tu propio archivo, así que será distinta en tu computadora. Las demás líneas se quedan igual.
Lee los mensajes de error de abajo hacia arriba. La última línea dice qué está mal; la de arriba dice dónde. Los principiantes suelen entrar en pánico al ver un traceback y lo saltan por completo, pero los mensajes de error de Python son el texto más útil de tu pantalla.
La solución es hacer que el número sea un número:
age = "22"
print(int(age) + 1)23int() convierte una cadena en un número entero. Cuándo funciona y cuándo falla se trata en detalle en un capítulo más adelante sobre input(), porque ahí este problema aparece siempre.
Un ejemplo completo
invoice.py:
# Invoice for a single order, all figures in one place
customer_name = "Rafi"
unit_price = 249.50
quantity = 3
is_member = True
subtotal = unit_price * quantity
discount = 50.0
total = subtotal - discount
print("Customer :", customer_name)
print("Quantity :", quantity)
print("Subtotal :", subtotal)
print("Discount :", discount)
print("Total :", total)
print("Member :", is_member)Customer : Rafi
Quantity : 3
Subtotal : 748.5
Discount : 50.0
Total : 698.5
Member : TrueFíjate de dónde viene el beneficio real: para cambiar el precio editas solo la línea unit_price, y todos los cálculos de abajo se corrigen solos. Si los números estuvieran escritos directamente en las llamadas a print, tendrías que buscar cada aparición cada vez —y dejar una hace que el informe salga mal—.
Cuando algo falla
NameError: name 'total' is not defined El nombre que usaste todavía no se le ha dado un valor, o está mal escrito. Python trata total y totl como dos nombres distintos. Ten en cuenta que las mayúsculas también cuentan: Total no es total.
TypeError: can only concatenate str (not "int") to str Intentaste unir un número a una cadena. Convierte con int(), o usa una coma —print("Age:", age)—, porque print se encarga él solo de los tipos mezclados.
SyntaxError: cannot assign to expression here. Maybe you meant '==' instead of '='? Un guion en un nombre produce esto. En la línea total-price = 5, Python ve un cálculo que resta price de total, y no se puede guardar un valor dentro de un cálculo. Usa un guion bajo: total_price.
SyntaxError: invalid syntax Intentaste usar una palabra clave de Python como nombre, por ejemplo class = 10. El mensaje no menciona las palabras clave; solo pone un ^ bajo el =, así que tienes que comprobar tú mismo si el nombre es una palabra clave. Elige otra: class_name, grade.
NameError: name 'true' is not defined. Did you mean: 'True'? True y False empiezan con mayúscula.
Paso 4 de 6 — Predice
Comprueba lo que has entendido
¿Qué imprime esto?
a = 10
b = a
a = 99
print(a, b)- A10 99
- B10 10
- C99 99
- D99 10
¿Cuál de estos es un nombre de variable Python válido?
- Aclass
- Bitem-2
- C2nd_item
- Ditem_2
Este programa lanza un TypeError. ¿Qué es exactamente lo que está mal y cómo se arregla?
age = "22"
next_year = age + 1
print("Next year:", next_year)- ASe usó `next_year` sin declararlo antes
- B`age` guarda una cadena, no un número —escribe `age = 22` o usa `int(age) + 1`—
- CEscribir `age + "1"` en vez de `age + 1` daría 23
- DEl `print` necesita un `+` en vez de una coma
Para responder necesitas una cuenta
Inicia sesión para comprobar tus respuestas
Las preguntas están arriba, y resolverlas mentalmente es lo que de verdad importa. Inicia sesión para ver las respuestas, las explicaciones y las pistas de tres niveles.
Tu turno
Escribe un archivo llamado shipping.py que contenga:
- Cuatro variables —una
int, unafloat, unastr, unabool—, todas con nombres con sentido en snake_case - Al menos un cálculo que use dos de ellas para producir una tercera variable
- El tipo de las cuatro variables, impreso con
type() - Una variable a la que se le da un valor y luego se le asigna otro —imprimiendo el valor en ambos pasos—
Luego rompelo a propósito: toma una variable str, escribe + 1 detrás y ejecuta el archivo. Lee el error completo, sobre todo la última línea. Vas a encontrar ese mensaje muchas veces; provocarlo a propósito hoy lo hará familiar más adelante.
Esta misión tiene más
Lo que has leído arriba es la misión completa: no se ha recortado nada. Pro añade:
- Qué ocurre realmente por debajo: cómo ejecuta Python esto
- La solución completa del ejercicio, resuelta paso a paso
- Ejercicios extra más difíciles
- La pregunta de entrevista sobre este tema, con una respuesta modelo
Paso 6 de 6
Reto — el quiz del capítulo
Diez preguntas de fácil a difícil. Las últimas son difíciles a propósito.
Inicia sesión para hacer el quiz