Python · Capítulo 1 · Lección de conceptos · 6 min de lectura

Nombres, tipos y decisiones

Una variable es un nombre que apunta a un valor, cada valor tiene un tipo que decide qué hace un operador, y una cadena if ejecuta la primera rama verdadera y nada más.

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

Lo que Python recuerda
namevaluetype
qty3int
price24.99float
subtotal74.97float
label'Total: 74.97'str

Paso 1 de 4 qty = 3 crea el valor 3, un int (número entero), y ata el nombre qty a él. El nombre es una etiqueta; el valor es la cosa.

  1. qty = 3 crea el valor 3, un int (número entero), y ata el nombre qty a él. El nombre es una etiqueta; el valor es la cosa.
  2. price = 24.99 es un float, un número con decimales. El dinero en Python suele ser un float, que se redondea al mostrarlo.
  3. subtotal = qty * price usa los nombres, no los números. Python busca ambos valores, los multiplica (un int por un float da un float) y ata subtotal a 74.97.
  4. label = 'Total: ' + str(subtotal) pega texto con texto. Primero hubo que convertir el número en str, 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

Empacar 23 unidades en cajas de 6
coderesultmeaning
23 / 63.833plain division
23 // 63full boxes
23 % 65units left over
math.ceil(23 / 6)4boxes to ship

Paso 1 de 4 El almacén empaca 6 unidades por caja y tiene 23. / siempre da un float, 3.833 cajas, que nadie puede enviar.

  1. El almacén empaca 6 unidades por caja y tiene 23. / siempre da un float, 3.833 cajas, que nadie puede enviar.
  2. // es la división entera: cuántas veces enteras cabe 6 en 23. Tres cajas llenas.
  3. % 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.
  4. 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

  1. if subtotal >= 75: fee = 0
  2. elif subtotal >= 40: fee = 4.99
  3. else: fee = 6.95

Paso 1 de 3 Un carrito de $74.97. Python evalúa la primera condición: ¿74.97 >= 75? No, así que se salta la rama.

  1. Un carrito de $74.97. Python evalúa la primera condición: ¿74.97 >= 75? No, así que se salta la rama.
  2. Ahora el elif: ¿74.97 >= 40? Sí. Su rama se ejecuta y la tarifa es 4.99.
  3. La cadena terminó. El else ni 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.

Un carrito tiene subtotal = 75. La cadena es if subtotal > 75: fee = 0, luego elif subtotal >= 40: fee = 4.99, luego else: fee = 6.95. ¿Cuánto vale fee?

Elige qué puede ejecutarse en este sitio. Puedes cambiarlo cuando quieras desde "Configurar cookies", al pie de cada página.