1
resposta

[Projeto] Título: Solução: Como Calcular uma Média com Notas Limitadas

Olá, pessoal!

Na minha resolução eu permiti qualquer nota , criar uma nova propriedade (@property) chamada media_ajustada. A grande vantagem dessa abordagem é que ela não modifica os dados originais (as notas reais), mas calcula um novo valor derivado sempre que é acessada. Usando uma list comprehension com a função min() para criar uma lista temporária de notas ajustadas.

Veja como ficou o código final na classe Restaurante:


class Restaurante:
    # ... (código __init__, etc.)

    @property
    def media_avaliacoes(self):
        """Calcula a média REAL das avaliações do restaurante."""
        if not self._avaliacao:
            return 0
        total = sum(avaliacao._nota for avaliacao in self._avaliacao)
        return round(total / len(self._avaliacao), 1)

    @property
    def media_ajustada(self):
        """Calcula a média com notas ajustadas para um máximo de 5."""
        if not self._avaliacao:
            return 0
        
        # AQUI ESTÁ A LÓGICA PRINCIPAL:
        # Para cada avaliação, pega o menor valor entre a nota e 5.
        # Ex: nota 8 vira 5, nota 3 continua 3.
        notas_ajustadas = [min(avaliacao._nota, 5) for avaliacao in self._avaliacao]
        total_ajustado = sum(notas_ajustadas)
        return round(total_ajustado / len(self._avaliacao), 1)

Para exibir os resultados, atualizei o método listar_restaurantes para mostrar ambas as médias, deixando a diferença clara:

    @classmethod
    def listar_restaurantes(cls):
        """Lista todos os restaurantes cadastrados."""
        header = (
            f'{"Nome do restaurante".ljust(20)} | '
            f'{"Categoria".ljust(20)} | '
            f'{"Média Real".ljust(20)} | '
            f'{"Média Ajustada".ljust(20)} | '
            f'{"Status"}'
        )
        print(header)
        for restaurante in cls.restaurantes:
            nome = restaurante._nome.ljust(20)
            categoria = restaurante._categoria.ljust(20)
            media_real = str(restaurante.media_avaliacoes).ljust(20)
            media_ajustada = str(restaurante.media_ajustada).ljust(20)
            print(f'{nome} | {categoria} | {media_real} | {media_ajustada} | {restaurante.ativo}')

Saída:

Listagem inicial dos restaurantes:
Nome do restaurante  | Categoria            | Média Real           | Média Ajustada       | Status
Restaurante A        | ITALIANA             | 6.5                  | 4.0                  | ❌
Restaurante B        | CHINESA              | 5.5                  | 4.5                  | ❌
Restaurante C        | JAPONESA             | 6.0                  | 4.0                  | ❌

Listagem após alterar status:
Nome do restaurante  | Categoria            | Média Real           | Média Ajustada       | Status
Restaurante A        | ITALIANA             | 6.5                  | 4.0                  | ✅
Restaurante B        | CHINESA              | 5.5                  | 4.5                  | ❌
Restaurante C        | JAPONESA             | 6.0                  | 4.0                  | ✅

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora
1 resposta

Oi, Yuri! Como vai?

Agradeço por compartilhar.

Gostei bastante da sua solução, usar uma property para calcular a média ajustada foi uma ótima escolha, pois mantém a integridade dos dados originais e ainda mostra domínio da ideia de encapsulamento. Sua explicação do raciocínio, junto com o exemplo de saída, deixou tudo bem claro.

Continue praticando e experimentando novas abordagens para reforçar a lógica da orientação a objetos.

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