Como Receber Dados do Usuário em Python?

Para receber dados do usuário em Python, use a função input(). Essa função pausa o programa e lê todos os caracteres digitados no teclado até que o usuário pressione Enter. A função então retorna a linha digitada como um objeto do tipo string, sem o caractere de nova linha no final. O único parâmetro da função input() é uma string opcional, contendo uma mensagem que serve como prompt para a entrada de dados.

Função input em Python
Figura 1 – Exemplo de entrada de dados com a função input() mostrando um prompt.

No exemplo acima, a mensagem “Digite um comando:” é impressa no lugar onde o usuário deve digitar e o valor retornado pela função input() é armazenado na variável cmd como uma string.

!

O equivalente à função input() em Python 2 é a função raw_input().

Apesar da entrada de dados ser uma forma fundamental de interação com o usuário, na maioria dos programas ela é feita por meio de formulários em uma interface Web, ou via interface gráfica.

Por isso, o uso mais comum para a entrada de dados via terminal é em scripts, ou em programas simples como esses com finalidade didática.

Esse tipo de programa pode ser usado, por exemplo, para automatizar tarefas como mover, renomear e compactar arquivos com base em parâmetros fornecidos pelo usuário a cada execução.

Agora que você já sabe qual função usar para ler um valor do teclado em Python, veja os detalhes de como usar essa função.

Eu sugiro que você execute o código Python mostrado nesse post no Jupyter Lab para treinar.

O Jupyter Lab é uma ferramenta ótima para começar a programar e deve fazer parte da sua lista de ferramentas como programador.

Se você ainda não tem o Jupyter Lab instalado, dá uma olhada nesse post onde eu explico o passo-a-passo para a instalação.

Como usar a função input() no Python?

Como você viu na definição acima, a função input() só retorna strings.

Por isso, caso você queira usar os dados digitados pelo usuário como valores numéricos, é preciso usar funções para converter esses dados para o tipo específico.

Imagine que você queira escrever um programa para realizar cálculos. O código abaixo tenta somar dois valores recebidos do usuário, sem crítica alguma:

a = input('Digite o 1o valor inteiro:')
b = input('Digite o 2o valor inteiro:')
print(a + b)Code language: Python (python)

Se você testar esse programa com as entradas 2 e 3, vai ter como resultado 23.

Esse erro acontece porque os valores de entrada são lidos como strings. Em Python, o operador + também pode ser usado para concatenar strings.

Para usar o operador aritmético + para somar valores numéricos, antes é preciso usar funções para converter as strings recebidas nos tipos de dados esperados pelo programa.

As funções embutidas int() e float() podem ser usadas para converter strings para os tipos numéricos nativos do Python.

Se você quiser saber quais são os tipos de dados usados na linguagem Python, eu tenho um post completo onde eu explico todos eles em detalhes.

Para resolver esse problema de conversão de tipos, vou reescrever o programa usando a função embutida int(), que recebe uma string e retorna um valor inteiro.

a = int(input('Digite o 1o valor inteiro:'))
b = int(input('Digite o 2o valor inteiro:'))
print(a + b)Code language: Python (python)

Dessa vez, os valores de entrada 2 e 3 produzem o resultado correto (5).

Mas atenção:

Todos os exemplos mostrados até agora consideram que o usuário sempre vai digitar o tipo de dado correto e a conversão vai funcionar.

No entanto, o que acontece se o usuário digitar um número do tipo float? Pior ainda, uma letra ou um caractere qualquer, como um @?

Veja o que acontece se eu digitar o valor 2.31 no programa do exemplo acima:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-31-5d6dee3a8ea6> in <module>
----> 1 a = int(input('Digite o 1o valor inteiro:'))
      2 b = int(input('Digite o 2o valor inteiro:'))
      3 print(a + b)

ValueError: invalid literal for int() with base 10: '2.31'Code language: Python (python)

Um erro é gerado, pois o interpretador Python espera como parâmetros para a função int() apenas valores que possam ser convertidos em inteiros.

Como resolver isso?

Bem, a primeira coisa que você deve testar é se alguma coisa foi digitada, já que a função input() retorna uma string vazia '' caso o usuário só pressione Enter.

Depois, é preciso testar se a conversão para o tipo numérico com o qual você quer trabalhar irá funcionar.

Para isso, não há outro jeito, a não ser realizando a conversão e tratando o erro, caso não funcione.

É claro que você pode criar uma função só para fazer essa verificação, para não ter que repetir o código em todos os pontos do programa onde for feita uma leitura de dados do usuário.

def is_int(entrada):  #  Definição da função
    try:
        int(entrada)
        return True
    except ValueError:
        return False

#  Usando a função is_int()
a = input('Digite o 1o valor inteiro:')
b = input('Digite o 2o valor inteiro:')
if is_int(a) and is_int(b):
    print(int(a) + int(b))
else:
    print('Valor digitado não é inteiro.')Code language: Python (python)

