Olá Frederico.
Vamos fazer o teste mesa, porque ele facilita muito o entendimento do código.
No incio atribuímos o maior e menor números possíveis para as nossas variáveis.
self.maior_lance = sys.float_info.max
self.menor_lance = sys.float_info.min
Depois quando é feito o primeiro lance, vamos dizer que é o lance de 100, ele vai verificar se 100 é maior que o maior lance ( if lance.valor > self.maior_lance: ) e vai ser, já que o maior lance está com o valor do menor numero possível, então a variável self.maior_lance agora guarda o valor de 100.
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
Mas o importante é que, por ele ter entrado no if ele não vai entrar no else elif e dessa maneira o self.menor_lance vai continuar guardando o maior numero possível.
Isso já gera um 'erro', já que quando é feito primeiro lance, ele deveria ser tanto o maior lance quanto o menor lance, já que só existe ele, mas vamos seguir para entender onde o problema maior aparece.
Agora quando é feito o segundo lance, vamos dizer que é o lance de 150.
Ele passa por todos os lances, repetindo a logica com o valor 100 e quando ele vai verificar se 150 é maior que o maior lance ( if lance.valor > self.maior_lance: ), ele vai ser, já que o maior lance está com o valor de 100, então a variável self.maior_lance agora guarda o valor de 150.
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
Então após 2 lances, nosso programa está incorreto, porque nosso menor lance deveria ser o 100 e o maior o 150, porem o nosso menor_lance ainda guarda o maior numero possível que atribuímos no inicio do programa.
Resolvemos isso tirando o elif e permitindo que um valor possa ser o maior e menor lance ao mesmo tempo, algo que sempre acontece na primeira rodada.
Vamos fazer o teste de mesa agora com essa correção:
Quando é feito o primeiro lance, que é o lance de 100, ele vai verificar se 100 é maior que o maior lance ( if lance.valor > self.maior_lance: ) e vai ser já que o maior lance está com o valor do menor numero possível, então a variável self.maior_lance agora guarda o valor de 100.
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
Agora acontece uma mudança, porque apos o if temos outro if que vai ser verificado lance.valor < self.menor_lance:, nosso lance de 100 é menor que
self.menor_lance, sim porque o valor atual dele é o maior numero possível, então a variável self.maior_lance agora guarda o valor de 100.
E quando é feito o segundo lance, que é o lance de 150.
Ele passa por todos os lances, repetindo a logica com o valor 100 e quando ele vai verificar se 150 é maior que o maior lance ( if lance.valor > self.maior_lance: ), ele vai ser já que o maior lance está com o valor de 100, então a variável self.maior_lance agora guarda o valor de 150.
E também vai verificar se o 150 é menor que o menor lance que é o 100, algo que não é verdade então a varável self.menor_lance continua guardando o 100
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
Então agora nosso código diz uma verdade, dos lances feitos o maior foi o de 150 e o menor foi o de 100.
Espero ter ajudado, recomendo sempre simular o código em um papel ou escrevendo no próprio código para tentar entende-lo melhor como ele está funcionando, mas qualquer duvida não hesite em perguntar.
Bons Estudos.