4. Interação com o Usuário#

Agora que já aprendemos sobre variáveis, constantes, tipos de dados e operadores, vamos aprender a como tornar nossos programas interativos, para que possam receber dados do usuário em tempo de execução.

Função input()#

A função input() pausa a execução do programa e espera que o usuário digite algo no console, normalmente um valor ou informação que foi solicitada, em seguida o usuário apenas percisa pressionar Enter e o programa seguirá seu fluxo padrão.

Sua sintaxe é bem simples: variavel = input(), apenas com isso o programa entenderá que o usuário deverá digitar alguma informação.

  • também é possível exibir uma mensagem (prompt) ao usuário para melhor instruí-lo sobre a informação que o programa espera receber, como veremos no exemplo a seguir:

Obs: Quando rodar o bloco de código a seguir, na parte superior do documento jupyter se abrirá o terminal, que é onde você deverá inserir a informação solicitada para executar o código.

variavel = input("Digite seu nome: ")
print(variavel)
---------------------------------------------------------------------------
StdinNotImplementedError                  Traceback (most recent call last)
Cell In[1], line 1
----> 1 variavel = input("Digite seu nome: ")
      2 print(variavel)

File ~/.local/lib/python3.12/site-packages/ipykernel/kernelbase.py:1274, in Kernel.raw_input(self, prompt)
   1272 if not self._allow_stdin:
   1273     msg = "raw_input was called, but this frontend does not support input requests."
-> 1274     raise StdinNotImplementedError(msg)
   1275 return self._input_request(
   1276     str(prompt),
   1277     self._parent_ident["shell"],
   1278     self.get_parent("shell"),
   1279     password=False,
   1280 )

StdinNotImplementedError: raw_input was called, but this frontend does not support input requests.

A função sempre retorna o que o usuário digitou como uma string (str). Mesmo que digite números, eles serão tratados como texto, veja:

numero = input("Digite um número: ")
print(numero, type(numero))
14 <class 'str'>

Por isso devemos converter a string utilizando os metodos de conversão que já aprendemos anteriormente na Aula 02.

idade_texto = input("Digite sua idade: ")
idade_numero = int(idade_texto)

print(idade_texto, type(idade_texto)) # Antes da conversão
print(idade_numero, type(idade_numero)) # Depois da conversão
25 <class 'str'>
25 <class 'int'>

Blocos try-except#

Agora que aprendemos sobre input() e como converter os dados de entrada, vamos aprender a tratar possíveis erros que podem vir a surgir caso o usuário insirá uma entrada incorreta no programa, assim teremos uma melhor interação com o usuário dando-lhes instruções claras sobre o erro.

O bloco try-except é uma ótima forma de tratamentos de erros, ele se baseia no valueError (erro de valor), que trata-se de uma exceção que dispara quando uma função recebe um argumento/valor com um tipo de dado correto (existente), mas o argumento/valor é inapropriado para a operação que deveria ser executada. Em resumo, é uma forma do programa dizer que o valor fornecido para operação é inválido. Veja o exemplo a seguir:

idade_texto = input("Digite sua idade: ")
# Se não converter, idade_texto será uma string, ex: "25"

# Tentativa de operação matemática com a string (GERARÁ ERRO):

# tente executar a seguinte instrução
try:

    # Conversão para inteiro:
    idade_numero = int(idade_texto)
    print(f"Daqui a 5 anos, você terá {idade_numero + 5} anos.")

# caso ocorra a exceção valueError, faça:
except ValueError:
    print("Entrada inválida. Por favor, digite um número para a idade.")
Entrada inválida. Por favor, digite um número para a idade.

Resumidamente falando, try tenta executar uma instrução contida em sey bloco de código, nesse caso é converter a entrada do usuário para um inteiro (int), caso o usuário insira um entrada inválida no programa (ex: inserindo uma letra), a exceção (except) error de valor (valueError) é disparada e seu bloco de código é executado.

Observação#

Blocos try-except podem ser usados para verificar erros de qualquer tipo de operação, seja converter valores, verificar dados de entrada e afins.

Boas práticas de Prompts e Feedback#

Clareza com o usuário é fundamental, prompts devem ser descritivos para que o usuário não se confunda e insira informações errada, enquanto feedbacks são úteis para confirmar se o que o usuário inseriu está correto, especialmente para dados críticos.

Tipos de prompts:

  • Ruim: input(“Valor:”) (Valor de quê? Em qual formato?)

  • Bom: input(“Digite sua data de nascimento (DD/MM/AAAA): “)

  • Melhor ainda (se houver restrições): input(“Digite sua idade (apenas números entre 1 e 120): “)

Tipos de feedback:

  • Confirmação: Depois que o usuário insere algo, pode ser útil confirmar o que foi entendido, especialmente para dados críticos.

email = input("Digite seu e-mail: ")
confirmacao = input(f"O seu email fornecido foi: {email}, está correto?")
  • Mensagem de Erro construtivas: Invés de apenas “Erro”, diga ao usuário o que deu errado e como corrigir.

# Ruim
print("Entrada inválida")

#Bom
print("Erro: O valor do produto deve ser um número positivo. Ex: 19.99")
  • Mensagem de Sucesso: Informe ao usuário que a operação foi bem-sucedida.

nome = input("Digite seu nome:")
print("Nome registrado com sucessor!")
Nome registrado com sucessor!

Extra: Cenários de Entradas Mais Elaborados#

Aqui veremos outras maneiras de permitir que o usuário consiga inserir dados no programa além da função input().

Multiplas entradas numa única linha#

Às vezes, podemos querer que o usuário insira vários dados de uma vez, separados por um caractere (como vírgula ou espaço). A função split() é perfeita para isso.

nome_e_idade = input("Digite seu nome e idade, separados por vírgulas (ex: Mario,12)")

try:

    partes = nome_e_idade.split(",") # Divide a string em uma lista onde houver ","

    if len(partes) == 2: # Verifica se a lista possue exatamente 2 elementos dentro dela

        nome = partes[0].strip() # .strib() remove espaços extras
        idade_str = partes[1].strip()
        idade = int(idade_str) # Converte a string para inteiro

        print(f"Nome: {nome}, Idade: {idade} anos.")

    else:  # Caso a lista não possua exatamente dois valores esse bloco de código é executado

        print("Formato inválido, Use: Nome,Idade")

except ValueError:
    print("Erro ao converter a idade para inteiro. Verifique a entrada.")

except IndexError: # Se split não retornar duas partes
    print("Formato inválido. Certifique-se de separar nome e idade por vírgula.")
Formato inválido, Use: Nome,Idade

OBS: Mais tarde veremos mais sobre os métodos len(), .strip() e o erro IndexError, mas é bom que você saiba que eles existem

Entrada de Senhas#

A função input() exibe o que o usuário digita, o que não é o ideal para senhas, por exemplo. Quando precisarmos ocultar o que o usuário digita, podemos utilizar o módulo getpass, pois ele tenta não ecoar caracteres digitados.

import getpass # Importando módulo para entrada da senha

# getpass.getpass() não ecoa a entrada no terminal
senha = getpass.getpass("Digite sua senha: ")

Veja que a entrada digitada fica coberta por asteriscos (*), impedindo que pessoas possam vê-la.

Atenção: getpass é para aplicações de linha de comando. Aplicações gráficas (GUI) ou web têm seus próprios componentes seguros para campos de senha.

Parabéns: Você terminou o módulo 04 do curso de introdução à python. Agora você sabe como permitir que seus programas recebam entradas do usuário, como tratar possíveis erros que isso pode vir a ocasionar e boas práticas de mensagens para interagir com o usuário.