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.
- 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.
| Grupo | Operadores | Aula |
|---|---|---|
| Aritméticos | + - * / // % ** e o sinal -x | Operadores Aritméticos |
| Comparação | == != < <= > >= | Comparações |
| Lógicos | and or not | and, or e not |
| Identidade e pertinência | is, is not, in, not in | is 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ência | quem é feito primeiro | Precedência dos Operadores |
Aritméticos
| Operador | O que faz | Exemplo | Resultado | Aula |
|---|---|---|---|---|
+ | Soma | 7 + 2 | 9 | Operadores Aritméticos |
- | Subtração | 7 - 2 | 5 | |
* | Multiplicação | 7 * 2 | 14 | |
/ | Divisão: o resultado é sempre float, mesmo quando é exata | 7 / 28 / 2 | 3.54.0 | |
// | Divisão inteira: arredonda para baixo (para o menor inteiro) | 7 // 2-7 // 25.0 // 2 | 3-42.0 | |
% | Resto da divisão (o sinal segue o número da direita) | 7 % 2-7 % 37 % -3 | 12-2 | |
** | Potência | 7 ** 22 ** -12 ** 0.5 | 490.51.4142135623730951 | |
-x, +x | Sinal na frente de um valor (troca o sinal / deixa como está) | -(-5)+5 | 55 | |
/, //, % por zero | Dividir por zero é erro | 10 / 010 % 0 | ZeroDivisionError: division by zero(o mesmo) |
Com textos e listas
| Operador | O que faz | Exemplo | Resultado | Aula |
|---|---|---|---|---|
+ | 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úmero | Não junta tipos diferentes | "pão" + 5 | TypeError: can only concatenate str (not "int") to str | Conversão de Tipos |
% com texto | Formataçã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.
| Operador | Pergunta | Exemplo | Resultado | Aula |
|---|---|---|---|---|
== | É igual? (dois sinais de igual) | 2 == 2.0"a" == "A" | TrueFalse | Comparações |
!= | É diferente? | 2 != 3 | True | |
<, > | Menor? Maior? | 3 < 5 | True | |
<=, >= | Menor ou igual? Maior ou igual? | 5 <= 5 | True | |
| textos | Comparam letra por letra, pela ordem dos caracteres: maiúsculas vêm antes das minúsculas | "abacaxi" < "banana""Zebra" < "abacaxi" | TrueTrue | |
| listas | Comparam item por item | [1, 2] < [1, 3] | True | |
| em cadeia | a < b < c é o mesmo que a < b and b < c | 1 < 3 < 51 == 1.0 == True | TrueTrue | |
| tipos que não se comparam | Nú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úsculo | 0.1 + 0.2 == 0.3 | False | Números |
Lógicos
| Operador | O que faz | Exemplo | Resultado | Aula |
|---|---|---|---|---|
and | "E": verdadeiro só se os dois forem | True and False5 > 3 and 2 > 1 | FalseTrue | and, or e not |
or | "Ou": verdadeiro se pelo menos um for | True or False | True | |
not | "Não": inverte | not Truenot 0not "" | FalseTrueTrue | |
or com valores | Devolve 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 valores | Devolve o primeiro valor "falso" (ou o último, se todos forem verdadeiros) | 0 and 103 and 10 | 010 |
"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).
| Operador | Pergunta | Exemplo | Resultado | Aula |
|---|---|---|---|---|
is | É o mesmo objeto? (não só igual) | a is ba is ca == c | TrueFalseTrue | is e in |
is com None | O uso mais comum do is | x is None | True | O Valor None |
is not | Não é o mesmo objeto? | x is not None | False | |
| duas listas novas | Iguais, mas cada uma é um objeto | [1, 2] == [1, 2][1, 2] is [1, 2] | TrueFalse | Mutável × Imutável |
in | Está dentro? Num texto, procura um pedaço | "an" in "banana"3 in [1, 2, 3] | TrueTrue | is e in |
not in | Não está dentro? | 4 not in [1, 2, 3] | True | |
in num dicionário | Procura só nas chaves | "pão" in {"pão": 0.5}0.5 in {"pão": 0.5} | TrueFalse | 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.
| Operador | O que faz com os bits | Exemplo | Resultado |
|---|---|---|---|
& | "E": bit 1 só onde os dois têm 1 | 6 & 3bin(10 & 12) | 2'0b1000' |
| | "Ou": bit 1 onde pelo menos um tem 1 | 6 | 3bin(10 | 12) | 7'0b1110' |
^ | "Ou exclusivo": bit 1 onde só um dos dois tem 1 | 6 ^ 32 ^ 3 | 51 (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 << 35 << 1 | 810 |
>> | Empurra para a direita (divide por 2 a cada casa, arredondando para baixo) | 40 >> 25 >> 1 | 102 |
com True/False | Funciona (eles valem 1 e 0), mas prefira and/or | True & False | False |
Os mesmos símbolos com conjuntos e dicionários
| Operador | Com conjuntos | Exemplo | Resultado | Aula |
|---|---|---|---|---|
| | 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ários | Junta 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 que | Exemplo | x fica | Aula |
|---|---|---|---|---|
= | guarda o valor | x = 10 | 10 | Variáveis |
+= | x = x + 3 | x += 3 | 13 | Operadores de Atribuição |
-= | x = x - 3 | x -= 3 | 7 | |
*= | x = x * 3 | x *= 3 | 30 | |
/= | x = x / 4 | x /= 4 | 2.5 | |
//= | x = x // 3 | x //= 3 | 3 | |
%= | x = x % 3 | x %= 3 | 1 | |
**= | x = x ** 2 | x **= 2 | 100 |
Há uma forma com = para cada operador de bits também. Com outros tipos, a conta é a do tipo:
| Antes | Linha | Depois |
|---|---|---|
y = 6 | y &= 3 / y |= 3 / y ^= 3 | 2 / 7 / 5 |
y = 1 / y = 40 | y <<= 3 / y >>= 2 | 8 / 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.
| Escrita | Resultado | Por quê |
|---|---|---|
(n := 3 * 2) | 6 (e n fica valendo 6) | Guarda e devolve o valor |
n := 10 sozinho numa linha | SyntaxError: invalid syntax | Como 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
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
| Escrita | O que é | Exemplo | Resultado | Aula |
|---|---|---|---|---|
a if condição else b | Expressão condicional: escolhe um de dois valores | "par" if 7 % 2 == 0 else "ímpar" | 'ímpar' | if em uma Linha |
lambda | Função pequena, sem nome | (lambda x: x + 1)(4) | 5 | lambda |
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 x | Espera uma tarefa assíncrona (só dentro de async def) | — | — | asyncio |
*lista, **dicionario | Não são operadores de conta: espalham os itens numa chamada ou numa lista | print(*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ça | Operadores | Nome | Exemplo | Resultado |
|---|---|---|---|---|
| 1 (mais forte) | (…), […], {chave: valor…}, {…} | Parênteses; criar lista, dicionário, conjunto | (2 + 3) * 4 | 20 |
| 2 | x[i], x[i:j], x(…), x.atributo | Índice e fatia, chamada, atributo | len("pão") + 1 | 4 |
| 3 | await x | Espera assíncrona | — | — |
| 4 | ** | Potência (da direita para a esquerda) | 2 ** 3 ** 2(2 ** 3) ** 2 | 51264 |
| 5 | +x, -x, ~x | Sinal e inversão de bits | -2 ** 2(-2) ** 2 | -44 |
| 6 | *, @, /, //, % | Multiplicação, matriz, divisões, resto | 100 / 10 * 2 | 20.0 |
| 7 | +, - | Soma e subtração | 2 + 3 * 4 | 14 |
| 8 | <<, >> | Deslocamento de bits | 1 + 2 << 1 | 6 |
| 9 | & | "E" de bits | 1 | 6 & 3 | 3 |
| 10 | ^ | "Ou exclusivo" de bits | 6 | 3 ^ 1 | 6 |
| 11 | | | "Ou" de bits | 6 ^ 3 | 1 | 5 |
| 12 | in, not in, is, is not, <, <=, >, >=, !=, == | Comparações, pertinência e identidade (todas na mesma força, em cadeia) | 2 + 3 > 46 & 3 == 2 | TrueTrue |
| 13 | not x | "Não" | not 1 == 2 | True |
| 14 | and | "E" | True or False and False | True |
| 15 | or | "Ou" | (True or False) and False | False |
| 16 | if – else | Expressão condicional | "a" if True else "b" + "!"("a" if True else "b") + "!" | 'a''a!' |
| 17 | lambda | Funçã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
| Escrita | Resultado | Como o Python leu |
|---|---|---|
-2 ** 2 | -4 | -(2 ** 2): a potência vem antes do sinal |
2 ** 3 ** 2 | 512 | 2 ** (3 ** 2): a potência vai da direita para a esquerda |
nota1 + nota2 / 2 | com 8 e 6: 11.0 | nota1 + (nota2 / 2): para a média, (nota1 + nota2) / 2 |
not True == False | True | not (True == False): o not é mais fraco que a comparação |
True or False and False | True | True or (False and False): and antes de or |
"ab" in "abc" == True | False | in e == na mesma força, em cadeia: ("ab" in "abc") and ("abc" == True). Escreva só "ab" in "abc" (que dá True) |
6 & 3 == 2 | True | (6 & 3) == 2: em Python o & é mais forte que a comparação (no C e no JavaScript é o contrário) |
1 + 2 << 1 | 6 | (1 + 2) << 1: a soma vem antes do deslocamento |
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/ordevolvem um dos valores (nome or "anônimo"). ispergunta se é o mesmo objeto (use comNone);inpergunta 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.