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 - 7
está 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… else
bloco que funciona if
quando 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 if
bloco 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 < z
nem significa (x < y) < z
nem x < (y < z)
. x < y < z
é equivalente a x < y and y < z
e é avaliado da esquerda para a direita.
Além disso, embora o encadeamento de atribuições como x = y = z = 1
seja perfeitamente válido, x = y = z+= 2
resultará 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