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.

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árioO que poderia acontecerO que o programa faz
3 (tarefa existe)FuncionarAge na tarefa 3 e confirma com mensagem
abcValueError e programa fechado na cara do usuárioexcept responde: digite apenas o número
99 (não existe)IndexError ao acessar a posição 98Validação responde: não existe tarefa com esse número
0 ou -1Comportamento 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 projeto

O 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.