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

Endereço de memoria no print menor e maior lance

Olá , no print que estou dando esta aparecendo o endereço de memoria invés do numero do menor e maior lance .

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
            elif lance.valor < self.menor_lance:
                self.menor_lance = lance.valor

principal.py

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

gui = Usuario('gui')
yuri = Usuario('yuri')

leilao = Leilao('Celular')

lance_do_gui = Lance('gui',100.0)
lance_do_yuri = Lance('yuri',900.0)

leilao = Leilao('Celular')

leilao.lances.append(lance_do_gui)
leilao.lances.append(lance_do_yuri)




for lance in leilao.lances :
    print(f'o lance de {lance.usuario} foi de {lance.valor}')

avaliador = Avaliador()
avaliador.avalia(leilao)

print(f'o menor lance foi de {avaliador.maior_lance}, o maior lance foi de {avaliador.maior_lance}'
3 respostas

Olá Ian, tudo bem?

O que acontece é que você inverteu na hora de inicializar os atributos maior_lance e menor_lance da classe Avaliador.

Na verdade, o atributo maior_lance recebe o sys.float_info.min e no menor_lance é atribuído o sys.float_info.max.

Ao final, a classe Avaliador fica assim:

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

Obrigado por solucionar minha duvida.Só me tire mais uma confusão que estou tendo, (sys.float_info.min) não é um método que busca o menor numero que esta em uma lista ? porque não esta correto desta maneira.

self.menor _lance = sys.float_info.min
solução!

O sys.float_info.min retorna o menor número decimal do sistema operacional.

O que acontece é que quando o interpretador chega no elif lance.valor < self.menor_lance:, pelo fato de menor_lance ser o menor valor possível no sistema, não importa o valor que passamos ele nunca será menor que esse, logo essa cláusula sempre será falsa e não executará o código do if.