Operadores em Python: aritmética, // e %, comparação, and/or/not e round em Python
O operador / em Python sempre devolve float, // — a parte inteira com arredondamento para baixo, % — o resto, ** — a potência. A função round(x, n) arredonda para n casas decimais pelo critério do banqueiro: round(2.5) dá 2, e round(3.5) dá 4; para arredondar para cima e para baixo até o inteiro usam-se math.ceil e math.floor, e o valor absoluto de um número é dado por abs.
Operadores em Python são sinais que transformam valores em novos valores: + soma, // faz divisão inteira, and combina condições. A seguir, a lista completa de operadores com exemplos, a diferença entre / e //, a lógica de and, or e not, além das funções de arredondamento: python round, math.ceil, math.floor e abs. Todos os exemplos podem ser colados no REPL para conferir.
Lista de operadores do Python
Os operadores se dividem em grupos conforme a finalidade. Não é preciso decorar a tabela inteira: no código real aparecem com mais frequência a aritmética, a comparação e as conectivas lógicas.
| Grupo | Operadores | Exemplo |
|---|---|---|
| Aritméticos | + - * / // % ** | 7 // 2 → 3 |
| Comparação | == != < > <= >= | 3 < 5 → True |
| Lógicos | and or not | not True → False |
| Identidade | is, is not | x is None |
| Pertinência | in, not in | "café" in "café com leite" → True |
| Atribuição | = += -= *= /= //= %= **= | total += 250 |
| Morsa | := | if (n := len(s)) > 10: |
| Bit a bit | & | ^ ~ << >> | 5 & 3 → 1 |
Operadores aritméticos
Soma, subtração e multiplicação funcionam como na escola. Se na expressão participa pelo menos um float, o resultado também será float: 2 + 1.0 dá 3.0. Inteiros em Python não estouram — 2 ** 100 é calculado com exatidão, qualquer que seja o número de dígitos.
>>> 250 + 120
370
>>> 12.5 * 3
37.5
>>> 2 ** 10
1024
>>> 2 ** 0.5
1.4142135623730951
Potência em Python: o operador **
A potenciação é feita com dois asteriscos, e não com ^: em Python o sinal ^ significa o "OU exclusivo" bit a bit, e 2 ^ 3 devolve 1, não 8. Expoente fracionário dá raiz: 9 ** 0.5 é 3.0. Existe também a função pow(x, y) — o mesmo resultado, além de um terceiro argumento para o resto: pow(2, 10, 1000) devolve 24.
Atenção à prioridade: ** é executado antes do menos unário, por isso -2 ** 2 é -4. Para o quadrado de um número negativo, use parênteses: (-2) ** 2.
Divisão em Python: /, // e %
Em Python há dois tipos de divisão, e essa é a principal fonte de surpresas para iniciantes. A divisão comum / sempre devolve float, mesmo quando a divisão é exata. A divisão inteira // descarta a parte fracionária, e % devolve o resto.
>>> 7 / 2
3.5
>>> 8 / 2
4.0
>>> 7 // 2
3
>>> 7 % 2
1
Divisão inteira // e resto %: na prática
O par // e % resolve problemas do tipo "quantos inteiros cabem e quanto sobra". No curso, o rastreador de despesas guarda o dinheiro em centavos, para não perder precisão, e separa o valor em reais e centavos:
cents = 125050 # guardamos o dinheiro em centavos
brl = cents // 100 # 1250 — reais inteiros
cent = cents % 100 # 50 — resto
print(brl, cent) # 1250 50
print(40 // 7, "semanas e", 40 % 7, "dias") # 5 semanas e 5 dias
As duas operações juntas são devolvidas pela função embutida divmod: divmod(125050, 100) dá a tupla (1250, 50). O resto também serve para checar paridade: n % 2 == 0 é verdadeiro para números pares.
Números negativos: // arredonda para baixo
O operador // não apenas descarta a fração: ele arredonda para baixo, em direção ao menos infinito. Para números positivos não há diferença, para negativos há. O sinal do resto % em Python coincide com o sinal do divisor, por isso vale sempre a igualdade a == (a // b) * b + a % b.
>>> -7 // 2
-4
>>> -7 % 2
1
>>> int(-7 / 2) # descarta a fração, sem arredondar para baixo
-3
Divisão por zero: qual erro aparece
Dividir por zero com qualquer um dos três operadores gera a exceção ZeroDivisionError. Isso vale tanto para inteiros quanto para decimais. Pode-se capturá-la com try/except ou verificar o divisor antecipadamente.
>>> 10 / 0
Traceback (most recent call last):
...
ZeroDivisionError: division by zero
>>> count = 0
>>> avg = 1500 / count if count else 0
>>> avg
0
Operadores de comparação
As comparações devolvem True ou False. A igualdade é verificada com dois sinais ==; um único = é atribuição. Strings são comparadas caractere a caractere pelos códigos dos símbolos, por isso "B" < "a" é verdadeiro: letras maiúsculas vêm antes das minúsculas.
>>> 250 == 250.0
True
>>> 3 != 4
True
>>> 1 < 5 <= 10 # encadeamento: 1 < 5 and 5 <= 10
True
>>> 0.1 + 0.2 == 0.3
False
Encadeamentos como 0 <= x < 100 são um recurso cômodo do Python: não é preciso escrever and. A última linha lembra o erro de precisão dos decimais: 0.1 + 0.2 dá 0.30000000000000004. Compare números decimais com math.isclose(a, b), e guarde dinheiro em centavos ou em Decimal.
Operadores lógicos and, or, not
Os operadores lógicos em Python são escritos como palavras, e não com os símbolos && e ||, como em outras linguagens. and é verdadeiro quando ambas as partes são verdadeiras, or — quando pelo menos uma é verdadeira, e not inverte o valor.
| a | b | a and b | a or b | not a |
|---|---|---|---|---|
| True | True | True | True | False |
| True | False | False | True | False |
| False | True | False | True | True |
| False | False | False | False | True |
Prioridade: primeiro not, depois and, depois or. A expressão True or False and False é True, porque o and é avaliado antes. Em condições complexas use parênteses — assim fica mais claro para você e para os colegas.
O que realmente devolvem and e or
and e or não devolvem necessariamente True ou False, mas um dos operandos. or entrega o primeiro valor verdadeiro (ou o último, se nenhum for verdadeiro), e and — o primeiro falso (ou o último). São considerados falsos 0, 0.0, a string vazia, coleções vazias, None e False.
>>> name = ""
>>> name or "Visitante"
'Visitante'
>>> 5 and 0
0
>>> not ""
True
A avaliação é preguiçosa: se o resultado já está claro pela parte esquerda, a direita não é calculada. Por isso count and total / count não falha com divisão por zero quando count == 0. O operador not, diferentemente dos outros dois, sempre devolve bool.
Operadores is e in
== compara valores, enquanto is verifica se dois nomes apontam para o mesmo objeto. Duas cestas vazias diferentes são iguais, mas não são o mesmo objeto. O único lugar onde o is é usado o tempo todo é a verificação de None: if x is None.
>>> a = [250, 120]
>>> b = [250, 120]
>>> a == b, a is b
(True, False)
>>> c = a
>>> c is a
True
Não compare números e strings com is: às vezes isso "funciona" por causa do cache interno de objetos, mas o resultado depende da implementação, e o Python emite SyntaxWarning para construções como x is 5.
O operador in verifica pertinência: substring em uma string, elemento em uma lista, chave em um dicionário. not in faz a verificação inversa.
>>> "café" in "café com leite"
True
>>> "alimentação" in {"alimentação": 450, "táxi": 300}
True
>>> 5 not in [1, 2, 3]
True
Operadores de atribuição e o operador morsa :=
Os operadores compostos +=, -=, *=, //= e outros são abreviações: total += 250 significa total = total + 250. Em Python não existem ++ e --: x++ provoca erro de sintaxe.
O operador morsa := (o nome vem da semelhança com os olhos e as presas de uma morsa) faz uma atribuição diretamente dentro de uma expressão. É útil quando o valor precisa ser verificado e usado depois:
items = ["café", "táxi", "almoço", "cinema"]
if (n := len(items)) > 3:
print(f"Gastos demais: {n}")
while (line := input("Valor: ")) != "":
print(int(line) * 2)
Sem o morsa, seria preciso chamar len duas vezes ou colocar a atribuição em uma linha separada. Abusar dele não vale a pena: se a linha ficou ilegível, uma atribuição comum é melhor.
Arredondamento em Python: round, ceil, floor
Para arredondar em Python existem a função embutida round e as funções do módulo math. Elas resolvem tarefas diferentes, e confundi-las é um erro comum.
| Função | O que faz | 2.5 | -2.5 | 2.7 |
|---|---|---|---|---|
round(x) | ao mais próximo, metade — para o par | 2 | -2 | 3 |
math.floor(x) | para baixo, em direção ao menos infinito | 2 | -3 | 2 |
math.ceil(x) | para cima, em direção ao mais infinito | 3 | -2 | 3 |
math.trunc(x), int(x) | descartar a fração, em direção a zero | 2 | -2 | 2 |
A função round em Python e o arredondamento do banqueiro
A função round(x, n) arredonda para n casas após a vírgula; sem o segundo argumento devolve um int. A principal armadilha: o python round arredonda "pelo critério do banqueiro" — metade vai para o par mais próximo. Por isso round(2.5) dá 2, e round(3.5) dá 4. Assim, os erros de arredondamento não se acumulam em uma só direção em cálculos grandes.
>>> round(2.5), round(3.5)
(2, 4)
>>> round(3.14159, 2)
3.14
>>> round(1250, -2) # até as centenas
1200
>>> round(2.675, 2) # não 2.68: em binário isso é 2.67499...
2.67
Se você precisa do arredondamento escolar "metade para cima", por exemplo em um recibo, use Decimal com o modo ROUND_HALF_UP. Passe o número como string, para não herdar o erro do float:
>>> from decimal import Decimal, ROUND_HALF_UP
>>> Decimal("2.5").quantize(Decimal("1"), ROUND_HALF_UP)
Decimal('3')
>>> Decimal("2.675").quantize(Decimal("0.01"), ROUND_HALF_UP)
Decimal('2.68')
E mais uma regra do curso: arredonde apenas na hora de exibir. Para uma impressão bonita, round não é necessário — basta uma f-string: f"{amount:.2f}" mostra duas casas, e o próprio número continua exato.
math.ceil e math.floor: arredondamento para cima e para baixo
math.ceil é necessário quando "faltar" é inaceitável: quantos ônibus alugar, quantas páginas de resultados existem. math.floor serve quando só contam as unidades completas. Ambas as funções devolvem int.
import math
guests = 47
seats = 20
print(math.ceil(guests / seats)) # 3 ônibus
print(math.floor(9.99)) # 9
print(-(-guests // seats)) # 3 — ceil sem math, truque com //
No módulo math há outras funções úteis: math.sqrt (raiz), math.isclose (comparação de decimais), math.pi, math.gcd. No Python 3.15 surgiu o submódulo math.integer (PEP 791) para matemática inteira: nele estão comb, factorial, gcd, isqrt, lcm, perm, e as antigas math.gcd e outras continuam funcionando.
Função abs: valor absoluto de um número
abs(x) devolve o módulo — a distância até zero sem sinal. Não é preciso importar nada, a função é embutida. Funciona com inteiros, decimais e até complexos: para 3+4j devolve o comprimento do vetor, 5.0.
>>> abs(-250)
250
>>> abs(-12.5)
12.5
>>> budget, spent = 5000, 5320
>>> abs(budget - spent) # em quanto saímos do previsto
320
O uso típico é a diferença sem levar em conta o sentido e a comparação com tolerância: abs(a - b) < 0.001. Para decimais é mais seguro usar math.isclose, pois ela leva em conta a escala dos números.
Prioridade dos operadores
Quando há vários operadores em uma expressão, o Python os executa por prioridade — da mais alta para a mais baixa:
**- unários
-x,+x,~x * / // %+ -- deslocamentos e operações bit a bit
- comparações,
in,is notandor:=
Assim, 2 + 3 * 4 é 14, enquanto (2 + 3) * 4 é 20. Na dúvida, use parênteses: parênteses extras não custam nada, mas um erro de prioridade demora para ser encontrado.
Erros comuns com operadores
| Erro | O que acontece | Como certo |
|---|---|---|
if x = 5: | SyntaxError: isto é atribuição | if x == 5: |
2 ^ 3 no lugar da potência | XOR bit a bit, resultado 1 | 2 ** 3 |
esperar inteiro de 8 / 2 | obtém 4.0 | 8 // 2 |
x == 1 or 2 | sempre verdadeiro: or 2 | x in (1, 2) |
esperar 3 de round(2.5) | o arredondamento do banqueiro dá 2 | Decimal com ROUND_HALF_UP |
"5" + 5 | TypeError | int("5") + 5 |
Resumo
Lembre o principal: / sempre dá float, // arredonda para baixo, % devolve o resto com o sinal do divisor, e a potência é **. Os lógicos and, or, not são escritos como palavras e avaliados de forma preguiçosa, e is serve para verificar None. A função python round arredonda para o par mais próximo; para arredondar para cima e para baixo existem math.ceil e math.floor, e o módulo de um número é dado por abs. No curso esses operadores são praticados no rastreador de despesas, onde o dinheiro é guardado em centavos.
Perguntas frequentes
Como arredondar um número em Python para duas casas decimais?
Use round(x, 2); se a intenção for apenas exibir o número de forma bonita, use a f-string f"{x:.2f}", que não altera o valor em si.
Por que round(0.5) em Python devolve 0?
Porque o round arredonda a metade para o número par mais próximo, e 0 é par; da mesma forma round(1.5) e round(2.5) dão 2.
Como obter a parte inteira de uma divisão em Python?
Com o operador //: 17 // 5 devolve 3. Com números negativos ele arredonda para baixo, por isso -17 // 5 dá -4; para descartar a fração em direção a zero, use int(-17 / 5).
Existe operador ternário em Python?
Sim, é a expressão condicional: valor_se_verdadeiro if condição else valor_se_falso, por exemplo "par" if n % 2 == 0 else "ímpar".
Qual é a diferença entre & e and em Python?
and é um operador lógico com avaliação preguiçosa, enquanto & é o E bit a bit para números e a interseção para conjuntos; em condições if use and.
Este tema é abordado em profundidade, com prática, no curso “Python 3.15: от новичка до профи”.
Ir para o curso