1
resposta

Como manter o loop while mesmo diante do erro

Fiz um código para realizar um sorteio no qual realizo a importação de nomes de um arquivo txt e posteriormente sorteio nomes de dentro da lista.

from random import sample
from excecoes import SorteioInvalido


class Sorteador:
    def __init__(self, num_sorteados):
        self._num_sorteados = num_sorteados
        self._participantes = self.carrega_participantes()
        self._lista_sorteados = self.carrega_lista_sorteados()
        self.current_index = 0

    @property
    def num_sorteados(self):
        return self._num_sorteados

    @property
    def participantes(self):
        return self._participantes

    def __iter__(self):
        return self

    def __next__(self):
        indice_final = len(self._lista_sorteados)
        if self.current_index >= indice_final:
            raise StopIteration
        current = self._lista_sorteados[self.current_index]
        self.current_index += 1
        return current

    def carrega_participantes(self):
        participantes = []
        with open('participantes.txt', 'r', encoding='utf-8') as arquivo:
            for linha in arquivo:
                linha = linha.strip()
                participantes.append(linha)
        arquivo.close()
        return participantes

    def carrega_lista_sorteados(self):
        if self.validando_num_participantes():
            lista_sorteados = sample(
                sample(self.participantes, len(self.participantes)), self.num_sorteados)
            return lista_sorteados

    def validando_num_participantes(self):
        if len(self.participantes) >= self.num_sorteados:
            return True
        raise SorteioInvalido(
            'O número de pessoas a serem sorteadas precisa ser menor ou igual ao número de participantes')

while True:
    num_sorteados = int(input('Quantos premiados devem ser sorteados? '))
    sorteia = Sorteador(num_sorteados)
    for sorteado in sorteia:
        print(sorteado)
    novo_sorteio = input('Deseja realizar um novo sorteio? Digite [s] se sim, ou [n] se nao: ')
    if novo_sorteio.upper() == 'S':
        continue
    elif novo_sorteio.upper() == 'N':
        break

Ocorre que da forma que o código está feito tenho 2 problemas:

1 - realizado o primeiro sorteio o retorno será:

Quantos premiados devem ser sorteados? 3
Matheus
Joao
Igor
Deseja realizar um novo sorteio? Digite [s] se sim, ou [n] se nao: 

Assim, se selecionar "s" o loop continua, se selecionar "n" o loop será interrompido, entrentanto se a entrada for qualquer um outro caractere o loop também continuará. Como eu faço para que o código aceite somente uma das 2 entradas?

2 - O código possui uma exceção em seu sistema, que interrompe o loop sempre que o número de pessoas a serem sorteadas for registrado como maior que o número de participantes:

Traceback (most recent call last):
  File "c:\Users\mfsra\Desktop\Projetos\Sorteador\sorteador.py", line 5, in <module>
    sorteia = Sorteador(num_sorteados)
  File "c:\Users\mfsra\Desktop\Projetos\Sorteador\src.py", line 9, in __init__
    self._lista_sorteados = self.carrega_lista_sorteados()
  File "c:\Users\mfsra\Desktop\Projetos\Sorteador\src.py", line 41, in carrega_lista_sorteados
    if self.validando_num_participantes():
  File "c:\Users\mfsra\Desktop\Projetos\Sorteador\src.py", line 49, in validando_num_participantes       
    raise SorteioInvalido(
excecoes.SorteioInvalido: O número de pessoas a serem sorteadas precisa ser menor ou igual ao número de participantes

Como eu impeço que o loop se quebre, informando para o usuário que o número informado é inválido, conforme a exceção e pedindo um novo input?

1 resposta

1 - realizado o primeiro sorteio o retorno será: Assim, se selecionar "s" o loop continua, se selecionar "n" o loop será interrompido, entrentanto se a entrada for qualquer um outro caractere o loop também continuará. Como eu faço para que o código aceite somente uma das 2 entradas?*

  • Coloque seu "input" dentro de um WHILE e verifique se o valor digitado é um dos valores possíveis, enquanto o usuário não digitar um valor valido fique repetindo o input.

2 - O código possui uma exceção em seu sistema, que interrompe o loop sempre que o número de pessoas a serem sorteadas for registrado como maior que o número de participantes:

  • Mesma coisa, você precisa estruturar seu código na parte de leitura de quantidade de sorteio para verificar se o valor é maior que a quantidade total da sua lista. Se o valor informado for maior que a lista é preciso repetir o input até que seja um valor válido. Você pode até informar que foi inserido um valor maior que a quantidade de pessoas disponíveis na lista para ajudar na escolha do usuário.