Olá, Giovanni. Como vai?
Excelente resolução da atividade! O seu código está extremamente organizado, modularizado em funções com responsabilidades bem definidas e demonstra um ótimo domínio sobre o fluxo de controle com laços while True, break e estruturas condicionais.
A sua abordagem traz três pontos de destaque fantásticos:
- Uso do
.strip(): Excelente prática para limpar espaços em branco involuntários que a pessoa usuária possa digitar no início ou fim do nome do projeto. - Validação de Entrada: O segundo laço
while True dentro da função lista_projetos ficou ótimo. Ele blinda o programa e força o usuário a digitar apenas as opções válidas (S ou N), impedindo que o script quebre ou mude de comportamento com entradas inesperadas. - Uso da Condicional
if __name__ == '__main__':: Essa é a assinatura padrão ouro de scripts profissionais em Python, garantindo que a função main() só seja executada se o arquivo for rodado diretamente, e não quando importado por outro módulo.
Aproveitando o excelente nível do seu código, existem dois detalhes sutis na lógica e na sintaxe que valem a pena observar para deixar o seu portfólio ainda mais polido:
1. O perigo de anexar valores vazios (None)
Na sua função lista_projetos, você fez a seguinte validação:
if not nome_projeto:
nome_projeto = None
projetos.append(nome_projeto)
Se o usuário simplesmente apertar Enter sem digitar nada, o if not nome_projeto será verdadeiro, transformará a variável em None e o append(nome_projeto) vai adicionar esse None dentro da sua lista de projetos.
Embora você tenha tratado isso muito bem na função organizacao() imprimindo "Projeto ausente", o comportamento esperado de um gerenciador de portfólio geralmente é ignorar entradas vazias em vez de guardá-las.
Para evitar adicionar um "projeto fantasma" na lista, você pode usar a palavra-chave continue para saltar direto para a pergunta de continuar, ou simplesmente envelopar o append dentro de uma condição válida.
2. A armadilha do if opcao in 'NS':
No bloco de validação da resposta, você utilizou:
if opcao in 'NS':
Essa construção funciona perfeitamente se o usuário digitar apenas N ou S. Porém, o operador in no Python faz uma busca de substring. Isso significa que se o usuário digitar o texto completo "NS" por engano, o Python avaliará a condição como Veradeira (porque a string "NS" está contida em "NS"), o laço vai quebrar e o programa continuará de forma inesperada.
Para fazer uma validação estrita e totalmente segura de opções contidas em uma coleção, a melhor prática é usar uma lista ou tupla com os elementos separados:
if opcao in ['N', 'S']: # Ou simplesmente: if opcao == 'N' or opcao == 'S':
Como ficaria o código com esses refinamentos:
def titulo(txt):
print('=' * len(txt))
print(txt)
print('=' * len(txt))
def lista_projetos():
projetos = []
while True:
nome_projeto = input('Digite o nome do projeto: ').strip()
# Se o usuário digitou algo válido, adicionamos à lista
if nome_projeto:
projetos.append(nome_projeto)
else:
print('Nome inválido! O projeto não pode ser vazio.')
# Opcional: você pode colocar um 'continue' aqui se quiser
# que ele peça o nome de novo sem perguntar se quer continuar.
while True:
opcao = input('Quer continuar? [S/N] ').strip().upper()
if opcao in ['S', 'N']: # Validação estrita por elementos
break
print('Digite S ou N.')
if opcao == 'N':
break
return projetos
def organizacao(lista):
# Se a lista estiver completamente vazia
if not lista:
print('Não foi encontrado nenhum projeto no seu portfólio.')
return
print('\nSeus projetos cadastrados:')
for projeto in lista:
print(f'- {projeto}')
def main():
titulo('ORGANIZANDO PORTFÓLIO')
lista = lista_projetos()
organizacao(lista)
if __name__ == '__main__':
main()
Seu código original resolve o problema de forma muito madura e estruturada. Aplicar esse cuidado com as validações de borda (edge cases) é o que diferencia um programador júnior de um pleno no dia a dia. Excelente trabalho!
Espero que possa ter lhe ajudado!