0:00:07.990,0:00:10.580 Quando a gente está implementando[br]alguma coisa nova, 0:00:10.580,0:00:13.170 a gente nunca constrói [br]tudo do zero. 0:00:13.170,0:00:15.230 Então, nessa brincadeira [br]de reaproveitar 0:00:15.230,0:00:16.442 o que já está feito, 0:00:16.442,0:00:18.232 a gente começa a conversar sobre[br]função nativa para cá e para lá, 0:00:18.232,0:00:22.352 e agora finalmente chegou[br]o momento da gente entender 0:00:22.352,0:00:23.503 o que são funções,[br]para que servem 0:00:23.503,0:00:25.386 e construir a nossa primeira. 0:00:25.386,0:00:26.328 Como a gente já comentou, 0:00:26.328,0:00:30.080 a gente consegue reaproveitar [br]bastante coisa no desenvolvimento 0:00:30.080,0:00:31.988 e tem vários motivos[br]para fazer isso. 0:00:31.988,0:00:34.914 Se a gente quisesse, 0:00:34.914,0:00:36.377 a gente até poderia fazer [br]isso tudo do zero, 0:00:36.377,0:00:37.840 mas tem alguns problemas [br]nessa abordagem. 0:00:37.840,0:00:39.005 Imagina que dentro [br]da sua aplicação, 0:00:39.005,0:00:42.361 você tem que exibir uma mensagem[br]para algum usuário. 0:00:42.361,0:00:43.770 Dentro dessa mensagem, 0:00:43.770,0:00:45.889 você provavelmente [br]vai ter o nome do usuário 0:00:45.889,0:00:48.502 e alguns elementos extras, [br]como um prefixo ou sufixo, 0:00:48.502,0:00:49.809 alguma coisa desse tipo. 0:00:49.809,0:00:51.909 Pronto, esse seu código [br]vai funcionar mais, 0:00:51.909,0:00:54.391 felizmente ou, infelizmente, [br]mais para frente no seu código, 0:00:54.391,0:00:57.042 você vai ter que repetir [br]aquele mesmo comportamento. 0:00:57.042,0:00:59.830 E conforme sua aplicação [br]for crescendo, 0:00:59.830,0:01:05.670 provavelmente em outros lugares [br]você vai ter que fazer isso também. 0:01:05.670,0:01:07.025 E não só nesse arquivo,[br]mas em vários outros arquivos. 0:01:07.025,0:01:11.815 E agora você já está começando[br]a enxergar qual que é o problema. 0:01:11.815,0:01:14.256 Não só a gente não está conseguindo [br]reaproveitar aquele código, 0:01:14.256,0:01:16.772 porque ele está espalhado [br]no meio da nossa aplicação, 0:01:16.772,0:01:19.207 como se a gente precisar [br]trocar aquele comportamento 0:01:19.207,0:01:21.464 para adicionar ou remover[br]alguma característica, 0:01:21.464,0:01:23.786 isso vai ser muito complicado, 0:01:23.786,0:01:26.212 porque a gente vai ter que depender[br]de ferramentas de busca 0:01:26.212,0:01:28.896 para procurar algum [br]trecho de código 0:01:28.896,0:01:31.580 e então alterá-lo[br]em todos os lugares. 0:01:31.580,0:01:34.347 É muito fácil a gente acabar [br]esquecendo um ou dois lugares 0:01:34.347,0:01:37.114 e, com isso, injetar[br]bugs no nosso programa. 0:01:37.114,0:01:39.908 Para resolver esse problema,[br]a gente tem as funções, 0:01:39.908,0:01:42.608 que é a porta de entrada[br]para o tema de abstração. 0:01:42.608,0:01:45.500 Com elas, a gente consegue criar blocos [br]de código parametrizáveis 0:01:45.500,0:01:48.641 e executar uma lógica específica[br]quantas vezes a gente quiser. 0:01:48.641,0:01:51.591 Funções existem basicamente[br]todas as linguagens, 0:01:51.591,0:01:54.541 de uma forma ou de outra. 0:01:54.541,0:01:57.334 E a característica principal[br]delas é isolar bloco de código 0:01:57.334,0:01:58.731 para reaproveitamento. 0:01:58.731,0:02:03.038 Sendo assim, a gente consegue [br]implementar o que a gente quiser 0:02:03.038,0:02:06.150 e dar manutenção [br]em um só lugar do nosso código. 0:02:06.150,0:02:08.387 Se a gente precisar alterar [br]um comportamento, 0:02:08.387,0:02:10.232 basta alterar dentro [br]daquela função 0:02:10.232,0:02:12.078 e aonde ela estiver[br]sendo referenciada, 0:02:12.078,0:02:14.550 o comportamento [br]vai ser atualizado também. 0:02:14.550,0:02:15.654 Legal. 0:02:15.654,0:02:17.462 Agora que você entendeu a motivação [br]e, mais ou menos, 0:02:17.462,0:02:19.493 a ideia por trás das funções,[br]vamos ver, na prática, 0:02:19.493,0:02:21.524 como que isso funciona no Python. 0:02:21.524,0:02:23.090 Então, vamos lá para o código. 0:02:23.090,0:02:25.550 Aqui no VS Code, eu já tenho [br]o meu arquivo main.py criado. 0:02:25.550,0:02:28.010 Então, vamos começar[br]definindo a nossa função. 0:02:28.010,0:02:30.520 E, para isso, eu vou usar[br]a palavra reservada def. 0:02:30.520,0:02:32.684 Cada linguagem de programação[br]tem a sua forma de fazer 0:02:32.684,0:02:34.848 e é assim que a gente faz no Python. 0:02:34.848,0:02:37.096 Eu vou começar, então, aqui colocando [br]o nome da minha função, 0:02:37.096,0:02:39.345 que vai ser exatamente [br]minha função. 0:02:39.345,0:02:42.360 A gente pode mudar isso [br]no futuro sem problema nenhum. 0:02:42.360,0:02:45.109 E, para que o Python entenda,[br]de fato, que isso é uma função, 0:02:45.109,0:02:47.371 eu vou colocar aqui[br]os parênteses e os dois pontos. 0:02:47.371,0:02:48.564 Pronto. 0:02:48.564,0:02:50.456 A partir de agora, 0:02:50.456,0:02:52.348 eu estou livre para desenvolver [br]o corpo da minha função. 0:02:52.348,0:02:53.889 Ou seja, o que eu quero[br]que seja executado 0:02:53.889,0:02:56.392 quando essa função for invocada. 0:02:56.392,0:02:59.235 No nosso exemplo, a gente vai[br]colocar apenas um print, 0:02:59.235,0:03:02.842 escrevendo alguma mensagem[br]simples, como, por exemplo, 0:03:02.842,0:03:04.646 "olá, aluno". 0:03:04.646,0:03:06.450 E salvar o arquivo. 0:03:06.450,0:03:09.563 Nesse momento, a gente já pode[br]executar a nossa aplicação 0:03:09.563,0:03:11.860 usando o python.exe[br]e o nome do arquivo. 0:03:11.860,0:03:13.581 Veja só. 0:03:13.581,0:03:16.555 Aqui no terminal,[br]eu vou escrever python.exe, 0:03:16.555,0:03:19.530 ponto barra e o nome do meu arquivo. 0:03:19.530,0:03:21.572 Ponto barra, main.py. 0:03:21.572,0:03:24.661 E se eu der um enter, 0:03:24.661,0:03:26.205 repara que a aplicação [br]até executou, 0:03:26.205,0:03:27.750 mas não aconteceu nada [br]de muito interessante. 0:03:27.750,0:03:30.270 Isso foi, basicamente, [br]porque eu declarei a minha função, 0:03:30.270,0:03:32.790 mas eu não invoquei[br]ela em lugar algum. 0:03:32.790,0:03:35.298 Lembra, funções são[br]blocos de abstração. 0:03:35.298,0:03:36.699 Eu consigo escrever [br]código lá dentro, 0:03:36.699,0:03:38.520 mas ele só é executado, [br]de fato, 0:03:38.520,0:03:40.877 quando eu invoco [br]essa função. 0:03:40.877,0:03:43.235 Então, vamos lá,[br]aqui no nosso código. 0:03:43.235,0:03:46.185 E aqui embaixo, eu vou[br]invocar essa função. 0:03:46.185,0:03:47.424 Para fazer isso, 0:03:47.424,0:03:49.427 basta eu executar [br]o nome dessa função 0:03:49.427,0:03:51.430 e colocar aqui os parênteses. 0:03:51.430,0:03:53.438 Dessa forma, eu estou[br]pedindo para o python 0:03:53.438,0:03:56.310 para que ele pegue e execute[br]aquele bloco de código. 0:03:56.310,0:03:59.315 Se eu rodar novamente [br]o meu programa, dessa vez sim, 0:03:59.315,0:04:02.620 a gente tem a mensagem[br]"olá, alunos", sendo exibida. 0:04:02.620,0:04:04.018 E bacana, a nossa função [br]está funcionando, 0:04:04.018,0:04:06.154 mas ela ainda não tem [br]muita funcionalidade 0:04:06.154,0:04:08.290 na nossa aplicação. 0:04:08.290,0:04:10.943 Porque uma das[br]características de funções 0:04:10.943,0:04:13.670 é ter a capacidade[br]de ser parametrizada. 0:04:13.670,0:04:15.392 Ou seja, a gente deve,[br]dependendo do cenário, 0:04:15.392,0:04:18.328 conseguir manipular [br]o comportamento dela 0:04:18.328,0:04:21.265 baseado em informações externas. 0:04:21.265,0:04:23.183 E isso a gente faz justamente através[br]de parâmetros. 0:04:23.183,0:04:25.976 No Python, a gente consegue definir [br]uma lista de parâmetros 0:04:25.976,0:04:28.770 que essa função recebe, 0:04:28.770,0:04:30.827 semelhante à própria[br]funcionativa print. 0:04:30.827,0:04:31.836 Se a gente quiser [br]executar ela, 0:04:31.836,0:04:34.584 a gente tem que mandar[br]um string, ou seja, 0:04:34.584,0:04:37.155 um texto que vai ser[br]exibido no terminal. 0:04:37.155,0:04:40.295 É assim que a gente controla[br]o comportamento da função print, 0:04:40.295,0:04:44.215 parametrizando para ela a mensagem[br]que a gente quer que seja exibida. 0:04:44.215,0:04:47.426 No nosso caso, o que a gente [br]vai fazer é adicionar um parâmetro 0:04:47.426,0:04:49.588 para que a gente informe[br]o nome que a gente 0:04:49.588,0:04:51.750 quer que esteja[br]dentro da mensagem. 0:04:51.750,0:04:52.567 Entendeu? 0:04:52.567,0:04:53.385 Então, vamos lá. 0:04:53.385,0:04:56.450 Aqui no nosso código, então,[br]eu vou começar entre os parênteses, 0:04:56.450,0:04:59.490 colocando o meu parâmetro,[br]que eu vou chamar de nome. 0:04:59.490,0:05:01.873 E no Python, a gente[br]tem a tipagem dinâmica. 0:05:01.873,0:05:05.435 Isso significa que eu posso[br]deixar o meu código dessa forma, 0:05:05.435,0:05:09.190 e em tempo de execução, o Python[br]vai saber o tipo dessa variável. 0:05:09.190,0:05:11.240 Mas caso eu queira deixar[br]mais claro para algum desenvolvedor 0:05:11.240,0:05:15.240 que pegar o nosso código,[br]eu posso colocar aqui do lado, 0:05:15.240,0:05:18.550 na frente dos dois pontos, [br]o tipo str. 0:05:18.550,0:05:22.300 Lembra, isso não vai mudar[br]na prática nada dentro da linguagem, 0:05:22.300,0:05:24.300 mas vai fazer com que alguém[br]que pegue meu código 0:05:24.300,0:05:26.850 entenda que eu estou esperando[br]que ele mande um string. 0:05:26.850,0:05:30.540 Se ele mandar um número, o Python[br]não vai reclamar nesse momento. 0:05:30.540,0:05:32.565 Mas eu estou informando para ele [br]que o comportamento esperado 0:05:32.565,0:05:34.590 é que ele mande um texto. 0:05:34.590,0:05:35.950 Tá bom? Então vamos lá. 0:05:35.950,0:05:38.340 Agora que dentro do contexto [br]da minha função eu tenho essa variável, 0:05:38.340,0:05:40.730 eu posso usar ela. 0:05:40.730,0:05:43.090 Então eu vou basicamente[br]copiar ela aqui 0:05:43.090,0:05:45.450 e remover a palavra aluno [br]da minha mensagem, 0:05:45.450,0:05:47.720 porque agora eu vou fazer[br]uma concatenação simples. 0:05:47.720,0:05:49.865 E para isso, eu vou colocar [br]aqui na frente do sinal de mais 0:05:49.865,0:05:52.010 a variável nome. 0:05:52.010,0:05:53.890 E vamos ver o que acontece[br]se eu executar o meu código 0:05:53.890,0:05:55.770 do jeito que ele está. 0:05:55.770,0:05:57.367 Pronto. 0:05:57.367,0:05:59.723 A gente agora tem um erro, [br]porque eu defini um parâmetro 0:05:59.723,0:06:02.080 e ele é um parâmetro posicional. 0:06:02.080,0:06:04.536 Ou seja, eu posso definir[br]vários parâmetros. 0:06:04.536,0:06:07.235 A ordem com que eu passar[br]eles vai ser a ordem 0:06:07.235,0:06:09.257 com que o Python vai alocá-los[br]dentro das variáveis. 0:06:09.257,0:06:11.280 Vamos lá. 0:06:11.280,0:06:14.420 Isso significa que se eu tivesse[br]uma outra variável aqui, 0:06:14.420,0:06:18.330 por exemplo, idade, eu teria[br]que passar aqui embaixo, 0:06:18.330,0:06:19.866 dentro da invocação[br]da minha função, 0:06:19.866,0:06:22.178 a primeira variável [br]que é o nome. 0:06:22.178,0:06:24.490 Por exemplo, aluno. 0:06:24.490,0:06:27.490 E se eu quiser passar idade,[br]eu coloco aqui na frente. 0:06:27.490,0:06:29.873 Repara que a própria IDE [br]já vai dando dicas para a gente 0:06:29.873,0:06:32.575 de como que a gente está[br]esperando receber os valores. 0:06:32.575,0:06:35.402 Mas no nosso cenário, a gente[br]só vai ter um parâmetro. 0:06:35.402,0:06:37.280 Então eu vou remover a idade. 0:06:37.280,0:06:40.510 E se a gente executa novamente[br]o nosso código, agora sim. 0:06:40.510,0:06:43.940 A gente tem a mesma mensagem[br]de antes, mas um pouco diferente. 0:06:43.940,0:06:46.570 Porque essa mensagem agora,[br]ela está parametrizável. 0:06:46.570,0:06:48.990 Ou seja, a gente consegue [br]controlar o comportamento 0:06:48.990,0:06:51.410 daquela função do lado de fora. 0:06:51.410,0:06:53.635 E se eu quiser usar essa função [br]quantas vezes eu quiser, 0:06:53.635,0:06:55.860 eu posso sem problema nenhum. 0:06:55.860,0:06:57.860 Então, imagina, por exemplo,[br]que aqui embaixo 0:06:57.860,0:07:00.040 eu vou querer executar[br]ela mais duas vezes. 0:07:00.040,0:07:01.528 Só que dessa vez,[br]colocando aluna, 0:07:01.528,0:07:04.099 e aqui embaixo, 0:07:04.099,0:07:06.670 talvez você esteja[br]sentindo falta disso. 0:07:06.670,0:07:07.963 Então, mundo, 0:07:07.963,0:07:11.710 se eu limpar o meu terminal[br]e executar novamente a aplicação, 0:07:11.710,0:07:14.730 a gente vê que a gente tem[br]as três exibições daquela função, 0:07:14.730,0:07:16.735 sendo que cada uma delas [br]reaproveitou o código 0:07:16.735,0:07:19.784 que a gente definiu na função,[br]mas foi parametrizado 0:07:19.784,0:07:22.290 para que o comportamento[br]fosse diferente. 0:07:22.290,0:07:23.659 Incrível, né? 0:07:23.659,0:07:25.029 A gente construiu uma função simples, 0:07:25.029,0:07:27.870 mas as funções estão[br]por todo lugar na linguagem. 0:07:27.870,0:07:30.348 Sejam funções nativas[br]ou funções de pacote que a gente 0:07:30.348,0:07:32.850 vai uma hora ou outra[br]até que acabar usando. 0:07:32.850,0:07:36.290 Dá uma explorada nesse código aqui[br]e tenta melhorar ele um pouco. 0:07:36.290,0:07:39.030 Tenta adicionar um outro parâmetro, [br]um outro tipo, 0:07:39.030,0:07:41.770 faz condicionais lá dentro, [br]loops, quem sabe. 0:07:41.770,0:07:42.845 Experimenta. 0:07:42.845,0:07:45.651 Ganha afinidade com essa sintaxe aqui [br]e vamos ver até onde você chega.