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)
(): Paréntesis (agrupación)**: Exponenciación+x,-x: Unarios (signo positivo/negativo)*,/,//,%: Multiplicación, División, Módulo+,-: Suma, Resta==,!=,>,>=,<,<=,is,is not,in,not in: Comparaciones, Identidad, Pertenencianot,and,or: Lógicos (en ese orden: primeronot, luegoand, al finalor)
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
-
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 -
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 respondenTrueoFalse; no confundas=(asignar) con==(comparar). - Los operadores lógicos (
and,or,not) combinan condiciones; Python evalúa con cortocircuito yand/ordevuelven uno de los valores, no soloTrue/False. in/not inpreguntan si algo está dentro de un contenedor;is/is notcomparan identidad (el mismo objeto en memoria), y su uso cotidiano es casi siempreis 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.