Precedencia y asociatividad de operadores en Python

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 - 7hay 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… elsebloque que se ejecuta ifcuando 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 ifbloque incluso cuando money es 0. No nos da la salida deseada ya que la precedencia de andes 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 ** 2es 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 < zni significa (x < y) < zni x < (y < z). x < y < zes 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 = 1es perfectamente válido, x = y = z+= 2resultará 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

Articulos interesantes...