Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

O valor de uma variável dá problema

Quando quero imprimir o menor lance, ele dá problema e realiza alguma operação desconhecida com o valor inserido. Seguem os códigos:

Domínio:

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.min
        self.menor_lance = sys.float_info.max

    def avalia(self, leilao: Leilao):

        for lance in leilao.lances:
            if lance.valor > self.maior_lance:
                self.maior_lance = lance.valor
            elif lance.valor < self.menor_lance:
                self.menor_lance = lance.valor

Principal:

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

carlos = Usuario("Carlos")

yuri = Usuario("Yuri")

lance_do_carlos = Lance(carlos, 100.0)

lance_do_yuri = Lance(yuri, 160.0)

leilao = Leilao("Celular")

leilao.lances.append(lance_do_carlos)
leilao.lances.append(lance_do_yuri)

for lance in leilao.lances:
    print(f"O usuário {lance.usuario.nome} deu um lance de R${lance.valor}")

avaliador = Avaliador()
avaliador.avalia(leilao)
print(f"O menor lance foi de {avaliador.menor_lance} e o maior lance foi de {avaliador.maior_lance}")

Na execução da última linha, o console mostra:

O menor lance foi de 1.7976931348623157e+308 e o maior lance foi de 160.0

Mas se troco o valor do lance_do_carlos e deixo ele o maior lance, não dá problema:

"C:\Users\Windows 10\AppData\Local\Programs\Python\Python37-32\python.exe" "C:/Users/Windows 10/PycharmProjects/testes_automatizados/src/leilao/principal.py"
O usuário Carlos deu um lance de R$170.0
O usuário Yuri deu um lance de R$160.0
O menor lance foi de 160.0 e o maior lance foi de 170.0

Process finished with exit code 0

Alguém sabe por que esse problema ocorre e como resolvê-lo?

Grato.

2 respostas
solução

Olá João, tudo certo?

Isso ocorre justamente pelo uso do elif, caso a primeira condição seja verdadeira, ele nunca executará o bloco do elif. Para resolver isso, basta trocar o elif por um if:

def avalia(self, 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

Mas a frente no curso vamos ver isso acontecendo e como resolver.

Valeu, Yuri, funcionou direitinho.