Bom dia, boa tarde ou boa noite, dependendo do horário que você está assistindo esse vídeo. Agora vamos aprender conceito muito importante computação, muito importante desenvolvimento de software, programação, que são as funções. As funções de computação, de programação, elas são similares àquelas funções de matemática, quando a gente por exemplo diz que f de x é igual a x ao quadrado. Então uma função é alguma coisa que ela recebe parâmetros, recebe alguns valores, ela faz algum cálculo, algum processamento com esses valores e devolve algum valor. E computação a gente tem funções que funcionam de uma forma semelhante a essas funções da matemática, e é muito útil porque é uma forma de a gente agrupar pedaços de código. Por que isso pode ser importante? Os programas de software que nós vamos desenvolver, até o momento eles eram muito pequenininhos, tinham poucas linhas de código. Mas à medida que os sistemas vão ficando mais complexos, os problemas ficam mais completos, complexos, são muitas linhas de código, Python no nosso caso, que precisam ser escritas. E para organizar essas linhas de códigos, nós quebramos esse código pedaços menores, módulos menores que nós chamamos de funções. Então para a coisa ficar pouquinho mais concreta, vamos abrir aqui o Idle e ver como isso funciona na prática. Então eu vou abrir aqui novo arquivo e vamos digitar nossa primeira função. Então o que a gente vai fazer é definir uma nova função e depois ver como a gente pode usar essa função que a gente definiu. Então vamos começar com uma função muito simples. Por exemplo, uma função para somar dois números. Então pode fazer aqui def, esse comando def é uma palavra reservada na linguagem Python que serve para, quer dizer que estou definindo novo conceito, nesse caso definindo uma função e eu vou chamar essa função de soma. Essa função soma vai receber dois parâmetros, dois valores que eu vou passar para ele como parâmetro, e eu vou chamar de x e y, poderia ser qualquer nome aqui de variável que eu determino. Eu vou chamar de x e y. Daí eu vou fazer dois pontos e aqui na linha de baixo eu vou definir uma série de comandos, uma computação que vai ser realizada. Nesse caso da função soma é uma coisa muito trivial, muito simples, eu vou dizer que essa função soma ela vai retornar, ela vai devolver o valor que é a soma de x mais y. E para dizer isso, que ela devolve o valor de x mais y, eu escrevo aqui return devolvo x mais y. Então simplesmente, pronto, definimos uma função soma que devolve x mais y. Depois que eu defini essa função soma aqui no meu arquivo, eu posso usar essa função soma de várias formas diferentes. Então eu posso pedir, por exemplo, imprima qual é o valor da soma de 10 com 20. Ou imprima o valor da soma de menos 20 com 100. Então escrever aqui pequeno programinha Python, que primeiro define uma função soma e depois usa essa função soma duas vezes. Então eu vou salvar isso aqui arquivo, eu vou chamar de só de brincadeira, func.py, só para que estou manipulando funções, e daí eu posso executar esse meu programa. Eu vou escrever aqui, escolher a opção Run Module para executar e ele executou aqui, olha, está vendo, executou func.py e ele imprimiu 30 e 80, por quê? Quando o interpretador interpretou esse arquivo que eu digitei, primeiro ele interpretou o seguinte, existe uma nova função soma, que recebe dois parâmetros x e y e o que essa função faz? Ela devolve a soma, ela calcula x mais y e devolve essa valor. Então o interpretador definiu essa nova função. Logo aqui seguida, eu chamei essa função duas vezes, passando primeiro os parâmetros 10 e 20, depois os parâmetros menos 20 e 100, e ambos os casos o valor devolvido pela soma eu mandei imprimir, por isso apareceu impresso aqui 30 e 80. Então aqui nesse ambiente, não só imprimiu o 30 e 80 como ele, como eu estou dentro aqui do ambiente que está executando esse arquivo aqui. A partir desse momento aqui já está definida a função soma, então se eu quiser interativamente trabalhar com essas funções que eu defini, eu posso também digitar comando interativamente, então eu posso dizer, qual é o valor da soma. Ele até já mostrou aqui que soma recebe x e y como parâmetro, apareceu isso aqui, o Idle é inteligente o suficiente para mostrar quais são os parâmetros que eu preciso digitar. Então qual é a soma de dois, três, quatro, cinco com quatro, cinco, três, dois, não quatro, três, dois. Qual é a soma? Daí eu vou bater enter e ele vai calcular aquela soma e vai devolver o valor, e nesse caso, esse interpretador aqui, ele já imprime aqui, logo aqui embaixo o valor que é devolvido pela função soma. Eu posso até brincar de fazer coisas mais complexas, eu por exemplo faço soma e daí o primeiro parâmetro já ser algo mais sofisticado, por exemplo 20 vezes 32 e o segundo parâmetro eu vou fazer algo mais complicado ainda, eu vou chamar, como segundo parâmetro, eu vou chamar de novo a função soma aqui, soma de 3,4, daí fecha parênteses, os dois parênteses. Bato enter, deu 647. O que é que ele fez nesse caso? Ele fez 20 vezes 32, guardou esse valor, daí depois ele pegou o três e o quatro, passou para a função soma, isso aqui vai devolver sete. Daí ele pegou esse sete e somou o resultado de 20 vezes 32, por isso deu a soma final 647. Eu posso vir aqui, outra coisa interessante, eu posso mudar a implementação, então eu posso mudar essa soma de x e y e dizer que são três números que eu vou somar. Daí vai ser x mais y mais z. E daí aqui eu vou colocar três números, 30 e aqui 200, daí eu salvo e mando executar de novo, aqui Run Module. Aí deu outros valores aqui, eu posso aqui brincar agora com a função soma, só que agora eu preciso, ele já mostrou que são três parâmetros que eu preciso passar, x, y e z. Então, 10, 20, 30, a soma disso dá 60. Vamos definir mais funções, fora essa função soma x, y e z, vamos definir também uma multiplica. Multiplica, que recebe também três parâmetros só de exemplo, podia ser outro número os parâmetros, mas por exemplo, return x vezes y vezes z. Eu vou tirar esses comandos daqui, porque a gente vai digitar interativamente, então eu vou salvar isso aqui e vou mandar executar. Ao executar ele simplesmente definiu as duas funções, mas como eu não chamei nenhuma função ainda, ele não imprimiu nada porque nada foi executado. Então eu vou imprimir aqui agora. Lembra, a soma continua existindo, só que agora eu defini também a multiplica. Daí eu posso, ele já mostrou que são três parâmetros e eu posso multiplicar 20 vezes 30 vezes 100. Dá esse número aí. E agora eu posso misturar as duas, então eu quero, vou fazer multiplica, quero que multiplique a soma de 10, de 20 vírgula 40 com a soma de 65 com três, com dois, eu esqueci aqui são três parâmetros, no primeiro eu tinha colocado só dois parâmetros, são três parâmetros. Falta sete aqui. E agora o terceiro eu quero que você multiplique dois, três, quatro, agora fecha parêntese, fecha outro parêntese, uma expressão bem sofisticada, essa expressão vai chamar dois, três quatro funções e ele faz tudo isso e dá esse resultado todo, então na verdade, para essa linha, quando o interpretador executou essa linha, ele executou a função soma duas vezes e a função multiplica duas vezes, primeiro aqui e depois aqui. Então arquivo ponto py de Python a gente pode definir várias funções diferentes. Note que eu mostrei aqui o exemplo mais comum de uma função, que ela tem determinado conjunto de parâmetros, tem esses nomes x, y e z que eu escolhi, poderia ser qualquer nome aqui e ela devolve o valor, mas a gente pode ter uma função, uma função mais simples que não devolve valor nenhum. Então deixa eu pensar aqui, por exemplo, nome do seu time. Então pode ter uma função nome do seu time que não recebe nenhum parâmetro, e daí para indicar isso, você coloca abre e fecha parênteses aqui sem sem nada dentro, ele está querendo dizer que essa função não recebe nenhum parâmetro e ela devolve algum valor. Eu vou colocar o nome do meu time aqui, na verdade eu vou colocar só a sigla. Então, pronto eu defini uma nova função. deixa eu salvar aqui e executar, daí a função passa a existir aqui nesse contexto. E daí, se eu perguntar aqui: nome do seu time, esse é o nome da função, nome_do_seu_time, isso. Se eu fizer nome_do_seu_time aqui abre e fecha parêntese, ele devolve ali string contendo o nome do meu time e você pode mudar a implementação da função para o seu time preferido, o seu time do coração. Então, esse aqui é o exemplo de uma função que não recebe nenhum parâmetro, ela sempre devolve determinado valor. A gente pode ter outro tipo de função, que é uma função que não devolve nada. Então eu posso ter uma função aqui, def, uma função quieta, porque é uma função que, por exemplo, ela pode fazer algo, x recebe 10 mais 20, essa seria uma função que ela funciona, ela faz determinado cálculo mas na verdade, particular este exemplo aqui é uma função meio inútil, porque ela, eu vou chamar aqui a quieta, ela trabalha quietinha, não faz nada, não devolve nada, não imprimiu nada, então nesse caso não tem muita utilidade. Mas a gente poderia ter uma função que faz outras coisas, altera outras variáveis, o que seria útil, ou até, por exemplo uma função que calcula alguma coisa e depois imprime, vez de devolver com o return, ela imprime para o usuário alguma mensagem. Ela poderia imprimir o valor de x por exemplo. [INAUDÍVEL] o valor calculado é, se eu fizer isso aqui e depois executar aqui e a gente chamar a quieta, quieta. Aqui, o valor calculado é 30. A quieta agora deixou de ser quieta, ela está falando mais pouquinho. Então, só para mostrar que uma função pode devolver ou não algum valor e ela pode receber ou não parâmetros. O exemplo mais completo é a que ela recebe certo número de parâmetros, que você define aqui os nomes, que são variáveis que você passa a criar e existir somente dentro dessa função e ela devolve algum valor. Tem uma coisa interessante para observar nesse exemplo, o x, y, z da função soma não tem nada a ver com o x, y, z da função multiplica, são variáveis diferentes. A gente diz que elas estão escopos diferentes. Então, quando eu estou calculando essa linha x mais y mais z, eu estou me referindo ao que é passado como parâmetro aqui para a função soma, que são variáveis diferentes dessas variáveis x, y, z da multiplica. Então se eu atribuir valor para a variável x aqui, não altera o valor da variável x aqui, cada uma tem o seu escopo diferente. Então, era isso o que a gente tinha para aprender sobre funções básicas. Mas eu vou deixar aqui para vocês dois exercícios que eu quero que vocês pratiquem. Uso muito importante de funções é a gente eliminar duplicação ou triplicação de código, quando o mesmo código, o mesmo trecho de programa aparece igual lugares diferentes. Então eu vou pegar como exemplo, tem uma matéria do Ensino Médio que a gente aprende isso aqui, o coeficiente binomial, do binômio de Newton por exemplo, que é: se eu quero calcular isso aqui n k k, o número, se eu tenho n elementos e eu quero saber quantas possibilidades de ter grupos, subgrupos desses elementos de k, de tamanho k, quantos são os tipos possíveis, qual é o número possível de grupos diferentes. Eu tenho que fazer esse cálculo n k k. E a gente aprende no Ensino Médio que tem essa fórmula aqui que indica que n k k é n fatorial dividido por k fatorial vezes n menos k fatorial. Note que nessa função aqui para calcular isso aqui, esse n k k, eu preciso calcular fatorial 3 vezes. Então se eu fosse escrever único código ali Python para calcular isso, eu teria que pegar aquele trecho do fatorial e escrever quase idêntico três vezes, só está mudando aqui o parâmetro: uma vez é o n, outra vez é o k, outra vez é o n menos k. Mas o cálculo do fatorial é sempre igual. Então, para evitar que esse código seja repetido três vezes, o que a gente faz? A gente coloca o cálculo do fatorial dentro de uma função que a gente coloca bom nome para ela, por exemplo, fatorial. A gente define uma função fatorial chamada, quer dizer, chamada fatorial e que vai ter dentro dela o código de cálculo de fatorial. O fatorial recebe parâmetro, que é o número que a gente quer calcular o fatorial e devolve valor inteiro, porque fatorial devolve o valor inteiro. E daí sim a gente pode fazer uma outra função, que seria esse coeficiente binomial ou número binomial, que vai chamar a função fatorial três vezes. Então esse é o primeiro exercício para vocês. Eu quero que vocês façam essa função chamada número binomial que vai chamar a função fatorial três vezes. Para isso vocês vão ter que implementar a função fatorial também. Então eu quero que vocês façam essas dois funções, esse é o primeiro exercício. E o segundo exercício é o seguinte: há tempo atrás, a gente fez programinha Python para calcular a fórmula de Bhaskara que, dada uma equação de 2º grau, os coeficientes a, b e c da equação de 2º grau, a gente calcula as raízes reais daquela equação de 2º grau. Só que o código ficou pouco comprido demais. Eu queria que você reorganizasse aquele código, de forma a quebrar aquele código comprido pedaços menores e cada pedaço vai ser então uma função diferente. Então reorganizar o nosso código Python que calcula as raízes pequenas funções, de forma que uma função chame a outra e o código fique mais organizado elementos menores, funções com menos linhas de código, de forma que seja mais fácil de alguém que está olhando o nosso programa entender. Então ficam essas duas lições para vocês. [MÚSICA] [MÚSICA] [MÚSICA]