Python Operadores

Esta é a página de consulta rápida dos operadores do Python 3.14: os símbolos e palavras que fazem contas, comparam, combinam condições e guardam valores (+, ==, and, in, +=…). No fim está a tabela de precedência oficial, que diz quem é feito primeiro numa expressão com vários operadores. A explicação passo a passo de cada grupo está nas aulas, a partir de Operadores Aritméticos.

Como ler as tabelas
  • Exemplo é o que você digitaria depois do >>> do modo interativo; Resultado é o que o Python 3.14.4 respondeu no computador da Ana.
  • Quando o exemplo dá erro, o resultado mostra a última linha da mensagem do Python (em inglês).
  • Alguns exemplos usam variáveis: elas aparecem logo acima da tabela.
  • O mesmo símbolo pode fazer coisas diferentes conforme o tipo dos valores: + soma números e junta textos; | faz contas com bits nos inteiros e une conjuntos.
GrupoOperadoresAula
Aritméticos+ - * / // % ** e o sinal -xOperadores Aritméticos
Comparação== != < <= > >=Comparações
Lógicosand or notand, or e not
Identidade e pertinênciais, is not, in, not inis e in
Bit a bit& | ^ ~ << >>(sem aula própria; nesta página)
Atribuição=, +=, -=… e o morsa :=Operadores de Atribuição
Matriz@(nesta página)
Precedênciaquem é feito primeiroPrecedência dos Operadores

Aritméticos

OperadorO que fazExemploResultadoAula
+Soma7 + 29Operadores Aritméticos
-Subtração7 - 25
*Multiplicação7 * 214
/Divisão: o resultado é sempre float, mesmo quando é exata7 / 2
8 / 2
3.5
4.0
//Divisão inteira: arredonda para baixo (para o menor inteiro)7 // 2
-7 // 2
5.0 // 2
3
-4
2.0
%Resto da divisão (o sinal segue o número da direita)7 % 2
-7 % 3
7 % -3
1
2
-2
**Potência7 ** 2
2 ** -1
2 ** 0.5
49
0.5
1.4142135623730951
-x, +xSinal na frente de um valor (troca o sinal / deixa como está)-(-5)
+5
5
5
/, //, % por zeroDividir por zero é erro10 / 0
10 % 0
ZeroDivisionError: division by zero
(o mesmo)

Com textos e listas

OperadorO que fazExemploResultadoAula
+Junta (concatena) dois textos, duas listas, duas tuplas"pão" + "zinho"
[1, 2] + [3]
'pãozinho'
[1, 2, 3]
Juntar e Repetir Textos
*Repete (com um inteiro)"ab" * 3
[0] * 3
'ababab'
[0, 0, 0]
+ texto com númeroNão junta tipos diferentes"pão" + 5TypeError: can only concatenate str (not "int") to strConversão de Tipos
% com textoFormatação no estilo antigo (hoje se usa f-string)"Total: %d itens" % 3'Total: 3 itens'f-strings

Comparação

Toda comparação responde True ou False.

OperadorPerguntaExemploResultadoAula
==É igual? (dois sinais de igual)2 == 2.0
"a" == "A"
True
False
Comparações
!=É diferente?2 != 3True
<, >Menor? Maior?3 < 5True
<=, >=Menor ou igual? Maior ou igual?5 <= 5True
textosComparam letra por letra, pela ordem dos caracteres: maiúsculas vêm antes das minúsculas"abacaxi" < "banana"
"Zebra" < "abacaxi"
True
True
listasComparam item por item[1, 2] < [1, 3]True
em cadeiaa < b < c é o mesmo que a < b and b < c1 < 3 < 5
1 == 1.0 == True
True
True
tipos que não se comparamNúmero com texto, só com ==/!=3 < "5"TypeError: '<' not supported between instances of 'int' and 'str'
float com ==Contas com decimais podem ter um erro minúsculo0.1 + 0.2 == 0.3FalseNúmeros

Lógicos

OperadorO que fazExemploResultadoAula
and"E": verdadeiro só se os dois foremTrue and False
5 > 3 and 2 > 1
False
True
and, or e not
or"Ou": verdadeiro se pelo menos um forTrue or FalseTrue
not"Não": invertenot True
not 0
not ""
False
True
True
or com valoresDevolve o primeiro valor "verdadeiro" (ou o último, se nenhum for). Bom para valor padrão"" or "anônimo"
"Ana" or "anônimo"
None or 0 or "fim"
'anônimo'
'Ana'
'fim'
and com valoresDevolve o primeiro valor "falso" (ou o último, se todos forem verdadeiros)0 and 10
3 and 10
0
10

