En este tutorial, aprenderá cómo la precedencia y la asociatividad de los operadores afectan el orden de las operaciones en Python.
Prioridad de los operadores de Python
La combinación de valores, variables, operadores y llamadas a funciones se denomina expresión. El intérprete de Python puede evaluar una expresión válida.
Por ejemplo:
>>> 5 - 7 -2
Aquí 5 - 7
hay una expresión. Puede haber más de un operador en una expresión.
Para evaluar este tipo de expresiones existe una regla de precedencia en Python. Guía el orden en que se llevan a cabo estas operaciones.
Por ejemplo, la multiplicación tiene mayor precedencia que la resta.
# Multiplication has higher precedence # than subtraction >>> 10 - 4 * 2 2
Pero podemos cambiar este orden usando paréntesis, ()
ya que tiene mayor precedencia que la multiplicación.
# Parentheses () has higher precedence >>> (10 - 4) * 2 12
La precedencia de operadores en Python se enumera en la siguiente tabla. Está en orden descendente (el grupo superior tiene mayor precedencia que el inferior).
Operadores | Sentido |
---|---|
() | Paréntesis |
** | Exponente |
+x , -x ,~x | Unario más, Unario menos, Bit a bit NOT |
* , / , // ,% | Multiplicación, división, división de piso, módulo |
+ , - | Suma resta |
<< , >> | Operadores de desplazamiento bit a bit |
& | Y bit a bit |
^ | XOR bit a bit |
| | O bit a bit |
== , != , > , >= , < , <= , is , is not , in ,not in | Comparaciones, identidad, operadores de membresía |
not | NO lógico |
and | Y lógico |
or | OR lógico |
Veamos algunos ejemplos:
Supongamos que estamos construyendo un if… else
bloque que se ejecuta if
cuando el almuerzo es fruta o sándwich y solo si el dinero es mayor o igual a 2.
# Precedence of or & and meal = "fruit" money = 0 if meal == "fruit" or meal == "sandwich" and money>= 2: print("Lunch being delivered") else: print("Can't deliver lunch")
Salida
Se entrega el almuerzo
Este programa se ejecuta en if
bloque incluso cuando money es 0. No nos da la salida deseada ya que la precedencia de and
es mayor que or
.
Podemos obtener el resultado deseado usando paréntesis ()
de la siguiente manera:
# Precedence of or & and meal = "fruit" money = 0 if (meal == "fruit" or meal == "sandwich") and money>= 2: print("Lunch being delivered") else: print("Can't deliver lunch")
Salida
No puedo entregar el almuerzo
Asociatividad de los operadores de Python
Podemos ver en la tabla anterior que existe más de un operador en el mismo grupo. Estos operadores tienen la misma precedencia.
Cuando dos operadores tienen la misma precedencia, la asociatividad ayuda a determinar el orden de las operaciones.
La asociatividad es el orden en el que se evalúa una expresión que tiene varios operadores de la misma precedencia. Casi todos los operadores tienen asociatividad de izquierda a derecha.
Por ejemplo, la multiplicación y la división de piso tienen la misma precedencia. Por lo tanto, si ambos están presentes en una expresión, primero se evalúa el de la izquierda.
# Left-right associativity # Output: 3 print(5 * 2 // 3) # Shows left-right associativity # Output: 0 print(5 * (2 // 3))
Salida
3 0
Nota : El operador de exponente **
tiene asociatividad de derecha a izquierda en Python.
# Shows the right-left associativity of ** # Output: 512, Since 2**(3**2) = 2**9 print(2 ** 3 ** 2) # If 2 needs to be exponated fisrt, need to use () # Output: 64 print((2 ** 3) ** 2)
Podemos ver que 2 ** 3 ** 2
es equivalente a 2 ** (3 ** 2)
.
Operadores no asociativos
Algunos operadores como los operadores de asignación y los operadores de comparación no tienen asociatividad en Python. Hay reglas separadas para las secuencias de este tipo de operador y no se pueden expresar como asociatividad.
Por ejemplo, x < y < z
ni significa (x < y) < z
ni x < (y < z)
. x < y < z
es equivalente a x < y and y < z
, y se evalúa de izquierda a derecha.
Además, si bien el encadenamiento de asignaciones como x = y = z = 1
es perfectamente válido, x = y = z+= 2
resultará en un error.
# Initialize x, y, z x = y = z = 1 # Expression is invalid # (Non-associative operators) # SyntaxError: invalid syntax x = y = z+= 2
Salida
Archivo "", línea 8 x = y = z + = 2 SyntaxError: sintaxis no válida