Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Expresiones y Precedencia

Nadie escribe código con un solo operador. En la práctica, combinamos operadores matemáticos, lógicos y de comparación para construir expresiones complejas, y ahí es donde muchos errores silenciosos se cuelan.

Entender la precedencia de operadores no es opcional: es lo que separa el código que funciona del código que parece funcionar.

Precedencia de Operadores

La precedencia fija el orden en que Python resuelve las operaciones dentro de una expresión. Funciona igual que en matemáticas escolares: multiplicación antes que suma, y los paréntesis mandan sobre todo lo demás.

Tabla de Precedencia (de mayor a menor prioridad)

  1. () : Paréntesis (agrupación)
  2. ** : Exponenciación
  3. +x, -x : Unarios (signo positivo/negativo)
  4. *, /, //, % : Multiplicación, División, Módulo
  5. +, - : Suma, Resta
  6. ==, !=, >, >=, <, <=, is, is not, in, not in : Comparaciones, Identidad, Pertenencia
  7. not, and, or : Lógicos (en ese orden: primero not, luego and, al final or)

Ejemplos de Evaluación

Ejemplo 1: Aritmética básica

resultado = 2 + 3 * 4
# Se evalúa primero 3 * 4 = 12
# Luego 2 + 12 = 14
print(resultado)  # 14

Ejemplo 2: Uso de paréntesis

resultado = (2 + 3) * 4
# Se evalúa primero (2 + 3) = 5
# Luego 5 * 4 = 20
print(resultado)  # 20

Ejemplo 3: Lógica y Comparación

peso = 25
fragil = True
requiere_desvio = peso > 20 and fragil
# Se evalúa primero peso > 20 (True)
# Luego True and True (True)
print(requiere_desvio)  # True

Buenas Prácticas

  1. Usa paréntesis para mayor claridad: Aunque te sepas la tabla de precedencia de memoria, los paréntesis hacen el código legible para cualquiera que lo lea después, incluido tú mismo seis meses más tarde.

    # Confuso
    acceso = x > 5 and y < 10 or z == 0
    
    # Claro
    acceso = (x > 5 and y < 10) or z == 0
    
  2. Divide expresiones muy largas: Si una expresión crece hasta volverse ilegible, pártela en variables intermedias con nombres descriptivos. Compara la alarma de reposición del almacén escrita de las dos formas:

    # Ilegible: la precedencia decide y nadie la está mirando
    alerta = precio * stock > 10000 and stock < 5 or descontinuado
    
    # Legible: cada condición tiene nombre propio
    valor_alto = precio * stock > 10000
    stock_critico = stock < 5
    
    alerta = (valor_alto and stock_critico) or descontinuado
    

La precedencia evita los bugs más traicioneros: los que no lanzan error, solo calculan mal. Pero la defensa más barata es escribir expresiones tan claras que nadie tenga que consultar esa tabla.


Resumen del Capítulo

  • Los operadores matemáticos (+ - * / // % **) calculan; / siempre da decimal, // trunca y % entrega el resto.
  • Los operadores de asignación compuesta (+= -= *= /= y compañía) actualizan una caja en un solo paso, sin repetir su nombre.
  • Los operadores de comparación (== != > < >= <=) siempre responden True o False; no confundas = (asignar) con == (comparar).
  • Los operadores lógicos (and, or, not) combinan condiciones; Python evalúa con cortocircuito y and/or devuelven uno de los valores, no solo True/False.
  • in/not in preguntan si algo está dentro de un contenedor; is/is not comparan identidad (el mismo objeto en memoria), y su uso cotidiano es casi siempre is None.
  • La precedencia de operadores decide el orden de evaluación en una expresión; los paréntesis siempre pueden forzarlo y hacerlo explícito.