"Falsos" são False, None, o zero (0, 0.0) e o que está vazio ("", [], {}, set()); todo o resto conta como verdadeiro (aula Booleanos). and e or param assim que sabem a resposta: em False and …, o lado direito nem é calculado.


Identidade (is) e pertinência (in)

Variáveis usadas abaixo: x = None, a = [1, 2], b = a (o mesmo objeto) e c = [1, 2] (outra lista, igual).

OperadorPerguntaExemploResultadoAula
isÉ o mesmo objeto? (não só igual)a is b
a is c
a == c
True
False
True
is e in
is com NoneO uso mais comum do isx is NoneTrueO Valor None
is notNão é o mesmo objeto?x is not NoneFalse
duas listas novasIguais, mas cada uma é um objeto[1, 2] == [1, 2]
[1, 2] is [1, 2]
True
False
Mutável × Imutável
inEstá dentro? Num texto, procura um pedaço"an" in "banana"
3 in [1, 2, 3]
True
True
is e in
not inNão está dentro?4 not in [1, 2, 3]True
in num dicionárioProcura só nas chaves"pão" in {"pão": 0.5}
0.5 in {"pão": 0.5}
True
False
Dicionários
is com um número ou texto escrito no código

Para comparar valores, use ==. O Python avisa quando vê is com um valor escrito direto:

idade = 5
print(idade is 5)
$ python3 ro_is5.py
/home/ana/ro_is5.py:2: SyntaxWarning: "is" with 'int' literal. Did you mean "=="?
  print(idade is 5)
True

Não é erro: é um aviso (warning), e o programa roda. "is com um literal int. Você quis dizer ==?" Aqui deu True por acaso: o Python reaproveita o objeto dos números pequenos, mas não garante isso para todo valor. Como consertar: idade == 5. Guarde o is para None (x is None).


Bit a bit

Com números inteiros, estes operadores trabalham com os bits: os zeros e uns com que o computador escreve o número. bin(n) mostra os bits (bin(6) é '0b110': 4 + 2), e 0b110 escreve um número direto em binário. Para quem está começando, o importante é não confundi-los com outras coisas: ^ não é potência, e &/| não são and/or.

OperadorO que faz com os bitsExemploResultado
&"E": bit 1 só onde os dois têm 16 & 3
bin(10 & 12)
2
'0b1000'
|"Ou": bit 1 onde pelo menos um tem 16 | 3
bin(10 | 12)
7
'0b1110'
^"Ou exclusivo": bit 1 onde só um dos dois tem 16 ^ 3
2 ^ 3
5
1 (não é 8!)
~Inverte todos os bits (dá -x - 1)~6
~0
-7
-1
<<Empurra os bits para a esquerda (multiplica por 2 a cada casa)1 << 3
5 << 1
8
10
>>Empurra para a direita (divide por 2 a cada casa, arredondando para baixo)40 >> 2
5 >> 1
10
2
com True/FalseFunciona (eles valem 1 e 0), mas prefira and/orTrue & FalseFalse

Os mesmos símbolos com conjuntos e dicionários

OperadorCom conjuntosExemploResultadoAula
|União{1, 2, 3} | {2, 3, 4}{1, 2, 3, 4}União, Interseção e Diferença
&Interseção{1, 2, 3} & {2, 3, 4}{2, 3}
-Diferença{1, 2, 3} - {2, 3, 4}{1}
^Diferença simétrica{1, 2, 3} ^ {2, 3, 4}{1, 4}
| com dicionáriosJunta os pares num dicionário novo{"a": 1} | {"b": 2}{'a': 1, 'b': 2}Adicionando e Removendo Chaves

Atribuição

O = guarda um valor numa variável. As formas com um operador na frente (+=, -=…) fazem a conta com o valor que já está lá e guardam o resultado: x += 3 é o mesmo que x = x + 3. Em cada linha abaixo, x começa valendo 10:

OperadorÉ o mesmo queExemplox ficaAula
=guarda o valorx = 1010Variáveis
+=x = x + 3x += 313Operadores de Atribuição
-=x = x - 3x -= 37
*=x = x * 3x *= 330
/=x = x / 4x /= 42.5
//=x = x // 3x //= 33
%=x = x % 3x %= 31
**=x = x ** 2x **= 2100

Há uma forma com = para cada operador de bits também. Com outros tipos, a conta é a do tipo:

AntesLinhaDepois
y = 6y &= 3 / y |= 3 / y ^= 32 / 7 / 5
y = 1 / y = 40y <<= 3 / y >>= 28 / 10
s = "pão"s += "zinho"'pãozinho'
lista = [1]lista += [2, 3], depois lista *= 2[1, 2, 3], depois [1, 2, 3, 1, 2, 3]
c = {1, 2}c |= {3}{1, 2, 3}
d = {"a": 1}d |= {"b": 2}{'a': 1, 'b': 2}

