HOWTO · Python

Orden de operaciones en Python

Este tutorial analiza el orden de ejecución de los operadores en Python, cubriendo la precedencia de operadores, los operadores aritméticos, los operadores lógicos y el uso de paréntesis para mayor claridad. Obtenga una comprensión sólida de cómo Python evalúa las expresiones para escribir mejor código y evitar errores comunes.

En esta página

Python evalúa los operadores según su precedencia, de modo que la multiplicación y la división se vinculan con más fuerza que la suma y la resta. Para predecir un resultado, agrupe la expresión por precedencia, luego tenga en cuenta la asociatividad y cualquier operador lógico con cortocircuito. Los paréntesis hacen explícita la agrupación deseada.

¿Qué es la precedencia de operadores?

La precedencia de operadores es la prioridad que Python usa para agrupar partes de una expresión. Describe la agrupación, no un orden universal de ejecución de izquierda a derecha: la asociatividad determina cómo se agrupan los operadores con la misma precedencia, y Python evalúa los operandos en su orden especificado. Por ejemplo, 3 + 4 * 2 se agrupa como 3 + (4 * 2) y tiene el valor 11.

La siguiente referencia enumera operadores comunes de Python de mayor a menor precedencia. Los operadores en la misma fila comparten un nivel de precedencia; use las reglas de asociatividad o los paréntesis para determinar su agrupación.

Precedencia, de mayor a menor Operadores o expresiones
Agrupación y acceso (expressions), x[index], x(...), x.attribute
Await await x
Exponenciación **
Unarios numéricos y bit a bit +x, -x, ~x
Multiplicación *, @, /, //, %
Suma +, -
Desplazamientos <<, >>
AND bit a bit &
XOR bit a bit ^
OR bit a bit `
Comparaciones y pruebas de pertenencia/identidad <, <=, >, >=, !=, ==, in, not in, is, is not
NOT booleano not x
AND booleano and
OR booleano or
Expresión condicional x if condition else y
Lambda lambda
Expresión de asignación :=

Esta es una referencia práctica para los operadores tratados aquí, no una gramática completa de todas las formas de expresión. PEMDAS es una regla mnemotécnica aritmética conocida, pero no describe todos los operadores de Python ni reemplaza las reglas de precedencia anteriores. La exponenciación también se agrupa de derecha a izquierda, por lo que 2 ** 3 ** 2 significa 2 ** (3 ** 2). Los signos unarios y la exponenciación tienen una relación especial: -2 ** 2 se agrupa como -(2 ** 2).

Operadores aritméticos básicos

En aritmética, los paréntesis se agrupan primero; sigue la exponenciación; luego la multiplicación, la división, la división entera y el módulo; finalmente la suma y la resta. La multiplicación y la división tienen la misma precedencia y se asocian de izquierda a derecha, al igual que la suma y la resta. El operador / realiza la división real, por lo que dividir enteros puede producir un número de punto flotante.

Ejecute este ejemplo:

a = 10
b = 5
c = 2

mixed = a + b * c - a / b
explicit = (a + b) * c - a / b
print(mixed)
print(explicit)

La primera expresión se agrupa como 10 + (5 * 2) - (10 / 5); la segunda se agrupa como (10 + 5) * 2 - (10 / 5). Las divisiones producen valores de punto flotante, por lo que los valores finales son flotantes. Este ejemplo no ha sido ejecutado, por lo que su salida no se muestra aquí.

Las mismas reglas explican 10 + 2 / 2: la división se agrupa primero, por lo que el valor es 11. Python no elige primero la suma simplemente porque aparece primero en la expresión.

Usar paréntesis para mayor claridad

Los paréntesis establecen la agrupación y pueden cambiar un resultado. En el ejemplo anterior, (a + b) se agrupa antes de la multiplicación, lo que cambia la aritmética con respecto a la expresión sin paréntesis. Añada paréntesis cuando aclaren el cálculo que pretende, incluso cuando la precedencia predeterminada de Python ya produciría la misma agrupación.

Los paréntesis controlan la agrupación; no significan que cada parte de la expresión se evalúe de forma ansiosa. Python sigue respetando la semántica de cada operador, incluido el comportamiento de cortocircuito de and y or.

Operadores de comparación y lógicos

Las comparaciones como ==, !=, <, <=, > y >= tienen mayor precedencia que not, and y or. Los paréntesis ayudan a mostrar qué comparaciones alimentan una expresión lógica. Por ejemplo, (10 > 5) and (15 > 10) combina dos comparaciones verdaderas, por lo que la expresión es verdadera.

not se aplica a la expresión que le sigue y se vincula con más fuerza que and; and se vincula con más fuerza que or. Tanto and como or tienen cortocircuito: Python puede omitir la evaluación del operando derecho cuando el operando izquierdo determina el resultado. También devuelven uno de sus operandos, en lugar de devolver siempre un booleano. En una condición, Python trata el valor resultante según su valor de verdad.

Para una condición legible, escriba agrupaciones explícitas como (age >= 18) and (has_ticket or is_guest). Esto hace clara la relación pretendida y ayuda a evitar que una regla de precedencia se confunda con la regla de negocio.

Encadenar comparaciones

Python admite cadenas de comparación como 10 > 5 > 15. Esto es equivalente en resultado a 10 > 5 and 5 > 15, evaluándose la expresión del medio una sola vez. La primera comparación es verdadera y la segunda es falsa, por lo que toda la cadena es falsa. Python no compara el resultado booleano de 10 > 5 con 15.

Una cadena es útil para comprobaciones de rango: 0 <= score <= 100 requiere que ambas comparaciones sean verdaderas. Si las comparaciones implican expresiones diferentes o el valor del medio debe evaluarse más de una vez, escriba las comparaciones pretendidas de forma explícita y use una variable temporal cuando ello mejore la claridad.

Conclusión

Para predecir una expresión de Python, aplique las reglas de precedencia de operadores, compruebe la asociatividad cuando los operadores comparten un nivel y tenga en cuenta comportamientos como el cortocircuito. Use paréntesis para comunicar la agrupación que pretende. Estos hábitos hacen que las expresiones aritméticas y condicionales sean más fáciles de leer y depurar.

Preguntas frecuentes

  1. ¿Qué es la precedencia de operadores en Python?

    Es la prioridad que Python usa para agrupar operadores en una expresión. La asociatividad y la semántica de cada operador también afectan a cómo se evalúa la expresión.

  2. ¿Cómo puedo cambiar la agrupación de una expresión?

    Ponga paréntesis alrededor de la subexpresión que debe agruparse primero, como (a + b) * c.

  3. ¿Qué ocurre cuando los operadores tienen la misma precedencia?

    Depende del operador. La mayoría de los operadores se agrupan de izquierda a derecha, la exponenciación se agrupa de derecha a izquierda y las comparaciones pueden formar una cadena. Añada paréntesis cuando la agrupación pueda no estar clara.

  4. ¿Qué pasa si omito los paréntesis en una expresión compleja?

    Python aplica sus reglas de precedencia y asociatividad definidas. Si esa agrupación es difícil de ver, añada paréntesis para dejar claro el cálculo pretendido.

  5. ¿Puedo encadenar operadores de comparación?

    Sí. Una cadena como 0 <= score <= 100 comprueba ambas comparaciones y evalúa la expresión del medio una sola vez.