programandoai

Variáveis, atribuição e os tipos básicos

Um programa que só imprime texto fixo não serve para muita coisa. Programas de verdade guardam e reaproveitam valores, com nomes que fazem sentido.

Estudar esta lição interativa →

Imagine um programa de caixa de mercado que precisa lembrar o preço de um produto, quantas unidades foram compradas, e se o cliente tem cartão fidelidade, para depois calcular o total. Sem um jeito de guardar esses valores com um nome, você teria que reescrever os números toda vez que precisasse deles. É exatamente esse problema que uma variável resolve: um nome que aponta para um valor guardado na memória, pronto para ser reaproveitado.

nome = "Marina"
idade = 29
altura = 1.68
tem_cartao = True

print(nome, type(nome))
print(idade, type(idade))
print(altura, type(altura))
print(tem_cartao, type(tem_cartao))

Rode e observe os quatro tipos diferentes no console.

O sinal = aqui não significa "igual" como em matemática: significa atribuição, "guarde este valor, à direita, sob este nome, à esquerda". Repare também que cada variável guardou um tipo diferente de valor: nome é uma string (texto, entre aspas), idade é um int (número inteiro), altura é um float (número com casas decimais) e tem_cartao é um bool (booleano: só pode ser True ou False, com maiúscula inicial em Python). A função type(...) revela o tipo de qualquer valor.

Pense numa variável como uma caixa com uma etiqueta escrita à mão, não impressa. Diferente de uma caixa de fábrica marcada permanentemente como "só parafusos", você pode apagar a etiqueta e escrever outra coisa a qualquer momento: hoje a caixa idade guarda um número; se você quiser, amanhã o mesmo nome pode passar a apontar para um texto. Essa flexibilidade tem nome: tipagem dinâmica.

valor = 10
print(valor, type(valor))

valor = "agora sou um texto"
print(valor, type(valor))

A mesma variável muda de tipo entre uma linha e outra, sem erro nenhum.

snake_case: o estilo de nomes do Python

Por convenção (uma regra combinada pela comunidade, não uma exigência da linguagem), nomes de variáveis em Python usam letras minúsculas com underscore separando palavras: preco_unitario, não precoUnitario (esse segundo estilo, chamado camelCase, é mais comum em JavaScript e Java). Seguir essa convenção deixa seu código parecido com o de qualquer outro programa Python que você for ler.

Misturar tipos incompatíveis quebra o programa

A flexibilidade da tipagem dinâmica não significa que qualquer operação entre tipos diferentes funciona. Tente somar um texto com um número:

idade = "29"
print("Daqui a 10 anos:", idade + 10)

Isso gera TypeError: can only concatenate str (not "int") to str: o Python está dizendo, com bastante precisão, que uma str só pode ser "somada" (concatenada) com outra str, nunca com um int direto. O diagnóstico costuma nomear os dois tipos envolvidos, o que ajuda bastante a achar a linha certa para corrigir.

O erro acontece porque "29" é texto, não número. Quando um valor chega como texto mas representa um número (o que acontece o tempo todo com dados lidos de arquivos, formulários ou do input()), é preciso converter: int(...) transforma em inteiro, float(...) em número com casas decimais e str(...) faz o caminho oposto, de número para texto.

idade_texto = "29"           # veio como texto
idade = int(idade_texto)      # texto -> inteiro
print(idade + 10)             # 39

preco_texto = "8.90"
preco = float(preco_texto)    # texto -> float
print(preco * 2)              # 17.8

print("Idade: " + str(idade))  # número -> texto, para juntar com +
print(int(3.99))              # 3: int() corta a parte decimal, não arredonda
print(round(3.99))            # 4: round() arredonda

Rode e acompanhe cada conversão. Repare que int(3.99) vale 3: ele corta, não arredonda.

Converter texto que não é número dá ValueError

int("abc") quebra com ValueError: invalid literal for int() with base 10: 'abc', e o mesmo vale para int("3.5") (use float para textos com ponto decimal) e para o texto vazio. O Módulo 9 mostra como tratar esse erro sem derrubar o programa. Uma pista do porquê isso importa: o input() sempre devolve texto, mesmo que a pessoa digite 29, por isso ele quase sempre vem acompanhado de int() ou float().

idade = "29"
print("Daqui a 10 anos:", idade + 10)

Rode, veja o TypeError, troque idade para um número e rode de novo.

← Voltar ao índice do curso