Curso de Python / Variáveis, input() e print(): ler e mostrar uma despesa

Em Python, variáveis se referem a valores, input() lê texto e print() mostra resultados. Uma entrada com aparência de número ainda é uma string: converta-a para o tipo numérico necessário antes de calcular.

Diferencie atribuição, valor e comentário

O operador = associa o resultado à direita ao nome à esquerda; ele não testa se duas expressões são iguais. Uma nova atribuição muda o valor que esse nome passa a representar. Salve este pequeno exemplo em um arquivo de exercício e execute-o com o Python do projeto:

amount = 3500
amount = amount + 500
print(amount)  # Display the calculated result

A saída é 4000. Primeiro, amount recebe 3500; depois, a expressão usa esse valor para calcular 4000 e associa o resultado ao mesmo nome. O texto depois de # é um comentário e não é executado como uma instrução. No exemplo, o comentário indica a exibição do resultado.

Prefira nomes que indiquem o papel do dado, como amount para um valor e amount_text para o texto ainda não convertido. Evite atribuir valores a nomes de funções embutidas, como print, input ou list: isso pode impedir que uma chamada posterior encontre a função esperada.

Execute um programa completo de entrada e saída

Na pasta do projeto, salve o arquivo input_expense.py em UTF-8 com as quatro linhas abaixo. Não são necessários pacotes extras. Execute python input_expense.py no terminal do ambiente selecionado; no macOS ou Ubuntu, fora de um ambiente virtual, use python3 se esse for o nome do seu interpretador.

name = input("name: ").strip()
amount_text = input("amount: ").strip()
amount = int(amount_text)
print(f"{name}: {amount:,} KRW")

Quando aparecer name:, digite lunch e pressione Enter. Quando aparecer amount:, digite 8000 e pressione Enter. name significa nome, e amount significa valor; os textos em inglês fazem parte dos prompts deste exemplo.

O bloco seguinte mostra somente a saída escrita pelo programa, sem incluir o que você digitou. Os prompts de input() não acrescentam uma quebra de linha, por isso aparecem juntos quando a entrada é fornecida sem eco:

name: amount: lunch: 8,000 KRW

Em um terminal interativo, normalmente você verá o texto digitado depois de cada prompt e uma mudança de linha ao pressionar Enter. A última linha produzida pelo programa será lunch: 8,000 KRW. Essa diferença de apresentação não significa que o cálculo mudou.

Acompanhe a transformação do texto em número

A primeira chamada de input() lê o nome. O método strip() remove espaços em branco nas extremidades, sem apagar espaços entre palavras. Assim, uma entrada com espaços ao redor de lunch resulta no mesmo nome usado na saída.

A segunda chamada lê o valor em amount_text. Mesmo que você digite 8000, essa variável contém o texto "8000". Somente int(amount_text) produz o número inteiro 8000. A conversão de uma string com ponto decimal, como "8000.5", não é a mesma operação que converter um número de ponto flutuante: neste programa, essa entrada provoca ValueError.

A string precedida de f insere os valores das expressões entre chaves. Em {amount:,}, o especificador de formato , agrupa os milhares com vírgulas. Ele não seleciona automaticamente a formatação monetária brasileira. KRW é o código do won sul-coreano usado no exercício; acrescentar esse texto não converte moedas.

Esse programa demonstra leitura, conversão e formatação. Ele ainda não verifica se o nome ficou vazio ou se o valor é positivo: entradas como 0 e -1 são aceitas por int(). Um cadastro de despesas precisa definir essas regras separadamente.

Mude uma entrada por vez e observe os erros

  1. Execute novamente e mantenha lunch, mas informe 9000. Confira a saída final lunch: 9,000 KRW.
  2. Repita com 8000.5 como valor. Observe ValueError e a linha da conversão no rastreamento do erro. O programa termina porque esse exemplo ainda não trata a exceção.
  3. Experimente um valor vazio ou abc. Ambos também não representam um inteiro. Execute novamente com 8000 para confirmar o retorno ao resultado original.

Digite o valor sem separadores de milhar: 8000, não 8,000 ou 8.000. O formato usado na saída não cria um leitor de números formatados na entrada. Para pedir novamente um valor inválido, será necessário combinar tratamento de exceções com uma regra de repetição, em vez de esconder todo erro do programa.

Se o programa parecer parado, confira se o cursor está esperando uma entrada. input() aguarda uma linha; isso é diferente de um erro de cálculo. Se a fonte de entrada terminar antes de fornecer a linha esperada, pode ocorrer EOFError. Ao investigar uma falha, diferencie a ausência de entrada da presença de um texto que não pode ser convertido.