Achei essa atividade muito bagunçada, não tem como fazer as validações de erro. Não escolheria esse tipo de entrada.
E depois ao ver que o objetivo era desempacotamento de tupla fiquei surpresa, nem tinha pensado em usar tuplas, fiz uma resolução diferente.
import msvcrt, os
def limpar_tela() -> None:
os.system("cls")
def pausa_limpa(texto) -> None:
print()
print(texto)
print("Aperte uma tecla para continuar", end="", flush=True)
msvcrt.getch()
limpar_tela()
def main() -> None:
alunos: list[str] = []
idades: list[int] = []
notas: list[float] = []
# João, 16, 8.5, Maria, 17, 9.2, Pedro, 15, 7.8
while True:
entradas = input("Digite os dados do aluno no formato Nome, Idade, Nota(colocar .0) separados por vírgula ou 's' para sair: ").strip()
if entradas.casefold() in ["s", "sair"]:
print("Fim do programa")
break
if not entradas:
pausa_limpa("Entrada vazia.")
return
if entradas:
for entrada in entradas.split(","):
if isinstance(entrada, str):
nome_valido = validar_string(entrada)
alunos.append(nome_valido)
elif isinstance(entrada, int):
idade_valida = validar_idade(entrada)
idades.append(idade_valida)
elif isinstance(entrada, float):
nota_valida = validar_nota(entrada)
notas.append(nota_valida)
imprimir_dados(alunos, idades, notas)
def validar_idade(entrada: str) -> int:
try:
idade = int(entrada)
except ValueError:
raise TypeError("Deve ser um número inteiro.")
if idade < 0 and idade > 100:
raise ValueError("Insira uma idade válida.")
return idade
def validar_string(nome: str) -> str:
if not isinstance(nome, str) or nome.isdigit():
raise TypeError("O nome deve ser uma string.")
if not nome.strip():
raise ValueError("O nome não pode estar vazio.")
return nome.strip().title()
def validar_nota(entrada: str) -> float:
try:
nota = float(entrada)
except ValueError:
raise TypeError("Deve ser um número decimal.")
if nota < 0 or nota > 10:
raise ValueError(f"Insira uma nota valida, entre 0 e 10.")
return nota
def imprimir_dados(lista_nome: list[str], lista_idade: list[int], lista_nota: list[float]) -> None:
for nome in lista_nome:
print(f"Nome: {nome}")
for idade in lista_idade:
print(f"Idade: {idade}")
for nota in lista_nota:
print(f"Nota: {nota:.2f}")
if __name__ == "__main__":
main()