Olá, Cod3rs! Tudo tranquilo? Esse artigo é uma parte 2, então se você ainda não leu a parte 1, clique aqui para ser redirecionado: Classificar casas de Hogwarts com arrays em Python.
No artigo anterior, foi desenvolvido um programa que faz o papel do queridissimo chápeu seletor do universo de Harry Potter, e, classifica os alunos de Hogwarts em suas devidas casas, sendo elas; Grifinória, Lufa-Lufa, Sonserina e Corvinal.
Ao fim, a conclusão foi que após terminar um código, é importante revisar e buscar meios de otimiza-lo, como forma de aproveitar ao máximo a proposta de um exercicio. Durante o decorrer desse artigo, é isso o que faremos!
Divergência em resoluções
Você pode reparar que, ao fazer exercícios online e consultar a resolução, poderá ocorrer da sua resposta estar diferente do gabarito. Isso pode te assustar no início e o fazer pensar que a sua está incorreta. O que muitas vezes não é verdade.
Na programação, as resoluções vão de acordo com a lógica do humano desenvolvedor do código. Existem várias maneiras de resolver um problema.
E, muitas vezes você vai resolver diferente de outra pessoa.
Mão na massa: Definindo os arrays
Agora, vamos mudar a lógica do programa para que ele funcione de forma mais conscisa e que faça mais sentido com relação a construção do mundo fantasia de Harry Potter.
Definindo o array de casas:
hogwarts_casas = ["Grifinoria", "Lufa-Lufa", "Corvinal", "Sonserina"]
O dicionário de alunos agora terá informações adicionais já que o intuito é personalizar a seleção e classificação de casas:
hogwarts_alunos = [
{"name": "Harry Potter", "ano": 5, "status_sangue": "Mestico", "posicao_quadribol": "Apanhador"},
{"name": "Hermione Granger", "ano": 6, "status_sangue": "Nascido_trouxa", "posicao_quadribol": None},
{"name": "Ron Weasley", "ano": 4, "status_sangue": "Sangue_puro", "posicao_quadribol": "Goleiro"},
{"name": "Draco Malfoy", "ano": 6, "status_sangue": "Sangue_puro", "posicao_quadribol": "Apanhador"},
{"name": "Luna Lovegood", "ano": 5, "status_sangue": "Sangue_puro", "posicao_quadribol": None},
{"name": "Neville Longbottom", "ano": 4, "status_sangue": "Sangue_puro", "posicao_quadribol": None},
{"name": "Cedric Diggory", "ano": 6, "status_sangue": "Sangue_puro", "posicao_quadribol": "Apanhador"},
{"name": "Cho Chang", "ano": 5, "status_sangue": "Mestico", "posicao_quadribol": "Artilheiro"},
]
E a função para classificar os alunos de Hogwarts em casas com base nos critérios aprimorados:
def classificar_alunos_hogwarts():
Implementando a lógica
Para a classificação, uma boa lógica é usar if/else. Para isso, vamos primeiro criar um dicionário para armazenar os alunos pelas casas:
alunos_por_casa = {casa: [] for casa in hogwarts_casas}
E buscar os critérios pelas quais eles serão classificados:
for aluno in hogwarts_alunos:
name = aluno["name"]
ano = aluno["ano"]
status_sangue = aluno["status_sangue"]
posicao_quadribol = aluno["posicao_quadribol"]
O código acima usa um loop for
para percorrer cada aluno na lista hogwarts_alunos
e extrair seus nomes, ano em Hogwarts, status de sangue e posição no Quadribol.
Esses detalhes serão usados na parte seguinte do código para determinar a qual casa cada aluno pertence com base nos critérios de classificação especificados.
E, como já dito, vamos usar if/else para esse trabalho:
if "Potter" in name:
alunos_por_casa["Grifinoria"].append(aluno)
elif status_sangue == "Sangue_puro" and posicao_quadribol in ["Apanhador"]:
alunos_por_casa["Sonserina"].append(aluno)
elif ano >= 4 and posicao_quadribol == "Goleiro":
alunos_por_casa["Grifinoria"].append(aluno)
elif ano == 6 and posicao_quadribol is None:
alunos_por_casa["Corvinal"].append(aluno)
else:
alunos_por_casa["Lufa-Lufa"].append(aluno)
Nessa parte do código, é utilizada uma série de instruções if, elif e else para avaliar diferentes condições para cada aluno de Hogwarts.
Dependendo do nome do aluno, ano, status de sangue e posição no Quadribol, eles são designados para a casa de Hogwarts apropriada.
O processo de seleção considera vários aspectos da formação e habilidades de cada aluno, levando isso em consideração ao classificar o aluno, de forma muito mais parecida com o mundo mágico de Hogwarts!
Os critérios são:
- Se o nome do aluno tiver “Potter”, ele será classificado para a Grifinória.
- Se o aluno tiver status de sangue como “Sangue_puro” e sua posição no quadribol for “Apanhador”, ele será designado para a Sonserina.
- Se o aluno estiver no quarto ano ou acima e sua posição no quadribol for “Goleiro”, ele será designado para a Grifinória.
- Se o aluno estiver no sexto ano e não tiver uma posição no quadribol, ele será designado para a Corvinal.
- Todos os outros alunos são designados para Lufa-Lufa.
E, após a lógica implementada, vamos imprimir o resultado:
for casa in hogwarts_casas:
casa_alunos = alunos_por_casa[casa]
print(f"{casa}:")
for aluno in casa_alunos:
print(f"- {aluno['name']}")
O trecho acima imprime o resultado geral; uma lista classificada de alunos de Hogwarts exibida por casa, com o nome de cada aluno listado sob o nome da casa correspondente.
Essa parte formata e mostra certinho os quais alunos pertencem a quais casas de Hogarts.
Resultado
E, no fim, basta chamar a função:
classificar_alunos_hogwarts()
Que terá como output:
Grifinoria:
- Harry Potter
- Ron Weasley
Lufa-Lufa:
- Luna Lovegood
- Neville Longbottom
- Cho Chang
Corvinal:
- Hermione Granger
Sonserina:
- Draco Malfoy
- Cedric Diggory
Que não ficou perfeito, mas ficou bem melhor que a versão passada!
Conclusão
Otimizamos um código já feito antes com uma lógica diferente e mais alinhada com a escola de magia e bruxaria de Hogwarts.
Sinta-se à vontade para personalizar ainda mais a lógica de classificação ou adicionar mais elementos do universo de Harry Potter.