Números e aritmética
Números aparecem em praticamente todo programa que você escreve. Um carrinho de compras soma um preço. Um jogo atualiza uma pontuação. Um script conta quantas vezes algo aconteceu. O Python oferece operadores aritméticos que funcionam como a matemática do papel, além de alguns outros que vale a pena conhecer desde o início.
Os operadores
Os quatro operadores da matemática (+, -, *, /) funcionam exatamente como você esperaria. O Python adiciona três outros que você usará constantemente: divisão inteira, resto e exponenciação.
price = 12.99
quantity = 3
print(price * quantity) # 38.97
print(price + 2) # 14.99
print(price - 1.00) # 11.99| Operador | Nome | Exemplo | Resultado |
|---|---|---|---|
+ | Adição | 5 + 3 | 8 |
- | Subtração | 5 - 3 | 2 |
* | Multiplicação | 5 * 3 | 15 |
/ | Divisão | 5 / 3 | 1.6666... |
// | Divisão inteira | 5 // 3 | 1 |
% | Resto | 5 % 3 | 2 |
** | Exponenciação | 5 ** 3 | 125 |
+, -, *, / funcionam como a matemática do papel. Os três extras vale a pena aprender desde já: // divide até chegar a um número inteiro, % te entrega o resto, e ** eleva a uma potência. Eu uso % muito mais do que imaginava que usaria. Divisão: / vs //
/ sempre entrega o resultado decimal exato, mesmo que a resposta seja um número inteiro. // descarta a parte fracionária e arredonda para o infinito negativo. Para números positivos isso significa cortar a parte decimal, mas para negativos isso vai um passo além, se afastando do zero:
10 / 2 # 5.0 (sempre float, mesmo quando a divisão é exata)
10 / 3 # 3.3333333333333335
10 // 3 # 3
7 // 2 # 3
-7 // 2 # -4 (arredonda para o infinito negativo, não para zero)Na maior parte do tempo você vai usar // com números positivos. Guarde o comportamento com negativos na memória para quando eles aparecerem.
/ sempre devolve um decimal, mesmo quando a divisão é exata: 4 / 2 é 2.0. // descarta a parte fracionária, mas cuidado com os negativos: -7 // 2 é -4, não -3, porque ele arredonda para baixo em vez de cortar. Isso me pegou na primeira vez que usei. O operador de resto %
% te dá o que sobra depois de uma divisão inteira. Se 10 // 3 é 3 (porque 3 cabe em 10 três vezes), então 10 % 3 é 1 (porque 3 × 3 = 9, e 10 - 9 = 1). O uso mais comum é verificar se um número é par ou ímpar.
10 % 3 # 1
10 % 2 # 0 (divide exatamente)
10 % 7 # 3
6 % 2 # 0 (par)
7 % 2 # 1 (ímpar)% é o que sobra depois de uma divisão inteira. 10 % 3 é 1 porque 3 cabe em 10 três vezes, com 1 de sobra. Na maioria das vezes você vai encontrá-lo na verificação de par/ímpar: n % 2 é 0 para par, 1 para ímpar. Exponenciação **
** eleva um número a uma potência. Use dois asteriscos, não o símbolo ^ (que significa outra coisa no Python):
2 ** 10 # 1024
3 ** 3 # 27
9 ** 0.5 # 3.0 (raiz quadrada: elevar à potência 0.5)** eleva um número a uma potência, então 2 ** 10 é 1024. Uma potência fracionária te dá uma raiz: 9 ** 0.5 é 3.0. A única armadilha é o símbolo: use **, não ^, que faz algo totalmente diferente no Python. Precedência de operadores
O Python segue a ordem matemática padrão: exponenciação primeiro, depois multiplicação e divisão, depois adição e subtração. Quando estiver em dúvida, use parênteses. Eles deixam a intenção clara e não custam nada:
2 + 3 * 4 # 14, não 20
2 ** 3 + 1 # 9, não 512
10 - 4 / 2 # 8.0, não 3.0
(2 + 3) * 4 # 20
10 / (2 + 3) # 2.0Como int e float interagem
O Python tem uma regra consistente: / sempre retorna um decimal, até 4 / 2 dá 2.0. Qualquer operação que misture um número inteiro e um decimal também resulta em um decimal. Quando você precisar de um número inteiro, use // ou converta com int().
4 / 2 # 2.0 (float, sempre)
4 // 2 # 2 (int)
4 + 2 # 6 (int)
4 + 2.0 # 6.0 (float)
4 * 0.5 # 2.0 (float)/ sempre dá um decimal, então 4 / 2 é 2.0, não 2. Misture um número inteiro com um decimal em qualquer operação e você recebe um decimal de volta. Quando precisar de um número inteiro, use // ou coloque em int(). Precisão de float
Existe uma pegadinha que surpreende quase todo mundo em algum momento:
0.1 + 0.2 # 0.30000000000000004Esse errinho não é um bug do Python. Computadores armazenam números decimais em binário, e alguns valores como 0.1 não podem ser representados de forma exata. É parecido com o fato de 1/3 não poder ser escrito de forma exata em decimal. Para a maioria dos cálculos do dia a dia isso não importa. Para exibir valores monetários, round() ou o especificador de formato :.2f mantêm a saída organizada.
0.1 não têm forma binária exata, então 0.1 + 0.2 resulta em 0.30000000000000004. Não é um bug do Python, toda linguagem faz isso. Para a saída do dia a dia, round() ou :.2f mantêm tudo organizado. Literais numéricos legíveis
O Python permite colocar sublinhados em literais numéricos para tornar números grandes mais legíveis. O Python os ignora completamente; eles existem para você:
population = 8_100_000_000
distance_km = 384_400
pi_approx = 3.141_592_6538_100_000_000 é o mesmo valor que 8100000000. O Python os ignora completamente, eles existem para os seus olhos, não para o interpretador. Funções embutidas úteis
abs()
abs() retorna o valor absoluto: sempre positivo, independentemente do sinal da entrada. Use-a quando o que importa é a distância de um número até zero, não a direção.
abs(-5) # 5
abs(3.7) # 3.7
abs(-0.5) # 0.5abs() tira o sinal e devolve o tamanho positivo: abs(-5) é 5, abs(3.7) é 3.7. Use quando o que importa é a distância de um número até zero, não para qual lado ele se inclina. round()
round() arredonda para o número inteiro mais próximo por padrão. Passe um segundo argumento para manter uma quantidade específica de casas decimais:
round(3.7) # 4
round(3.2) # 3
round(3.14159, 2) # 3.14Uma coisa que vale saber: round(2.5) dá 2, não 3. O Python arredonda para o número par mais próximo quando um valor está exatamente na metade entre duas opções.
round(x) vai para o número inteiro mais próximo, round(x, n) mantém n casas decimais. A surpresa: um valor exatamente na metade arredonda para o número par mais próximo, então round(2.5) é 2, não 3. divmod()
divmod() te dá o quociente e o resto em uma única chamada. Ela retorna um par de valores, uma tupla (abordada no capítulo Tuplas e conjuntos), que você pode atribuir a dois nomes ao mesmo tempo:
divmod(10, 3) # (3, 1): quociente 3, resto 1
divmod(7, 2) # (3, 1)
divmod(9, 3) # (3, 0)
quotient, remainder = divmod(10, 3)
print(quotient) # 3
print(remainder) # 1divmod(a, b) devolve o quociente e o resto juntos: divmod(10, 3) é (3, 1). Você pode desempacotar os dois de uma vez com quotient, remainder = divmod(10, 3). Na prática
Uma calculadora de gorjeta:
bill = 45.50
tip_rate = 0.18
tip = round(bill * tip_rate, 2)
total = round(bill + tip, 2)
print(f"Bill: ${bill}")
print(f"Tip: ${tip}")
print(f"Total: ${total}")round() mantém a saída parecendo dinheiro, em vez de uma longa sequência de casas decimais.

