La idea
Cuando escribes qty = 3, Python no mete el 3 en una caja llamada qty. Crea el valor 3 en algún lugar de la memoria y le ata un nombre. Las líneas siguientes que mencionan qty buscan el nombre y encuentran el valor. Si asignas de nuevo, el nombre se mueve; el valor viejo solo pierde su etiqueta.
Figura 1
Cuatro líneas de código, cuatro nombres, cuatro tipos
| name | value | type |
|---|---|---|
| qty | 3 | int |
| price | 24.99 | float |
| subtotal | 74.97 | float |
| label | 'Total: 74.97' | str |
qty = 3crea el valor 3, unint(número entero), y ata el nombreqtya él. El nombre es una etiqueta; el valor es la cosa.price = 24.99es unfloat, un número con decimales. El dinero en Python suele ser un float, que se redondea al mostrarlo.subtotal = qty * priceusa los nombres, no los números. Python busca ambos valores, los multiplica (unintpor unfloatda unfloat) y atasubtotala 74.97.label = 'Total: ' + str(subtotal)pega texto con texto. Primero hubo que convertir el número enstr, porque+entre un texto y un número es un error. El tipo decidió qué podía hacer+.
Cada valor lleva un tipo: int, float, str (texto), bool (True o False). El tipo es lo que decide qué puede hacer un operador. * multiplica dos números, repite un texto, y se niega a multiplicar un texto por un decimal. A Python nunca le importan los nombres; los tipos siempre.
Por qué existe
Una celda de hoja de cálculo muestra un valor y haces clic para ver cómo llegó ahí. Un script no tiene celdas, así que necesita algo que cumpla el mismo papel: una forma de decir "este número lo voy a necesitar otra vez" sin escribir 24.99 en cinco sitios. Los nombres son eso. Cambias price una vez y todas las líneas que lo usan lo siguen.
Los tipos existen porque un ordenador guarda el número 3 y el texto "3" de maneras muy distintas. Sin tipos, "3" + 4 tendría que adivinar si querías 7 o "34". Python se niega y te lo dice, lo que molesta diez segundos y te evita un total equivocado en silencio.
Cómo funciona por dentro
Python evalúa el lado derecho y luego pone el nombre
En subtotal = qty * price, Python calcula primero el lado derecho, por completo, y después ata el nombre de la izquierda al resultado. Por eso total = total + 10 es legal: se lee el total viejo, se le suma 10 y solo entonces el nombre pasa al valor nuevo.
Los números tienen varios trabajos
La división en Python tiene tres formas, y cada una responde una pregunta distinta sobre los mismos números. / da la respuesta exacta como float. // da cuántas veces enteras cabe el divisor. % da lo que sobra.
Figura 2
23 unidades, cajas de 6: // y % reparten el trabajo
| code | result | meaning |
|---|---|---|
| 23 / 6 | 3.833 | plain division |
| 23 // 6 | 3 | full boxes |
| 23 % 6 | 5 | units left over |
| math.ceil(23 / 6) | 4 | boxes to ship |
- El almacén empaca 6 unidades por caja y tiene 23.
/siempre da un float, 3.833 cajas, que nadie puede enviar. //es la división entera: cuántas veces enteras cabe 6 en 23. Tres cajas llenas.%es el resto: lo que sobra después de esas tres cajas, 23 - 18 = 5 unidades.//y%son las dos mitades de la misma división.- Cinco unidades siguen necesitando caja, así que las cajas a enviar son el cociente redondeado hacia arriba:
math.ceil(23 / 6)da 4.
Siempre que conviertas una cantidad en contenedores, páginas, semanas o cajas, quieres // y %. Siempre que algo deba redondearse hacia arriba porque una caja parcial sigue siendo una caja, quieres math.ceil. Un float además arrastra pequeños errores binarios: 0.1 + 0.2 es 0.30000000000000004, por eso el dinero se redondea con round(x, 2) antes de mostrarlo o compararlo.
El texto se construye, no se suma
Una f-string como f"Total: {subtotal:.2f}" mete un valor en el texto y lo formatea en el mismo paso: .2f significa "dos dígitos después del punto decimal". Te ahorra el str() y el + del diagrama anterior, y así se hacen todas las etiquetas y mensajes de los capítulos siguientes.
if, elif, else
Las condiciones son expresiones que dan un bool. subtotal >= 75 es True o False, y and, or, not las combinan. Una cadena if evalúa sus condiciones en orden y ejecuta la primera rama cuya condición es verdadera. Luego se detiene.
Figura 3
Una cadena if / elif / else, de arriba abajo
-
if subtotal >= 75:fee = 0 -
elif subtotal >= 40:fee = 4.99 -
else:fee = 6.95
- Un carrito de $74.97. Python evalúa la primera condición: ¿74.97 >= 75? No, así que se salta la rama.
- Ahora el
elif: ¿74.97 >= 40? Sí. Su rama se ejecuta y la tarifa es 4.99. - La cadena terminó. El
elseni se mira, porque solo se ejecuta la primera rama verdadera. Un centavo más y la primera prueba lo habría atrapado.
Ese orden es toda la lógica. Una regla como "gratis sobre $75, $4.99 desde $40, si no $6.95" solo funciona si el umbral mayor se prueba primero. Invierte las dos pruebas y todo carrito de más de $40 paga $4.99, incluidos los de $200. Los límites son el otro lugar donde fallan las cadenas: > y >= se distinguen en un solo caso, un carrito de exactamente $75.
Leer el tipo cuando algo se ve mal
La mayoría de los errores de principiante en este capítulo son un tipo o un límite disfrazados. Un envío que se cobra justo en $75 es un > donde iba un >=. Un tiempo de entrega que muestra 2.5 horas cuando querías "2 h 30 min" es un / donde iban // y %. Una etiqueta que se cae con TypeError es un número pegado a un texto sin str() ni f-string. Cuando un resultado se ve mal, no releas todo el script. Imprime las entradas con sus tipos, print(qty, type(qty)), y revisa la única expresión que produjo el valor malo. Diez segundos imprimiendo ganan a diez minutos mirando.
Por qué importa el orden de las líneas
Un script corre de arriba abajo, una línea cada vez, y un nombre existe solo después de la línea que lo crea. Usar subtotal antes de asignarlo es un error, y cambiar price después de calcular subtotal no cambia subtotal. El valor se calculó en ese momento y se queda como estaba, a diferencia de una fórmula de hoja de cálculo que sigue a sus entradas. Si quieres el número nuevo, vuelve a ejecutar el cálculo.
Errores comunes
"Una variable es una caja que guarda el valor"
Se parece más a una nota adhesiva pegada a un valor. Dos nombres pueden apuntar al mismo valor, y darle un valor nuevo a un nombre nunca cambia el viejo. Esto importa desde el capítulo 2: cuando una lista tiene dos nombres y la cambias por uno, ambos ven el cambio, porque solo hay una lista.
"El número 5 y el texto '5' son lo mismo"
Se parecen en pantalla y se comportan de forma muy distinta. 5 + 5 es 10, mientras que '5' + '5' es '55', y '5' + 5 es un error. Los datos de archivos y formularios web suelen llegar como texto, así que antes de hacer cuentas revisa type(value) y conviértelos con int() o float().
"Si varias condiciones son verdaderas, se ejecutan todas"
Solo se ejecuta la primera rama verdadera de una cadena if / elif / else; las demás se saltan sin evaluarse. Si quieres que varias reglas se apliquen juntas, escribe sentencias if separadas, no elif. Confundir ambas es la causa habitual de "mi descuento se aplicó dos veces" y "mi descuento nunca se aplicó".
Ponte a prueba
Una pregunta. Al responderla, la lección queda marcada en el mapa; nunca bloquea un nivel.
No del todo. La primera prueba es 75 > 75, que es falsa: estrictamente mayor significa que el límite mismo no cuenta.Prueba otra respuesta.
Correcto. La primera condición falla en el límite, el elif es verdadero y su rama es la única que se ejecuta.
No del todo. else solo se ejecuta cuando todas las pruebas anteriores fueron falsas, y 75 >= 40 es verdadera.Prueba otra respuesta.
No del todo. Solo se ejecuta la primera rama verdadera. Las condiciones posteriores ni se evalúan cuando una ya coincidió.Prueba otra respuesta.
Lección hecha: ya está marcada en el mapa.