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.
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.
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() arredondaRode e acompanhe cada conversão. Repare que int(3.99) vale 3: ele corta, não arredonda.
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.