O @= também existe, para o @ (mais abaixo). Formas como a, b = b, a e a = b = 0 estão nas aulas Atribuição Múltipla e Desempacotamento.

O operador morsa :=

O := ("expressão de atribuição", apelidada de operador morsa, porque o sinal lembra os olhos e as presas de uma morsa) guarda um valor numa variável e devolve esse valor, no meio de uma expressão. Serve para não calcular a mesma coisa duas vezes:

nome = "Ana Beatriz"
if (tamanho := len(nome)) > 5:
    print(f"Nome comprido: {tamanho} letras")
$ python3 ro_morsa.py
Nome comprido: 11 letras

O len(nome) foi calculado uma vez, guardado em tamanho, comparado com 5 e usado de novo no print. Os parênteses em volta são necessários: sem eles, o :=, que é o operador mais fraco de todos, pegaria len(nome) > 5 inteiro, e tamanho valeria True.

EscritaResultadoPor quê
(n := 3 * 2)6 (e n fica valendo 6)Guarda e devolve o valor
n := 10 sozinho numa linhaSyntaxError: invalid syntaxComo comando sozinho, use n = 10; o := é para dentro de expressões
$ python3 ro_morsa_erro.py
  File "/home/ana/ro_morsa_erro.py", line 1
    n := 10
      ^^
SyntaxError: invalid syntax
Versões

O := existe desde o Python 3.8. No Ubuntu 26.04 (3.14) e no Debian 13 (3.13), funciona.


O @: multiplicação de matrizes

O @ existe na linguagem desde o Python 3.5, mas nenhum tipo que vem com o Python o usa. Ele foi criado para as bibliotecas de cálculo, como a NumPy, em que a @ b multiplica duas matrizes (tabelas de números). Com números comuns, dá erro:

print(2 @ 3)
$ python3 ro_matmul.py
Traceback (most recent call last):
  File "/home/ana/ro_matmul.py", line 1, in <module>
    print(2 @ 3)
          ~~^~~
TypeError: unsupported operand type(s) for @: 'int' and 'int'

"Tipos não suportados para @: int e int". Um tipo passa a aceitar o @ quando define o método especial __matmul__ (aula Métodos Especiais). Um exemplo pequeno, só para ver funcionando:

class Matriz:
    def __init__(self, linhas):
        self.linhas = linhas
    def __matmul__(self, outra):
        a, b = self.linhas, outra.linhas
        return Matriz([[sum(a[i][k] * b[k][j] for k in range(len(b)))
                        for j in range(len(b[0]))] for i in range(len(a))])
m = Matriz([[1, 2], [3, 4]])
id2 = Matriz([[1, 0], [0, 1]])
print((m @ id2).linhas)
print((m @ m).linhas)
$ python3 ro_matriz.py
[[1, 2], [3, 4]]
[[7, 10], [15, 22]]

Não se preocupe em entender a classe agora. Na prática, você só vai escrever @ se um dia trabalhar com matrizes numa biblioteca.


Outros que aparecem na tabela de precedência

EscritaO que éExemploResultadoAula
a if condição else bExpressão condicional: escolhe um de dois valores"par" if 7 % 2 == 0 else "ímpar"'ímpar'if em uma Linha
lambdaFunção pequena, sem nome(lambda x: x + 1)(4)5lambda
x[i], x(…), x.nomeÍndice ou chave, chamada de função, atributo/método[10, 20, 30][1] * 2
"pão".upper() + "!"
40
'PÃO!'
Acessando Itens
await xEspera uma tarefa assíncrona (só dentro de async def)——asyncio
*lista, **dicionarioNão são operadores de conta: espalham os itens numa chamada ou numa listaprint(*dias)(veja a aula)Desempacotamento, *args e **kwargs

Precedência: quem é feito primeiro

Quando uma expressão tem vários operadores, o Python faz primeiro os mais fortes. A tabela abaixo é a da documentação oficial (docs.python.org, seção 6.17), do mais forte (feito primeiro) para o mais fraco (feito por último). Operadores da mesma linha têm a mesma força e são feitos da esquerda para a direita, menos a potência ** e o if/else, que vão da direita para a esquerda. A explicação com calma está na aula Precedência dos Operadores.

