Variáveis e tipos básicos
por Sutton AshfordEntenda o conceito
Uma variável em Python é um nome que aponta para um valor. Você a cria na primeira atribuição, com =: preco = 3.75. Não existe declaração de tipo; o Python descobre o tipo pelo valor, e a mesma variável pode apontar depois para um valor de outro tipo (isso é a tipagem dinâmica).
Os quatro tipos básicos são int (inteiros, como 7), float (números com casas decimais, como 8.5), str (textos entre aspas, como "Marina") e bool (True ou False). Há ainda o None, que representa a ausência de valor. A função type() mostra o tipo de qualquer valor.
O Python não mistura tipos sozinho: "24" + 1 dá erro. Para trocar de tipo, use as funções de conversão int(), float(), str() e bool(). Por fim, as f-strings (f"Total: {total}") colocam o valor das variáveis dentro de um texto de forma legível.
nome = valorcria ou reatribui uma variável; os nomes seguem osnake_casee constantes vão em MAIÚSCULAS.- Tipos básicos:
int,float,strebool;Noneindica ausência de valor etype()revela o tipo. /sempre devolvefloat;//dá o quociente inteiro e%o resto da divisão.- Conversões são explícitas:
int("24"),float("3.75"),str(24);int(3.75)corta as casas, não arredonda. - Atribuição múltipla (
a, b = 1, 2) também troca valores:a, b = b, a.
Do conceito à prática
3 exemplos para ver a ideia funcionando.
01Boletim com os quatro tipos básicos
# boletim.py: variáveis guardam valores com um nome.
# Uma atribuição usa = : o nome à esquerda passa a apontar para o valor.
aluna = "Marina Costa" # str: texto
serie = 7 # int: número inteiro
nota_prova = 8.5 # float: número com casas decimais
entregou_trabalho = True # bool: True ou False
print("Aluna:", aluna)
print("Série:", serie)
print("Nota da prova:", nota_prova)
print("Entregou o trabalho?", entregou_trabalho)
print()
# type() mostra o tipo do valor para onde a variável aponta.
print(type(aluna))
print(type(serie))
print(type(nota_prova))
print(type(entregou_trabalho))
print()
# Operações também geram valores com tipo: int + float dá float.
nota_final = nota_prova + 1
print("Nota com o ponto extra:", nota_final, type(nota_final))
Cada linha com = cria uma variável que aponta para um valor. Não foi preciso dizer que serie é inteiro ou que aluna é texto: o Python deduz o tipo pelo valor, e type() confirma isso mostrando <class 'int'>, <class 'str'> e assim por diante.
Na última parte, somar um float com um int gera um float. Quando os tipos numéricos se misturam numa conta, o resultado fica no tipo mais "largo", para não perder as casas decimais.
02Convertendo os dados do estoque
# estoque.py: converter textos em números e números em texto.
# Dados lidos de uma planilha chegam sempre como texto (str).
quantidade_txt = "24"
preco_txt = "3.75"
# "24" + "24" junta textos; não soma números.
print("Juntando textos:", quantidade_txt + quantidade_txt)
# int() e float() convertem o texto para número.
quantidade = int(quantidade_txt)
preco = float(preco_txt)
print("Somando números:", quantidade + quantidade)
valor_estoque = quantidade * preco
print("Valor em estoque:", valor_estoque)
# str() faz o caminho inverso: número vira texto e pode ser concatenado.
etiqueta = "Lote com " + str(quantidade) + " unidades"
print(etiqueta)
# int() de um float corta as casas decimais (não arredonda).
print("int(3.75) =", int(preco))
print("round(3.75, 1) =", round(preco, 1))
# bool(): zero e texto vazio são False; o resto é True.
print("Tem estoque?", bool(quantidade))
print("bool(0) =", bool(0))
print("bool('') =", bool(""))
Valores lidos de arquivos, planilhas ou do teclado chegam como texto. Somar dois textos os concatena ("2424"), por isso o exemplo converte com int() e float() antes de calcular, e usa str() para colocar um número dentro de um texto montado com +.
Repare em dois detalhes: int(3.75) dá 3, porque descarta as casas decimais, enquanto round() arredonda; e bool() considera falsos o zero e o texto vazio, o que é útil para perguntar "tem alguma coisa aqui?".
03Inventário do herói com reatribuição e f-strings
# inventario.py: reatribuição, atribuição múltipla e f-strings.
MOEDAS_POR_POCAO = 15 # constante: nome em maiúsculas, por convenção
# Atribuição múltipla: cada nome recebe o valor na mesma posição.
heroi, nivel, moedas = "Lia", 3, 100
# Reatribuir é só usar = de novo; o valor antigo é descartado.
moedas = moedas - 2 * MOEDAS_POR_POCAO
nivel += 1 # atalho para nivel = nivel + 1
# Divisão com / sempre dá float; // dá o quociente inteiro e % o resto.
pocoes = moedas // MOEDAS_POR_POCAO
troco = moedas % MOEDAS_POR_POCAO
media = moedas / 4
# f-string: o valor de cada {variável} entra no texto.
print(f"{heroi} subiu para o nível {nivel}.")
print(f"Moedas: {moedas}")
print(f"Dá para comprar {pocoes} poções e sobram {troco} moedas.")
print(f"Divisão entre 4 aliados: {media} moedas para cada um.")
# Trocar o conteúdo de duas variáveis sem variável auxiliar.
arma, escudo = "espada", "broquel"
arma, escudo = escudo, arma
print(f"Mão direita: {arma} | mão esquerda: {escudo}")
# A mesma variável pode apontar para outro tipo (tipagem dinâmica).
bonus = None # None: ainda sem valor
print(f"Bônus antes: {bonus}")
bonus = 2.5
print(f"Bônus depois: {bonus} ({type(bonus).__name__})")
O exemplo junta as ferramentas do dia a dia: atribuição múltipla para criar três variáveis numa linha, reatribuição (moedas = moedas - ... e nivel += 1) e os três operadores de divisão. Com / o resultado é sempre float (17.5); com // e % você obtém quantas poções cabem e quanto sobra.
As f-strings deixam a saída legível sem converter nada com str(). No fim, arma, escudo = escudo, arma troca os valores, e bonus passa de None para float, mostrando a tipagem dinâmica na prática.
Agora é com você
Tente resolver no rascunho antes de abrir a resposta. Os códigos não são executados nesta página.
01Média do boletimFácil
Guarde o nome de um aluno e suas três notas em variáveis, calcule a média e indique se ele foi aprovado (média maior ou igual a 7). Mostre tudo como na saída esperada.
- O nome fica numa variável
stre cada nota numa variávelfloatprópria. - A média é calculada a partir das variáveis das notas, não digitada pronta.
- A variável
aprovadorecebe o resultado da comparaçãomedia >= 7(umbool). - A saída tem exatamente 4 linhas.
# media.py: boletim de um aluno com variáveis.
nome = "Rafael Lima"
nota1 = 7.5
# crie nota2 (6.0) e nota3 (9.0), calcule a média e o aprovado
Aluno: Rafael Lima
Notas: 7.5 6.0 9.0
Média: 7.5
Aprovado: True
Ver dica
A divisão tem prioridade sobre a soma: decida o que precisa ser calculado primeiro e use parênteses.
Ver resposta
# media.py: boletim de um aluno com variáveis.
nome = "Rafael Lima"
nota1 = 7.5
nota2 = 6.0
nota3 = 9.0
media = (nota1 + nota2 + nota3) / 3 # parênteses: soma antes de dividir
aprovado = media >= 7 # a comparação gera um bool
print("Aluno:", nome)
print("Notas:", nota1, nota2, nota3)
print("Média:", media)
print("Aprovado:", aprovado)
Passo a passo
nome = "Rafael Lima"cria uma variável do tipostr; as aspas indicam que o valor é texto.- As três notas são escritas com ponto decimal (
6.0, e não6,0), o que as tornafloat. (nota1 + nota2 + nota3) / 3soma primeiro por causa dos parênteses e depois divide; como/devolvefloat, a média é7.5.aprovado = media >= 7guarda o resultado da comparação, que éTrueouFalse; não é preciso nenhumif.- Os
print()com vírgula colocam um espaço entre o rótulo e o valor e convertem números e booleanos para texto sozinhos. - Em
print("Notas:", nota1, nota2, nota3),6.0aparece com a casa decimal, porque é umfloat.
Por que funciona
Cada variável dá um nome a um valor, e as contas usam esses nomes em vez dos números soltos. Se a nota mudar, basta mudar uma linha e a média e a aprovação acompanham.
O tipo de cada resultado vem do valor: notas float geram média float, e uma comparação gera um bool. É a tipagem dinâmica do Python trabalhando sem nenhuma declaração.
Erros comuns
media = nota1 + nota2 + nota3 / 3: sem parênteses sónota3é dividida, e a média vira16.5. Coloque a soma entre parênteses.nota2 = 6,0: a vírgula cria uma tupla(6, 0)e a soma dáTypeError. Use ponto como separador decimal.aprovado = "media >= 7": entre aspas é só um texto, sempre impresso igual. Tire as aspas para o Python avaliar a comparação.print("Média: " + media): dáTypeError, porque+não juntastrcomfloat. Use a vírgula oustr(media).
Outra forma de resolver
Com f-strings, cada linha fica num texto só: print(f"Média: {media}"). É a forma preferida quando a linha mistura vários valores ou precisa de formatação, como {media:.1f} para fixar uma casa decimal.
Saída esperada
Aluno: Rafael Lima
Notas: 7.5 6.0 9.0
Média: 7.5
Aprovado: True
02Total de um pedido vindo como textoMédio
Os dados de um pedido da papelaria chegam como textos: quantidade "3", preço "12.90" e desconto do cupom "5". Converta cada um para o tipo numérico certo, calcule subtotal e total e mostre os valores com duas casas decimais.
- A quantidade e o cupom são convertidos com
int()e o preço comfloat(). - Os valores em reais são exibidos com f-string e o formato
:.2f. - A última linha é montada com concatenação (
+) estr(). - Os textos originais (
"3","12.90","5") ficam em variáveis próprias antes da conversão.
# pedido.py: dados de um pedido chegam como texto.
produto = "Caderno"
quantidade_txt = "3"
preco_txt = "12.90"
cupom_txt = "5"
# converta, calcule e mostre o resultado
3x Caderno a R$ 12.90
Subtotal: R$ 38.70
Cupom: R$ 5.00
Total: R$ 33.70
Resumo: 3 itens
Ver dica
Multiplicar um texto por um inteiro repete o texto em vez de calcular: converta antes de fazer qualquer conta.
Ver resposta
# pedido.py: dados de um pedido chegam como texto.
produto = "Caderno"
quantidade_txt = "3"
preco_txt = "12.90"
cupom_txt = "5"
# converte cada texto para o tipo certo antes de calcular
quantidade = int(quantidade_txt)
preco = float(preco_txt)
cupom = int(cupom_txt)
subtotal = quantidade * preco
total = subtotal - cupom
print(f"{quantidade}x {produto} a R$ {preco:.2f}")
print(f"Subtotal: R$ {subtotal:.2f}")
print(f"Cupom: R$ {cupom:.2f}")
print(f"Total: R$ {total:.2f}")
print("Resumo: " + str(quantidade) + " itens")
Passo a passo
- As quatro primeiras variáveis guardam os dados como chegaram, todos
str; o sufixo_txtlembra que ainda não são números. int(quantidade_txt)eint(cupom_txt)transformam"3"e"5"em inteiros, porque são contagens e valores sem centavos.float(preco_txt)transforma"12.90"em12.9, já que o preço tem casas decimais.subtotal = quantidade * precomultiplicaintporfloate o resultado éfloat;totaldesconta o cupom.- Nas f-strings,
{preco:.2f}formata o número com exatamente duas casas, devolvendo o zero final que ofloatnão guarda. - A última linha usa
str(quantidade)porque+só concatena texto com texto.
Por que funciona
O Python não converte tipos por conta própria: "3" * "12.90" dá erro, e "3" * 2 repete o texto. Ao converter cada dado com int() ou float(), as operações passam a ser aritméticas e o resultado sai certo.
A conversão também vale no caminho inverso: para exibir, a f-string formata o número, e str() permite juntá-lo a outros textos com +.
Erros comuns
subtotal = quantidade_txt * preco: dáTypeError(não dá para multiplicar texto porfloat). Use as variáveis já convertidas.int(preco_txt): dáValueError, porque"12.90"tem ponto decimal. Usefloat()para preços.print(f"Total: R$ {total}")sem:.2f: aparece33.7, com uma casa só, e em outras contas surgem resíduos como0.1 + 0.2dando0.30000000000000004. Formate com:.2f."Resumo: " + quantidade + " itens": dáTypeError. Envolva o número comstr().
Outra forma de resolver
Dá para converter na própria leitura, sem as variáveis _txt: quantidade = int("3"). Fica mais curto quando o texto é usado uma única vez; manter o texto original separado ajuda quando você precisa validá-lo ou mostrá-lo numa mensagem de erro.
Saída esperada
3x Caderno a R$ 12.90
Subtotal: R$ 38.70
Cupom: R$ 5.00
Total: R$ 33.70
Resumo: 3 itens
03Divisão do tesouro da partidaDesafio
Ao fim de uma partida, 158 moedas são divididas igualmente entre 4 jogadores; a sobra vai para o líder, Davi. Calcule a parte de cada um, a sobra e a média exata, troque a ordem dos dois primeiros da fila e registre o novo recorde, partindo de None.
- O total e o número de jogadores são constantes em MAIÚSCULAS; quociente e resto são obtidos com
//e%numa única atribuição múltipla. - A média exata usa
/e aparece comofloat(39.5). - As moedas do líder começam com a parte de um jogador e recebem a sobra com
+=. - A ordem da fila é trocada com
a, b = b, a, erecordecomeça emNonee depois recebe umint.
# tesouro.py: divisão do tesouro de uma partida.
TOTAL_MOEDAS = 158
JOGADORES = 4
# calcule por_jogador, sobra e media
Cada jogador recebe 39 moedas.
Sobram 2 moedas no baú.
Média exata: 39.5
Davi (líder) fica com 41 moedas.
Ordem da próxima rodada: Elisa, Davi
Recorde anterior: None
Novo recorde: 41
Ver dica
// responde "quantas vezes cabe" e % responde "quanto sobra"; os dois podem ser calculados na mesma linha, um para cada variável.
Ver resposta
# tesouro.py: divisão do tesouro de uma partida.
TOTAL_MOEDAS = 158
JOGADORES = 4
# atribuição múltipla: quociente e resto de uma vez
por_jogador, sobra = TOTAL_MOEDAS // JOGADORES, TOTAL_MOEDAS % JOGADORES
media = TOTAL_MOEDAS / JOGADORES # / sempre devolve float
print(f"Cada jogador recebe {por_jogador} moedas.")
print(f"Sobram {sobra} moedas no baú.")
print(f"Média exata: {media}")
# o líder fica com a sobra: reatribuição com +=
lider = "Davi"
moedas_lider = por_jogador
moedas_lider += sobra
print(f"{lider} (líder) fica com {moedas_lider} moedas.")
# troca de posições na fila sem variável auxiliar
primeiro, segundo = "Davi", "Elisa"
primeiro, segundo = segundo, primeiro
print(f"Ordem da próxima rodada: {primeiro}, {segundo}")
# a variável muda de tipo: de None para int
recorde = None
print(f"Recorde anterior: {recorde}")
recorde = moedas_lider
print(f"Novo recorde: {recorde}")
Passo a passo
TOTAL_MOEDASeJOGADORESestão em maiúsculas para avisar que são constantes: o Python não impede a mudança, mas a convenção comunica a intenção.por_jogador, sobra = TOTAL_MOEDAS // JOGADORES, TOTAL_MOEDAS % JOGADOREScalcula os dois valores à direita e os entrega, na ordem, às duas variáveis à esquerda.158 // 4dá39e158 % 4dá2, ambosint; já158 / 4dá39.5, porque/sempre devolvefloat.moedas_lider = por_jogadorcopia o valor 39 emoedas_lider += sobrareatribui a variável com a soma, chegando a 41.primeiro, segundo = segundo, primeiromonta primeiro os valores da direita e só depois os atribui, por isso a troca não perde nenhum deles.recorde = Nonemarca que ainda não existe recorde; depois a mesma variável passa a apontar para umint.- As f-strings inserem cada variável no texto sem precisar de
str();Noneaparece como a palavraNone.
Por que funciona
Todas as contas partem de variáveis com nomes que explicam o papel de cada valor, e o tipo de cada resultado é definido pela operação: // e % entre inteiros dão int, / dá float. Por isso a parte de cada jogador sai inteira e a média sai exata.
A atribuição múltipla avalia todo o lado direito antes de atribuir, o que permite calcular quociente e resto juntos e trocar valores sem variável auxiliar. E como os nomes não têm tipo fixo, recorde pode começar em None e receber um número depois.
Erros comuns
por_jogador = TOTAL_MOEDAS / JOGADORES: o resultado é39.5, e ninguém recebe meia moeda. Use//para a parte inteira.primeiro = segundoseguido desegundo = primeiro: os dois ficam com"Elisa", porque o valor original deprimeirose perdeu. Faça a troca numa linha só.moedas_lider =+ sobra: não dá erro, mas atribui+2(o número positivo 2) em vez de somar. O operador é+=.por_jogador, sobra = TOTAL_MOEDAS // JOGADORES: dáTypeError, porque à direita há um só valor para dois nomes. Calcule os dois.
Outra forma de resolver
A função embutida divmod(TOTAL_MOEDAS, JOGADORES) devolve quociente e resto juntos: por_jogador, sobra = divmod(TOTAL_MOEDAS, JOGADORES). É a forma mais idiomática quando você precisa dos dois valores; separar // e % deixa explícito o papel de cada operador, o que ajuda quem está aprendendo.
Saída esperada
Cada jogador recebe 39 moedas.
Sobram 2 moedas no baú.
Média exata: 39.5
Davi (líder) fica com 41 moedas.
Ordem da próxima rodada: Elisa, Davi
Recorde anterior: None
Novo recorde: 41