Módulo 16 - Projeto final: seu gerenciador de tarefas
Concluindo e removendo tarefas
11 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026
O que você vai aprender
- Implementar concluir_tarefa: escolher por número e mudar o status para True.
- Implementar remover_tarefa: escolher por número e tirar da lista com pop.
- Converter a resposta com int dentro de try/except ValueError, sem deixar o programa quebrar.
- Validar o intervalo do número e responder com mensagem clara a cada entrada errada.
Ouvir o resumo desta aula
Um recap de cerca de 2 minutos na voz do Valim, para ouvir no trânsito ou na academia.
Ler a transcrição do resumo
Resumo da aula: Concluindo e removendo tarefas.
Os objetivos desta aula. Implementar concluir_tarefa: escolher por número e mudar o status para True. Implementar remover_tarefa: escolher por número e tirar da lista com pop. Converter a resposta com int dentro de try/except ValueError, sem deixar o programa quebrar. Validar o intervalo do número e responder com mensagem clara a cada entrada errada.
Veja o essencial, parte por parte.
O desafio: apontar uma tarefa sem quebrar o programa. Concluir e remover têm o mesmo começo: mostrar a lista numerada e pedir o número da tarefa.
Implementando concluir_tarefa e remover_tarefa. Sem a validação numero < 1, digitar 0 acessaria a posição -1, que no Python é a ÚLTIMA tarefa da lista. O programa agiria na tarefa errada, sem nenhum erro na tela.
Testando os caminhos de erro. Testar só o caminho feliz é meio teste.
Esse foi o resumo do essencial. Para se aprofundar, leia a aula completa e responda os exercícios.
O desafio: apontar uma tarefa sem quebrar o programa
Adicionar era fácil: o usuário digita, o programa guarda. Concluir e remover são outra conversa, porque o usuário precisa apontar QUAL tarefa, e apontar abre três portas para o desastre. Ele pode digitar texto onde era número. Pode digitar um número que não existe na lista, como 99. E existe uma pegadinha silenciosa: a listagem numera a partir do 1, mas dentro do Python as posições começam do 0, então a tarefa mostrada como 1 mora na posição 0 da lista.
As duas funções desta aula enfrentam as três portas na mesma ordem, num padrão que vale a pena decorar de tão útil: mostrar as opções, ler a resposta, tentar converter para número, validar o intervalo e, só com tudo certo, agir. Se qualquer etapa falhar, a função responde com uma mensagem específica e retorna, deixando o usuário de volta no menu, são e salvo. É o try/except do módulo 14 saindo do laboratório e entrando num programa de verdade.
| Entrada do usuário | O que poderia acontecer | O que o programa faz |
|---|---|---|
| 3 (tarefa existe) | Funcionar | Age na tarefa 3 e confirma com mensagem |
| abc | ValueError e programa fechado na cara do usuário | except responde: digite apenas o número |
| 99 (não existe) | IndexError ao acessar a posição 98 | Validação responde: não existe tarefa com esse número |
| 0 ou -1 | Comportamento estranho (posição -2 existe no Python!) | Validação rejeita: o intervalo válido começa em 1 |
As quatro entradas possíveis e o destino de cada uma. As três últimas são exatamente o que a validação existe para segurar.
Implementando concluir_tarefa e remover_tarefa
Substitua o corpo das duas funções no seu gerenciador.py. Elas são quase gêmeas: o começo é idêntico (lista vazia, listagem, leitura, conversão, validação) e só o final muda, alterar o status numa e tirar da lista na outra. Digite a primeira com atenção; a segunda vai parecer revisão.
def concluir_tarefa(tarefas):
if len(tarefas) == 0:
print("Não há tarefas para concluir.")
return
listar_tarefas(tarefas)
resposta = input("Número da tarefa concluída: ")
try:
numero = int(resposta)
except ValueError:
print("Digite apenas o número da tarefa.")
return
if numero < 1 or numero > len(tarefas):
print("Não existe tarefa com esse número.")
return
tarefas[numero - 1]["concluida"] = True
print("Tarefa marcada como concluída. Bom trabalho!")concluir_tarefa: lista, lê, converte com rede de proteção, valida o intervalo e só então muda o status para True.
Acompanhe o caminho feliz: o usuário vê a lista, digita 2, o int converte sem erro, o if confirma que 2 está entre 1 e o tamanho da lista, e a linha final faz a mágica: tarefas[numero - 1]["concluida"] = True. O numero - 1 é a tradução entre o mundo humano (contando do 1) e o mundo do Python (contando do 0). Note que uma função chama a outra: concluir_tarefa reusa listar_tarefas em vez de repetir o código da listagem. Reuso assim é o motivo de termos organizado tudo em funções.
def remover_tarefa(tarefas):
if len(tarefas) == 0:
print("Não há tarefas para remover.")
return
listar_tarefas(tarefas)
resposta = input("Número da tarefa a remover: ")
try:
numero = int(resposta)
except ValueError:
print("Digite apenas o número da tarefa.")
return
if numero < 1 or numero > len(tarefas):
print("Não existe tarefa com esse número.")
return
removida = tarefas.pop(numero - 1)
print(f"Removida: {removida['texto']}")remover_tarefa: mesmo escudo de validação; o final usa pop, que tira a tarefa da lista e a devolve para a mensagem de confirmação.
A diferença toda mora nas duas últimas linhas. O pop(numero - 1) remove o dicionário daquela posição e o entrega de volta, e é por isso que guardamos o resultado em removida: a mensagem final mostra o texto da tarefa que saiu, confirmando ao usuário que o programa removeu exatamente o que ele pediu. Confirmar a ação com o dado concreto, em vez de um genérico feito, é um hábito pequeno que muda a confiança de quem usa.
Testando os caminhos de erro
Testar só o caminho feliz é meio teste. O roteiro desta aula ataca de propósito cada porta que acabamos de fechar: adicione duas tarefas, conclua a primeira, tente concluir a tarefa abc, tente remover a 99 e por fim remova a segunda de verdade. A sessão deve ficar assim:
Escolha uma opção: 3
1. [ ] Comprar pão
2. [ ] Estudar a aula 5 do projeto
Número da tarefa concluída: 1
Tarefa marcada como concluída. Bom trabalho!
Escolha uma opção: 3
1. [x] Comprar pão
2. [ ] Estudar a aula 5 do projeto
Número da tarefa concluída: abc
Digite apenas o número da tarefa.
Escolha uma opção: 4
1. [x] Comprar pão
2. [ ] Estudar a aula 5 do projeto
Número da tarefa a remover: 99
Não existe tarefa com esse número.
Escolha uma opção: 4
1. [x] Comprar pão
2. [ ] Estudar a aula 5 do projeto
Número da tarefa a remover: 2
Removida: Estudar a aula 5 do projetoO teste dos caminhos de erro: abc e 99 recebem mensagens educadas, e o programa segue vivo para a remoção correta.
Se a sua sessão bateu, o coração do gerenciador está pronto: as quatro operações funcionam e nenhuma entrada maluca derruba o programa. Repare como o [x] apareceu na primeira tarefa logo após a conclusão; é o dicionário mudando por dentro e a listagem refletindo na hora. Falta um único incômodo, e ele é grande: fechar o programa ainda apaga tudo. A próxima aula resolve isso de vez com o arquivo tarefas.txt.
Teste rápido
Por que a conversão int(resposta) fica dentro de um try/except ValueError?
Perguntas frequentes
- Por que concluir_tarefa chama listar_tarefas em vez de imprimir a lista de novo?
- Reuso: a listagem já existe, testada e pronta, então repetir o código dela seria duplicação. Se um dia você mudar o visual da listagem, muda num lugar só e as três opções (listar, concluir, remover) ganham a mudança juntas. Funções chamando funções é a organização pagando dividendo.
- O que exatamente faz tarefas[numero - 1]["concluida"] = True?
- Lê de dentro para fora: tarefas[numero - 1] pega o dicionário da tarefa escolhida (o -1 traduz a contagem humana para a do Python), e ["concluida"] = True troca o valor daquele campo. A tarefa continua na mesma posição da lista; só o status dela muda.
- Qual a diferença entre pop e remove numa lista?
- pop recebe a POSIÇÃO, remove o item dali e o devolve como resultado. remove recebe o VALOR e apaga a primeira ocorrência dele, sem devolver nada. Aqui pop é o certo: temos a posição vinda do número digitado e queremos o dicionário removido para exibir na confirmação.
- Por que validar numero < 1 se digitar 0 não dá erro no Python?
- Justamente porque não dá erro: 0 - 1 é -1, e a posição -1 no Python é a última da lista. O programa concluiria ou removeria a tarefa errada em silêncio, que é defeito bem pior que uma quebra. A validação de intervalo fecha essa porta antes de qualquer acesso à lista.
- Posso juntar concluir e remover numa função só, já que são parecidas?
- Dá, passando a ação como parâmetro, e é um bom exercício para depois do curso. Neste módulo mantemos separadas de propósito: duas funções simples e legíveis ensinam mais que uma função esperta e enrolada. Regra prática de quem mantém código: clareza primeiro, esperteza depois.
- E se o usuário digitar 2.5 como número da tarefa?
- int("2.5") levanta ValueError, porque a string com ponto decimal não é um inteiro válido, então cai no except e recebe a mensagem de digite apenas o número. Comportamento correto: não existe tarefa duas e meia, e o programa não deve adivinhar se a pessoa queria a 2 ou a 3.
Fontes
Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.