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?