Neste tutorial, você aprenderá como a precedência e a associatividade dos operadores afetam a ordem das operações em Python.
Precedência de operadores Python
A combinação de valores, variáveis, operadores e chamadas de função é denominada como uma expressão. O interpretador Python pode avaliar uma expressão válida.
Por exemplo:
 >>> 5 - 7 -2
Aqui 5 - 7está uma expressão. Pode haver mais de um operador em uma expressão.
Para avaliar esses tipos de expressões, existe uma regra de precedência em Python. Ele orienta a ordem em que essas operações são realizadas.
Por exemplo, a multiplicação tem precedência mais alta do que a subtração.
 # Multiplication has higher precedence # than subtraction >>> 10 - 4 * 2 2
Mas podemos mudar essa ordem usando parênteses, ()pois ela tem precedência maior do que a multiplicação.
 # Parentheses () has higher precedence >>> (10 - 4) * 2 12
A precedência do operador em Python está listada na tabela a seguir. Está em ordem decrescente (o grupo superior tem precedência mais alta do que os inferiores).
| Operadores | Significado | 
|---|---|
| () | Parênteses | 
| ** | Expoente | 
| +x,-x,~x | Mais unário, menos unário, NÃO bit a bit | 
| *,/,//,% | Multiplicação, Divisão, Divisão de piso, Módulo | 
| +,- | Adição subtração | 
| <<,>> | Operadores de deslocamento bit a bit | 
| & | E bit a bit | 
| ^ | XOR bit a bit | 
| | | OR bit a bit | 
| ==,!=,>,>=,<,<=,is,is not,in,not in | Operadores de comparações, identidade, membros | 
| not | NÃO lógico | 
| and | E lógico | 
| or | OR lógico | 
Vejamos alguns exemplos:
Suponha que estejamos construindo um if… elsebloco que funciona ifquando o almoço é uma fruta ou um sanduíche e apenas se o dinheiro for maior ou 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")
Resultado
Almoço sendo entregue
Este programa executa o ifbloco mesmo quando o dinheiro é 0. Ele não nos dá a saída desejada, pois a precedência de andé maior do que or.
Podemos obter a saída desejada usando parênteses ()da seguinte maneira:
 # 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")
Resultado
Não pode entregar o almoço
Associatividade de operadores Python
Podemos ver na tabela acima que existe mais de uma operadora no mesmo grupo. Esses operadores têm a mesma precedência.
Quando dois operadores têm a mesma precedência, a associatividade ajuda a determinar a ordem das operações.
Associatividade é a ordem na qual uma expressão é avaliada que possui vários operadores com a mesma precedência. Quase todos os operadores têm associatividade da esquerda para a direita.
Por exemplo, multiplicação e divisão de piso têm a mesma precedência. Portanto, se ambos estiverem presentes em uma expressão, o esquerdo é avaliado primeiro.
 # Left-right associativity # Output: 3 print(5 * 2 // 3) # Shows left-right associativity # Output: 0 print(5 * (2 // 3))
Resultado
3 0
Observação : o operador expoente **tem associatividade da direita para a esquerda no 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é equivalente a 2 ** (3 ** 2).
Operadores não associativos
Alguns operadores, como operadores de atribuição e operadores de comparação, não têm associatividade no Python. Existem regras separadas para sequências desse tipo de operador e não podem ser expressas como associatividade.
Por exemplo, x < y < znem significa (x < y) < znem x < (y < z). x < y < zé equivalente a x < y and y < ze é avaliado da esquerda para a direita.
Além disso, embora o encadeamento de atribuições como x = y = z = 1seja perfeitamente válido, x = y = z+= 2resultará em erro.
 # Initialize x, y, z x = y = z = 1 # Expression is invalid # (Non-associative operators) # SyntaxError: invalid syntax x = y = z+= 2
Resultado
Arquivo "", linha 8 x = y = z + = 2 SyntaxError: sintaxe inválida








