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 erroIndexError
, 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.