Precedência e associatividade de operadores em Python

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

Artigos interessantes...