Parâmetros ajudam a gente a modular o comportamento de uma função, e a gente já sabe como definir parâmetros simples, que são informados de forma posicional, e parâmetros de quantidade dinâmica, em que a gente consegue lidar com eles como se fosse uma coleção qualquer. Chegou a hora da gente ver como lidar com parâmetros que podem ou não virem para a nossa função. O que a gente vai ver agora são chamados QArgs, ou Keyword Arguments, que são argumentos que a gente passa no formato de dicionário. E para que eles servem? Imagina que você tem que trabalhar com a função que você tem um valor específico que tem que ser informado. Nesse cenário, você informa para ele um parâmetro simples, que sempre vai estar lá, e que se não for informado, o Python dá um erro. Por outro lado, se você tem uma lista de quantidade dinâmica, a gente vai ter que usar os args, para que a gente consiga manipular eles de forma dinâmica, sem se preocupar com a quantidade total. No entanto, a gente pode querer um parâmetro que vai estar ou não presente. Ou seja, ele é uma informação opcional. Se ele estiver presente, a gente faz alguma coisa com ele. Caso não, a gente não faz ou assume algum valor padrão. E para isso, a estrutura de dados mais adequada que a gente conhece é o dicionário, que é justamente o tipo entregue quando a gente usa os QArgs. Então, agora, vamos lá para o código e dar uma olhada em como esse cara funciona. Aqui no VS Code, a gente já tem um código de exemplo, que é uma função simples que exibe uma mensagem olá e algum nome que foi entregue. Se a gente exibir ela aqui, executar ela, na verdade, com o comando do Python, a gente vai ver exatamente isso na tela. Mas, imagina que a gente queira receber aqui a informação de se esse aluno Fez ou não um trabalho prático. Então, a gente precisa de uma informação que vai dizer para a gente, na verdade, a nota que ele tirou nesse trabalho prático. E se ele não tiver uma nota, não significa que ele tirou zero. Significa que ele não entregou. Tá bom? Então, vamos começar com isso. A gente poderia definir aqui duas variáveis. Uma para informar se ele Fez ou não um trabalho prático. E, para isso, a gente usaria o tipo booleano. E, depois, uma outra para especificar a nota. Mas, como a gente consegue usar os QArgs, a gente vai fazer isso de uma vez só, informando apenas a nota. Então, saca só. Eu vou colocar aqui a minha outra variável, que vai ser o meu outro parâmetro, que eu vou chamar de informações adicionais. E, nesse caso, para que o Python entenda que isso daqui é um QArgs e não uma variável simples, eu vou ter que colocar não um, mas, dessa vez, dois asteriscos no começo dela. Então, pronto. A partir de agora, se eu executar a aplicação sem mexer na invocação ou no conteúdo daquela função, o Python consegue executar isso sem problema nenhum. Porque ele já entendeu que isso se trata de um QArgs e que as informações que estão ali, elas são opcionais. Ou seja, eu posso informar ou não. Se a gente vier aqui dentro do bloco de código, vamos executar um print com aquele valor, só para a gente entender o formato que as coisas estão chegando aqui dentro. Eu vou copiar o nome da variável e, aqui, chamar a função nativa print, passando ela para a gente ver ali no terminal. Eu vou executar mais uma vez. E repara que a mensagem está aqui e que, aqui embaixo, dessa vez, eu tenho um dicionário, que é aquela estrutura que a gente usa baseada em chave e valor. Então, eu vou começar aqui, na invocação do método, passando valores para esse meu QArgs. E, para fazer isso, eu posso passar eles no formato de chaves. Ou seja, eu tenho que colocar o nome e o valor que eu quero para aquela chave. No nosso caso, vai ser a nota do trabalho prático, ou seja, nota tp. Então, por isso, eu vou colocar aqui nota tp, o sinal de igual e o valor que eu quero informar. Que, nesse caso, vai ser, por exemplo, 10. Eu vou só salvar o meu programa e executar de novo para a gente ver o que mudou. Aqui, a mensagem continua a mesma coisa, só que, dessa vez, repara que dentro do meu dicionário, eu tenho a chave nota tp com valor 10. E, a partir daqui, a gente já consegue trabalhar com essa informação. E é exatamente isso que a gente vai fazer aqui agora. Eu vou abrir um espacinho entre as duas mensagens e uma coisa que a gente tem que lembrar é que os QArgs são informações realmente opcionais. Então, a gente tem que lidar com o cenário delas estarem presentes ou não. E a estrutura do dicionário entrega formas de a gente lidar com isso sem problema algum. Então, eu vou, basicamente, antes de usar as informações daquele dicionário, ver se tem alguma informação dentro da chave que eu estou pretendendo usar. Então, para isso, a nossa regra vai ser a seguinte. Se a gente não tiver aquela chave, significa que o aluno não Fez o trabalho prático. E, por isso, eu vou, basicamente, exibir uma mensagem falando que a gente não encontrou tp. Vamos lá. Aqui dentro, eu vou começar com uma condicional para que eu veja se a chave nota tp está dentro daquela minha variável. Então, eu vou colocar aqui entre aspas, nota tp em informações adicionais. Ou seja, se aquela nota estiver dentro daquelas informações, então esse bloco de código vai ser executado. Mas como que eu quero exatamente o contrário, eu vou colocar uma negação aqui antes do in. Então, fica da seguinte forma. Se a chave nota tp não estiver dentro do dicionário informações adicionais, então eu quero exibir uma mensagem falando que o tp não foi encontrado. E como, a partir daqui, eu não quero executar mais nada, eu vou apenas escrever um return para que o Python entenda que eu não tenho que executar mais nada daqui para frente e saia dessa função. Vamos rodar aqui de novo o nosso terminal. Ou melhor, limpar o terminal e executar novamente a aplicação para a gente ver como que as coisas se comportam do jeito que está. Desse jeito aqui, a aplicação não entrou na condicional e seguiu adiante exibindo aquele nosso dicionário de informações adicionais. Mas se a partir de agora eu remover essa informação, ele entra na condicional e exibe a mensagem para a gente. Então eu vou voltar com ela daqui para que a gente coloque mais coisa aqui no fluxo do nosso programa. E a partir desse momento, a gente está trabalhando com a possibilidade de que a nota está sendo entregue. Então eu vou colocar um if para ver se essa nota é maior do que 7. Se for, então o aluno está aprovado. Se não for, então o aluno está reaprovado. Então eu vou começar com mais uma condicional e eu vou acessar o informações adicionais e usar o método get para pegar aquela chave. Qual que é a chave? a nota tp. Eu copio aqui e vejo se ela é maior do que 7. Se ela for maior do que 7, eu vou copiar aqui essa mensagem e eu vou editar para que ela seja. parabéns, você foi aprovado no tp. E eu também vou definir um caso padrão, que é o Else, para quando essa condicional não for atendida. E se esse for o caso, eu vou exibir a mensagem. Infelizmente, você não foi aprovado no tp. E pronto. Deixa eu só tirar essa mensagem aqui de baixo, limpar o terminal, e se a gente executa a nossa aplicação novamente, a gente tem a mensagem Olá aluno, que a gente não mexeu, e parabéns, você foi aprovado no tp. Se a gente abaixa um pouco essa nota aqui, para algo próximo de 10, mas um pouco abaixo de 7, por exemplo, 1, a gente vai ter a mensagem Infelizmente, você não foi aprovado no tp. E é dessa forma que a gente consegue preparar as nossas funções para que elas consigam lidar com informações opcionais, ou seja, que podem ou não serem formadas. Claro, a gente poderia também lidar com informações do tipo se a variável estiver com um valor vazio, ou se uma boleana estiver informando algo, então eu posso assumir que uma outra variável tem um valor. Mas está começando a ficar bem claro que isso ficaria muito complicado de dar manutenção e até mesmo de entender o que está acontecendo. E da mesma forma com que a gente tem diversas estruturas de dados, a gente também tem diversas possibilidades. Cada um atende um cenário e cabe a gente a decidir qual que é a melhor para o nosso caso de uso específico.