Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Organizando seu portfólio

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()
        if not nome_projeto:
            nome_projeto = None
        projetos.append(nome_projeto)
        while True:
            opcao = input('Quer continuar? [S/N]').strip().upper()
            if opcao in 'NS':
                break
            print('Digite S ou N.')
        if opcao == 'N':
                break
    return projetos

def organizacao(lista):
    if not lista:
        print('Não foi encontrado nenhum projeto.')
    
    for projeto in lista:
        if projeto is None:
            print('Projeto ausente')
        else:
            print(projeto)


def main():
    titulo('ORGANIZANDO PORTFÓLIO')
    lista = lista_projetos()
    organizacao(lista)


if __name__ == '__main__':
    main()
2 respostas
solução!

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!

Ajudou sim, obrigado!