Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Resolução: Lista de produtos

# Importa o módulo math, que fornece funções matemáticas, como verificar se um número é finito.
import math

# Função para verificar e obter o nome do produto do usuário
def verificar_nome_do_produto(mensagem: str) -> str:

    
    """
    Solicita ao usuário o nome de um produto e valida a entrada.

    Args:
        mensagem (str): Mensagem exibida ao solicitar o nome do produto.

    Returns:
        str: Nome válido do produto informado pelo usuário.
    """


    while True:
        try:
            # Solicita ao usuário o nome do produto e remove espaços extras
            nome: str = input(mensagem).strip() 

            # Verifica se o usuário não digitou nada
            if not nome:  
                print('Digitar o nome do produto é obrigatório!')
                # Volta ao início do loop para pedir novamente
                continue
            
            # Verifica se o nome tem menos de 4 caracteres
            if len(nome) < 4:  
                print('Esse não é um nome válido!')
                continue  
            
            # Retorna o nome válido, sem espaços extras
            return nome.strip()  
        
        except ValueError as e:  # Captura erros inesperados (raro nesse caso)
            print(f'Erro: {e}')  # Mostra a mensagem de erro

# Função para verificar e obter o valor do produto do usuário
def verificar_valor_do_produto(mensagem: str) -> float:
    
    """
    Solicita ao usuário o valor de um produto e valida a entrada.

    Args:
        mensagem (str): Mensagem exibida ao solicitar o valor do produto.

    Returns:
        float: Valor válido do produto informado pelo usuário.
    """

    while True:
        try:
            # Solicita o valor e troca vírgula por ponto
            raw: str = input(mensagem).strip().replace(',', '.')  

            # Converte o valor digitado para float (número decimal)
            valor: float = float(raw)  

            # Verifica se o valor é um número válido (não infinito ou NaN)
            if not math.isfinite(valor):  
                print('Valor inválido!')
                continue

            if valor <= 0:  
                print('O valor do produto deve ser maior que zero!')
                continue 

            return valor
        
        except ValueError:  # Captura erro se o usuário digitar algo que não seja número
            print('Digite apenas números! (use . ou , como separador decimal)')

# Função para cadastrar vários produtos
def cadastrar_produtos() -> list[dict[str, float | str]]:
    
    """
    Permite ao usuário cadastrar múltiplos produtos, solicitando nome e valor.

    Returns:
        list[dict[str, float | str]]: Lista de dicionários, cada um contendo nome e valor de um produto.
    """

    # Cria uma lista vazia para armazenar os produtos
    produtos: list[dict[str, float | str]] = []  

    while True: 
        produto: str = verificar_nome_do_produto('Digite o nome do produto: ') 
        valor: float = verificar_valor_do_produto('Digite o valor do produto: ')
    
        # Cria um dicionário com os dados
        dados_do_produto: dict[str, float | str] = {'nome': produto, 'valor': valor}

        # Adiciona o produto à lista  
        produtos.append(dados_do_produto)  

        # Pergunta se quer cadastrar mais
        cadastrar: str = input('Deseja cadastrar mais produtos? [S/N] ').strip().upper()  

        # Se a resposta não for 'S', encerra o cadastro
        if cadastrar != 'S':  
            break

    return produtos

# Função para listar os produtos cadastrados
def listar_produtos(produtos: list[dict[str, float | str]]) -> None:

    """
    Exibe a lista de produtos cadastrados com seus respectivos valores.

    Args:
        produtos (list[dict[str, float | str]]): Lista de produtos para exibição.
    """

    for produto in produtos:

        nome_do_produto: str = produto.get('nome')  # Obtém o nome do produto do dicionário
        valor_do_produto: float = produto.get('valor')  # Obtém o valor do produto do dicionário
        print(f'- {nome_do_produto}\n R$ {valor_do_produto:.2f}')  # Exibe o nome e valor formatado


def main() -> None:

    """
    Função principal que executa o fluxo de cadastro e exibição dos produtos.
    """

    produtos: list[dict[str, float | str]] = cadastrar_produtos()  # Chama a função para cadastrar produtos
    listar_produtos(produtos)  # Chama a função para listar os produtos cadastrados


if __name__ == '__main__':
    try:
        main() 
    except KeyboardInterrupt:  # Captura se o usuário pressionar Ctrl+C para interromper
        print('\nOperação cancelada pelo usuário. Saindo...')  # Mensagem de saída amigável
1 resposta
solução!

Oi, Jonas! Como vai?

Gostei bastante da estrutura do seu programa — a forma como você organizou as funções e documentou com docstrings mostra um ótimo domínio das boas práticas em Python. O uso do módulo math para validar valores é um toque interessante que deixa o código mais robusto.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!