Nesse exemplo, a função is_int() retorna True, caso consiga transformar o valor de entrada para um número inteiro.

Mas, se não for possível fazer a conversão, um ValueError é lançado e tratado pela função, que então retorna False.

Como boa prática, sugiro que você crie funções que testem pelo tipo específico para o qual você quer converter a string.

Isso significa que, se o seu programa estiver esperando um número inteiro, um valor do tipo float não pode ser considerado correto.

Como exercício, reescreva a função de verificação de números inteiros acima para o tipo float. Dica: preste atenção para o fato de que os valores NaN, +inf e -inf são considerados floats válidos!

Respostas comentadas dos exercícios sobre entrada de dados

Baixe grátis as soluções comentadas dos exercícios e confira suas respostas!

Não enviamos spam. Cancele a qualquer momento.

E se você esperar que o usuário digite um tipo de dado complexo, como uma lista, pares de chave:valor ou datas?

Continue lendo porque é isso que eu explico na próxima seção.

Como receber dados complexos do usuário?

Como você viu, quase sempre será necessário converter o valor recebido do usuário via função input(), a não ser que você esteja esperando receber uma string.

Dessa forma, para receber tipos de dados complexos, talvez seja muito trabalhoso realizar a conversão para o tipo esperado.

Veja um exemplo em que o programa pede ao usuário que insira uma lista de números separados por vírgulas.

entrada = input('Digite os números inteiros separados por vírgula:')
lista = entrada.split(',')
print(lista)Code language: Python (python)

A função split() é aplicada sobre a string de entrada. Essa função divide uma string com base no caractere passado como parâmetro (',') e retorna uma lista com os itens separados.

O primeiro problema desse programa é muito fácil de perceber. As instruções sobre como o usuário deve digitar são tantas, que o tamanho da mensagem de prompt é enorme.

Segundo, e se o usuário esquecer uma vírgula, ou colocar uma vírgula a mais no final?

Veja o resultado dos testes desse código com alguns valores incorretos:

#  Entrada: 1, 2, 3 4
#  Resultado: ['1', ' 2', ' 3 4']

#  Entrada: 1, 2, 3,
#  Resultado: ['1', ' 2', ' 3', '']  <-- Valor vazio no fimCode language: Python (python)

Por último, a lista resultante ainda vai ser uma lista de strings, não uma lista de números. Perceba que até os espaços em branco antes dos números são mantidos.

Se você quisesse usar esses valores para algum cálculo, seria muito difícil conseguir um resultado certo.

Então, o que fazer?

Uma das características de um programador é pensar de forma criativa.

Assim, uma boa prática é dividir o valor nas menores unidades que você espera guardar na lista. Nesse caso, números inteiros.

Você pode usar um laço while, pedindo um novo valor a cada iteração e garantindo que esse valor tem o tipo correto, como na seção anterior.

Por fim, uma vez que você tenha higienizado todos os dados, construa a lista para usar no resto do programa.

Por outro lado, um caso bastante comum que você pode encontrar é receber uma data digitada pelo usuário.

Nesse caso, como uma data é uma estrutura comum para a maioria das pessoas, você pode ler a data informando ao usuário qual é o formato esperado. Por exemplo:

dataInicial = input('Digite a data inicial no formato dd/mm/aa:')Code language: Python (python)

Como exercício, escreva a função que recebe uma string no formato dd/mm/aaaa e retorna um objeto datetime.date válido.

E não se preocupe, por que eu preparei um notebook no Jupyter Lab com todas as soluções comentadas, para você conferir as suas respostas. Baixe agora e veja como você se saiu!

Respostas comentadas dos exercícios sobre entrada de dados

Baixe grátis as soluções comentadas dos exercícios e confira suas respostas!

Não enviamos spam. Cancele a qualquer momento.

Conclusão

Nesse post você viu como receber dados do usuário em Python usando a função input().

Além disso, entendeu a importância de testar os valores digitados pelo usuário e garantir que são do tipo certo antes de executar qualquer operação sobre eles.

Por fim, conheceu boas práticas que devem ser aplicadas ao criar objetos complexos a partir de entradas do usuário.

Agora não perca a chance de fazer os exercícios e conferir as minhas soluções com explicações detalhadas.

Achou interessante? Já tinha pensado em todos esses pontos antes? Comente aqui embaixo! Compartilhe também outras respostas para os exercícios e não esqueça de dizer como eu posso melhorar esse post!

Guilherme Brügger D Amato - Audiência Pública na Comissão Senado do Futuro

Guilherme Brügger D’Amato é servidor concursado de TI na Câmara dos Deputados, onde ocupou o cargo de Diretor de Informática entre 2015 e 2016. Com mais de 26 anos de experiência como programador e executivo de TI, já desenvolveu sites e sistemas usados por dezenas de milhões de pessoas. Conecte-se com ele no LinkedIn ou no Instagram.

Deixe um comentário