1
resposta

[Sugestão] Minha resolução

import asyncio

cursos = {
    "Python Avançado": {"vagas": 2, "inscritos": []},
    "Java para Iniciantes": {"vagas": 1, "inscritos": []},
    "Machine Learning": {"vagas": 0, "inscritos": []},
}
 
alunos = [
    {"nome": "Alice", "curso": "Python Avançado"},
    {"nome": "Bruno", "curso": "Python Avançado"},
    {"nome": "Carlos", "curso": "Java para Iniciantes"},
    {"nome": "Daniela", "curso": "Machine Learning"},
    {"nome": "Alice", "curso": "Python Avançado"},  # Tentativa de inscrição duplicada
]

async def inscrever_aluno(aluno):
    print(f'Iniciando inscrição do aluno {aluno["nome"]}...')

    # verificar curso que o aluno deseja se inscrever
    curso_desejado = aluno["curso"]
    print(f'O aluno {aluno["nome"]} deseja se inscrever no curso {curso_desejado}. Verificando vagas disponíveis...')
    await asyncio.sleep(2)

    # verificar se há vagas disponíveis, se não houver notificar o aluno
    curso = cursos[curso_desejado]

    if curso['vagas'] > 0:
        await asyncio.sleep(3)
        print(f'O curso {curso_desejado} possui {curso["vagas"]} vagas disponíveis. Verificando se o aluno {aluno["nome"]} já esta incrito...')
        print(f'Lista de alunos previamente inscritos no curso {curso_desejado}:')
        print(curso["inscritos"])

        if aluno['nome'] in curso['inscritos']:
            print(f'O aluno {aluno["nome"]} já está inscrito no curso {curso_desejado}.')

        else:
            curso['inscritos'].append(aluno["nome"])
            print(f'Aluno {aluno["nome"]} ainda não inscrito no curso {curso_desejado}. Realizando inscrição...')
            print(f'Aluno {aluno["nome"]} inscrito com sucesso no curso {curso_desejado}.')
            print('Atualizando o numero de vagas...')
            curso['vagas'] = curso['vagas'] - 1
            print(f'Restam {curso["vagas"]} vagas no curso {curso_desejado}.')
    else:
        print(f'O curso {curso_desejado} não possui mais vagas disponíveis. Não foi possível inscrever o aluno {aluno["nome"]}.')

# verificar se o aluno já está inscrito no curso desejado, se estiver, notificar o aluno

async def main():
    tarefas = [asyncio.create_task(inscrever_aluno(a)) for a in alunos]
    await asyncio.gather(*tarefas)
    print('\nSitualção final dos cursos: \n')
    for c in cursos:
        curso = cursos[c]
        vagas = curso["vagas"]
        inscritos = curso["inscritos"]
        print(f'{c} | Vagas: {vagas} | Inscritos: {inscritos}')

asyncio.run(main())
1 resposta

Oi, Guilherme! Como vai?
Agradeço por compartilhar seu código com a comunidade Alura.

Você usou bem o asyncio.sleep() para representar esperas e tratando bem casos como falta de vagas e inscrição duplicada, o que mostra uma boa compreensão da proposta da atividade e da lógica assíncrona. Continue assim!

Uma dica interessante para o futuro é usar o método setdefault() para organizar estruturas de dicionário de forma mais segura. Veja este exemplo:


dados = {}
dados.setdefault("alunos", [])
dados["alunos"].append("Ana")
print(dados)

Esse código garante que a chave exista antes de adicionar valores, evitando verificações manuais repetidas.

Qualquer dúvida que surgir, compartilhe no fórum. Abraços e bons estudos!

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!