1
resposta

alterado de elif para if, mas o valor ainda vem menor lance 2.2250738585072014e-308 e maior lance de 1.7976931348623157e+308

Olá ainda estou com problema do valor estranho, mesmo atualizando a tomada de decisão de elif para if, mas o valor ainda vem como : menor lance 2.2250738585072014e-308 maior lance de 1.7976931348623157e+308

arquivo dominio.py


import sys


class Usuario:

    def __init__(self, nome):
        self.__nome = nome

    @property
    def nome(self):
        return self.__nome


class Lance:

    def __init__(self, usuario, valor):
        self.usuario = usuario
        self.valor = valor


class Leilao:

    def __init__(self, descricao):
        self.descricao = descricao
        self.__lances = []

    @property
    def lances(self):
        return self.__lances


class Avaliador:
    def __init__(self):
        self.maior_lance = sys.float_info.max
        self.menor_lance = sys.float_info.min

    def avalia(self, leilao: Leilao):
        for lance in leilao.lances:
            if lance.valor > self.maior_lance:
                self.maior_lance = lance.valor
            if lance.valor < self.menor_lance:
                self.menor_lance = lance.valor

arquivo principal.py


from src.leilao.dominio import Usuario, Lance, Leilao, Avaliador

gab = Usuario('Gabriel')

clau = Usuario('Claudia')


lance_do_gab = Lance(gab, 100.0)
lance_da_clau = Lance(clau, 150.0)


leilao = Leilao('Celular')


leilao.lances.append(lance_do_gab)
leilao.lances.append(lance_da_clau)


for lance in leilao.lances:
    print("O usuário {} deu o lance de {}".format(lance.usuario.nome, lance.valor))

avaliador = Avaliador()
avaliador.avalia(leilao)

print("O menor lance foi de {} e o maior lance foi de {}".format(avaliador.menor_lance, avaliador.maior_lance))

console:

/home/gabriel/Documents/Estudos/allura/python/venv/bin/python /home/gabriel/Documents/Estudos/allura/pytest/testes-python-projeto-inicial/src/leilao/principal.py
O usuário Gabriel deu o lance de 100.0
O usuário Claudia deu o lance de 150.0
O menor lance foi de 2.2250738585072014e-308 e o maior lance foi de 1.7976931348623157e+308
1 resposta

Seu código tá um pouco mais avançado do que eu estou agora, mas acho que achei o caminho, amigo. Você tá inicializando o Avaliador dizendo que o maior_saque, é o maior número possível, e o menor é o menor possível.

class Avaliador:
    def __init__(self):
        self.maior_lance = sys.float_info.max
        self.menor_lance = sys.float_info.min

Seu lance.valor nunca vai ser maior que o self.maior_lance, pq você está startando (no avaliador) ele com o float máximo possível. A mesma coisa para o menor valor. Não tem como o lance ser menor que o self.menor_lance, pq o self.menor_lance é o float mínimo possível. Outra coisa é que seu if está sobrescrevendo os valores. Ele começa com o lance de 100, que até então é o maior valor, portanto no primeiro loop, 100 é o maior, e o menor é o default (que até então era o menor possível). Quando ele passa na segunda vez, o maior valor passa a ser 150, pq ele é maior que o lance atual, você tá sobrescrevendo o maior lance, mas o menor lance se perdeu...

Eu fiz uma gambiarra, pra arrumar, mas com tempo você pode pensar em algo melhor. Eu pedi pra ele sempre setar o maior e o menor lance iguais ao primeiro lance que for feito. A partir daí ele sempre verifica se o valor é maior que o maior, e se é menor que o menor.

    def avalia(self, leilao):
        index = 0
        for lance in leilao.lances:

            if index == 0:
                self.maior_lance = lance.valor
                self.menor_lance = lance.valor
            else:
                if lance.valor > self.maior_lance:
                    self.maior_lance = lance.valor
                if lance.valor < self.menor_lance:
                    self.menor_lance = lance.valor
            index +=1

Assim ele não perde nenhum dos valores :D

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software