Sua dose diária de programação

Conceito, 3 exemplos e 3 exercícios: uma pequena conquista de cada vez.

✦   Lição

Variáveis e tipos básicos

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).

Python Fundamentos Iniciante 3 exemplos + 3 exercícios
42 lições publicadas 10 linguagens novas lições todo dia útil
Python / Fundamentos

Variáveis e tipos básicos

por Sutton Ashford
Iniciante

Entenda 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.

↳ Pontos-chave
  • nome = valor cria ou reatribui uma variável; os nomes seguem o snake_case e constantes vão em MAIÚSCULAS.
  • Tipos básicos: int, float, str e bool; None indica ausência de valor e type() revela o tipo.
  • / sempre devolve float; // 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
# 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
# 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
# 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.

↳ Requisitos
  • O nome fica numa variável str e cada nota numa variável float própria.
  • A média é calculada a partir das variáveis das notas, não digitada pronta.
  • A variável aprovado recebe o resultado da comparação media >= 7 (um bool).
  • A saída tem exatamente 4 linhas.
código inicial
# 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
saída esperada
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

  1. nome = "Rafael Lima" cria uma variável do tipo str; as aspas indicam que o valor é texto.
  2. As três notas são escritas com ponto decimal (6.0, e não 6,0), o que as torna float.
  3. (nota1 + nota2 + nota3) / 3 soma primeiro por causa dos parênteses e depois divide; como / devolve float, a média é 7.5.
  4. aprovado = media >= 7 guarda o resultado da comparação, que é True ou False; não é preciso nenhum if.
  5. 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.
  6. Em print("Notas:", nota1, nota2, nota3), 6.0 aparece com a casa decimal, porque é um float.

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 vira 16.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 junta str com float. Use a vírgula ou str(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.

↳ Requisitos
  • A quantidade e o cupom são convertidos com int() e o preço com float().
  • Os valores em reais são exibidos com f-string e o formato :.2f.
  • A última linha é montada com concatenação (+) e str().
  • Os textos originais ("3", "12.90", "5") ficam em variáveis próprias antes da conversão.
código inicial
# 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
saída esperada
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

  1. As quatro primeiras variáveis guardam os dados como chegaram, todos str; o sufixo _txt lembra que ainda não são números.
  2. int(quantidade_txt) e int(cupom_txt) transformam "3" e "5" em inteiros, porque são contagens e valores sem centavos.
  3. float(preco_txt) transforma "12.90" em 12.9, já que o preço tem casas decimais.
  4. subtotal = quantidade * preco multiplica int por float e o resultado é float; total desconta o cupom.
  5. Nas f-strings, {preco:.2f} formata o número com exatamente duas casas, devolvendo o zero final que o float não guarda.
  6. 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 por float). Use as variáveis já convertidas.
  • int(preco_txt): dá ValueError, porque "12.90" tem ponto decimal. Use float() para preços.
  • print(f"Total: R$ {total}") sem :.2f: aparece 33.7, com uma casa só, e em outras contas surgem resíduos como 0.1 + 0.2 dando 0.30000000000000004. Formate com :.2f.
  • "Resumo: " + quantidade + " itens": dá TypeError. Envolva o número com str().

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.

↳ Requisitos
  • 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 como float (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, e recorde começa em None e depois recebe um int.
código inicial
# tesouro.py: divisão do tesouro de uma partida.
TOTAL_MOEDAS = 158
JOGADORES = 4

# calcule por_jogador, sobra e media
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
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

  1. TOTAL_MOEDAS e JOGADORES estã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.
  2. por_jogador, sobra = TOTAL_MOEDAS // JOGADORES, TOTAL_MOEDAS % JOGADORES calcula os dois valores à direita e os entrega, na ordem, às duas variáveis à esquerda.
  3. 158 // 4 dá 39 e 158 % 4 dá 2, ambos int; já 158 / 4 dá 39.5, porque / sempre devolve float.
  4. moedas_lider = por_jogador copia o valor 39 e moedas_lider += sobra reatribui a variável com a soma, chegando a 41.
  5. primeiro, segundo = segundo, primeiro monta primeiro os valores da direita e só depois os atribui, por isso a troca não perde nenhum deles.
  6. recorde = None marca que ainda não existe recorde; depois a mesma variável passa a apontar para um int.
  7. As f-strings inserem cada variável no texto sem precisar de str(); None aparece como a palavra None.

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 = segundo seguido de segundo = primeiro: os dois ficam com "Elisa", porque o valor original de primeiro se 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

Últimas lições

Ver o arquivo completo →