ForçaOperadoresNomeExemploResultado
1 (mais forte)(…), […], {chave: valor…}, {…}Parênteses; criar lista, dicionário, conjunto(2 + 3) * 420
2x[i], x[i:j], x(…), x.atributoÍndice e fatia, chamada, atributolen("pão") + 14
3await xEspera assíncrona——
4**Potência (da direita para a esquerda)2 ** 3 ** 2
(2 ** 3) ** 2
512
64
5+x, -x, ~xSinal e inversão de bits-2 ** 2
(-2) ** 2
-4
4
6*, @, /, //, %Multiplicação, matriz, divisões, resto100 / 10 * 220.0
7+, -Soma e subtração2 + 3 * 414
8<<, >>Deslocamento de bits1 + 2 << 16
9&"E" de bits1 | 6 & 33
10^"Ou exclusivo" de bits6 | 3 ^ 16
11|"Ou" de bits6 ^ 3 | 15
12in, not in, is, is not, <, <=, >, >=, !=, ==Comparações, pertinência e identidade (todas na mesma força, em cadeia)2 + 3 > 4
6 & 3 == 2
True
True
13not x"Não"not 1 == 2True
14and"E"True or False and FalseTrue
15or"Ou"(True or False) and FalseFalse
16if – elseExpressão condicional"a" if True else "b" + "!"
("a" if True else "b") + "!"
'a'
'a!'
17lambdaFunção sem nome(lambda x: x + 1)(4)5
18 (mais fraco):=Operador morsa(n := 3 * 2)6

Detalhes da tabela oficial: a potência perde para um sinal à direita dela, por isso 2 ** -1 funciona e dá 0.5; e o % com textos (formatação) tem a mesma força do % de resto.

As armadilhas de precedência

EscritaResultadoComo o Python leu
-2 ** 2-4-(2 ** 2): a potência vem antes do sinal
2 ** 3 ** 25122 ** (3 ** 2): a potência vai da direita para a esquerda
nota1 + nota2 / 2com 8 e 6: 11.0nota1 + (nota2 / 2): para a média, (nota1 + nota2) / 2
not True == FalseTruenot (True == False): o not é mais fraco que a comparação
True or False and FalseTrueTrue or (False and False): and antes de or
"ab" in "abc" == TrueFalsein e == na mesma força, em cadeia: ("ab" in "abc") and ("abc" == True). Escreva só "ab" in "abc" (que dá True)
6 & 3 == 2True(6 & 3) == 2: em Python o & é mais forte que a comparação (no C e no JavaScript é o contrário)
1 + 2 << 16(1 + 2) << 1: a soma vem antes do deslocamento
Na dúvida, parênteses

Ninguém precisa decorar as 18 linhas. Quando a ordem não for óbvia para quem lê, ponha parênteses: (nota1 + nota2) / 2 e (-2) ** 2 deixam a intenção clara e não custam nada.


Experimente

Missão: a média de 8 e 6 deveria ser 7.0, mas o programa mostra Média: 11.0, porque a divisão foi feita antes da soma. Ponha os parênteses no lugar certo.

nota1 = 8
nota2 = 6
media = nota1 + nota2 / 2
print("Média:", media)
nota1 = 8
nota2 = 6
media = (nota1 + nota2) / 2
print("Média:", media)

Livre: o caixa da padaria com o operador morsa. O while lê um preço, guarda em texto e já compara com o vazio, tudo na mesma linha. A caixa digita sozinha 0.50, 4.75 e uma linha vazia. Rode e depois mude o programa à vontade: por exemplo, conte quantos produtos passaram.

total = 0
while (texto := input("Preço (vazio para parar): ")) != "":
    total += float(texto)
print(f"Total: R$ {total:.2f}")

No terminal da Ana, o mesmo programa (caixa.py), digitando 0.50, 4.75 e depois só Enter:

$ python3 caixa.py
Preço (vazio para parar): 0.50
Preço (vazio para parar): 4.75
Preço (vazio para parar):
Total: R$ 5.25

Resumo

  • Aritméticos: + - * / // % **. / sempre dá float; // arredonda para baixo; ** é potência (não ^).
  • Comparação: == != < <= > >=, que podem ser encadeadas (1 < x < 5).
  • Lógicos: and, or, not; and/or devolvem um dos valores (nome or "anônimo").
  • is pergunta se é o mesmo objeto (use com None); in pergunta se está dentro (no dicionário, só nas chaves).
  • Bit a bit: & | ^ ~ << >>; com conjuntos, | & - ^ são união, interseção e diferenças.
  • Atribuição: = e as formas +=, -=…; o morsa := guarda e devolve um valor dentro de uma expressão.
  • @ é para matrizes em bibliotecas; nos tipos do Python dá TypeError.
  • Precedência: parênteses, **, sinal, * / // %, + -, bits, comparações, not, and, or, if/else, lambda, :=. Na dúvida, parênteses.