A gente deu nosso primeiro passo
no reaproveitamento de código
com as funções e entendeu
também como usar os parâmetros.
Mas agora está na hora
da gente dar uma olhada
em um outro tipo de parâmetro
que permite que a gente informe dados
de uma forma um pouco diferente.
Está na hora da gente
olhar um pouco os args.
A gente já sabe que as funções
servem para que a gente isole
e reaproveite o código,
e que a gente também pode
informar parâmetros para elas.
Não há necessariamente
uma quantidade limite
de parâmetros
que a gente pode informar,
desde que a gente especifique
eles corretamente
na assinatura do método.
E calma.
Quando a gente fala assinatura
do método,
a gente está basicamente
falando daquela primeira linha,
aonde a gente define o nome
e os parâmetros da função,
que, por acaso, a gente pode
especificar quantos a gente quiser.
Basta que a gente coloque
os seus nomes adequados.
Por exemplo, nome, idade
ou qualquer outra informação
que a gente queira usar dentro
daquela função.
E, lembra, o nome que a gente
colocar na assinatura
é como a gente vai referenciá-las
dentro do bloco da função.
Na maioria dos casos,
a gente vai ter bem claro
quais são as informações
que a gente precisa
para executar um determinado
bloco de código
dentro de uma função.
E isso, na verdade, é a regra.
A gente precisa saber
quais são as informações
para que a gente saiba
como lidar com elas dentro do código.
Mas existem alguns
cenários em que,
embora a gente saiba quais
informações a gente precisa,
a gente não sabe exatamente
quantas informações vão vir.
E calma, eu sei que está um pouco
confuso, mas você já já vai entender.
Imagina que você tem uma função
que tem que receber um nome
e exibir uma mensagem
com esse nome.
Está bem claro aqui como
é que as coisas vão funcionar.
Dentro dos parâmetros, a gente vai
ter uma variável que representa o nome
e a gente vai usar
ela dentro da nossa função.
Simples.
Por outro lado, imagina que a gente
vai calcular alguma média.
A gente sabe como é feito
o cálculo de média.
A gente soma, por exemplo,
todas as notas de um aluno
e divide essa somatória
pela quantidade de notas totais.
A gente pode, sem problema nenhum,
implementar uma função
que recebe dois valores.
A gente vai, então, pegar
esses valores, somar,
e o que der de resultado,
a gente divide por dois.
Mas pensa aqui comigo.
A gente está trabalhando com Python,
e diversas possibilidades
estão na palma da nossa mão.
Então, por que, ao invés de a gente
implementar uma função
que lida com duas notas,
a gente implementa uma função
que lida com qualquer
quantidade de notas
que a gente quiser informar?
Vamos lá, então.
Aqui no VS Code, a gente
já tem um código inicial,
que é aquele nosso primeiro
exemplo que a gente comentou.
A gente tem uma função simples,
que recebe um parâmetro,
e ele é usado aqui para montar
alguma mensagem.
Se a gente exibir
aqui o nosso código,
ou melhor, executar
o nosso código,
a gente consegue ver que a mensagem
é exibida com sucesso,
e na invocação da função,
a gente passa apenas um parâmetro,
que no nosso caso
é o valor mundo.
Olha o que acontece se a gente
tentar passar aqui, por exemplo,
um outro valor.
Por exemplo, aluno,
que é uma outra string.
Repara que o Python dá um erro,
porque a gente especificou
que essa função recebe
apenas um argumento, ou seja,
um parâmetro,
mas dois foram informados.
E é exatamente o que a gente
vai querer fazer já já.
Eu vou começar, então,
editando o nome dessa função
para que faça mais sentido
com o que a gente quer fazer.
Aqui no nosso caso é fazer
o cálculo de uma média.
Então eu vou vir aqui
e vou editar o nome dela
para ficar calcular média.
E pronto.
Ao invés de um nome,
eu vou receber as notas aqui.
E é aqui que vem a chave.
Quando eu especifico os meus
parâmetros dessa forma,
eu estou informando para o Python
parâmetros posicionais
com uma quantidade
específica de itens.
Mas agora a gente vai usar
uma técnica chamada args do Python,
que permite que a gente informe para ele
que esse parâmetro
é um parâmetro especial
e que vai receber uma quantidade
não exata de itens.
E para isso, basta a gente colocar
o asterisco aqui no começo do nome.
E pronto.
A partir desse momento,
o Python vai tratar essa variável não
como uma variável normal,
mas sim como uma tupla,
que é basicamente
uma coleção de itens
que não pode ser alterada.
Então, antes da gente
implementar a nossa lógica,
vamos só colocar um print aqui,
exibindo o valor dessa variável
que a gente está recebendo
nos parâmetros,
para a gente ver a cara dela.
Então, aqui na execução do método,
eu vou atualizar o nome também
e eu vou deixar aqueles
nossos dois valores, mundo e aluno.
Porque lembra,
o Python é uma linguagem
de tipo dinâmico, então,
enquanto a gente não usar
os valores como se fossem números,
a gente não vai ter problema nenhum.
Se eu executar novamente
aqui o nosso código,
a gente repara que os dois
valores estão aqui,
mesmo que em apenas uma variável.
E se a gente quiser,
a gente pode vir aqui
e adicionar qualquer outra coisa,
como, por exemplo, aluna.
Se a gente executar,
a gente vê que,
mesmo sem alterar
a definição da nossa função,
aquele novo valor
que a gente formou
está lá dentro também,
dentro da nossa tupla.
Então, agora sim,
é hora da gente implementar
a nossa lógica do cálculo da média.
Então, para isso,
a gente vai vir aqui dentro
e vai começar com uma variável
que vai ser, por exemplo,
a soma, que vai
começar com zero.
Eu vou implementar isso aqui
de uma forma bem simples,
para que a gente entenda
como está sendo feito.
Então, eu vou começar
executando um loop
para cada item
daquela minha tupla.
Lembra?
O for permite que a gente
itere sobre vários tipos de dados,
e a tupla é um deles.
Se a gente fizer isso com a tupla,
ele vai passar por cada um dos itens,
e a gente vai ter a oportunidade
de fazer alguma coisa com esse número.
No nosso caso, eu vou passar
dentro das notas.
Para cada nota, eu vou chamar
ela de nota, aqui dentro,
e eu vou especificar
a minha lista, ou a minha coleção,
que no caso é uma tupla.
E pronto.
Aqui dentro, eu vou basicamente
usar o operador de soma,
para fazer com que o soma
receba o valor do próprio soma,
mais o valor da minha nota atual,
que está dentro do meu loop.
Beleza?
Pronto.
Nesse ponto aqui, a gente já tem
a somatória das nossas notas.
Então, para terminar a lógica,
basta a gente fazer a divisão
pela quantidade de notas.
Então, eu vou declarar uma outra
variável aqui, que vai ser a média.
Ela vai ser basicamente
igual à minha soma,
dividida pela quantidade de itens
que foram informadas naquela tupla.
E para fazer isso, a gente
pode usar a função nativa len,
que recebe alguma coleção e retorna
para a gente a quantidade de itens.
Então, basta a gente informar
aqui para ele a nossa variável notas,
e pronto.
Vou colocar aqui um return, média,
para fazer com que a nossa função
retorne o valor daquele cálculo.
E se a gente executar
o nosso programa de novo,
hum, repara que a gente teve um erro.
Isso aconteceu basicamente
porque a gente mudou a implementação
da nossa função,
mas esqueceu de mudar os valores
que foram informados no parâmetro.
Dá uma olhada.
Aqui dentro, a gente está informando
mundo, aluno e aluna, que são texto.
E agora sim, a gente está lidando
com valores numéricos.
Então, basta que a gente
edite aqui esses valores.
Então, vamos começar
com uma conta simples aqui.
Eu vou informar a nota 5 e a nota 5.
Eu vou limpar o terminal
para que fique um pouco
mais simples as coisas.
E se a gente rodar novamente,
novamente, o nosso aplicativo rodou,
mas a gente não tem nada na tela.
E isso aconteceu porque a gente
executou a função
e ela retornou o valor.
Mas a gente não exibiu
isso de lugar em algum.
Então, eu vou basicamente envolver
essa função dentro dos parênteses
e usar a função nativa print,
para que agora sim
esse valor seja exibido.
E se a gente roda de novo
com os mesmos valores,
agora sim, a gente tem a média 5.
E se eu acrescentar algum valor
aqui, como, por exemplo, 10,
a gente tem como
resultado a média 6.
6, que é o resultado
da somatória de 5,
5 e 10, dividido pela
quantidade total, que é 3.
E é dessa forma que a gente consegue
lidar com informações dinâmicas.
Cuidado para não confundir.
A gente ainda precisa especificar
quais são as variáveis.
E a gente pode usar
os args em conjunto
com outros tipos
de variáveis comuns,
desde que a gente especifique
as variáveis comuns no começo
e deixe os args para o final.
A gente usou os args aqui
para fazer o cálculo de uma média,
que é um cenário
em que realmente, talvez,
a gente tenha uma quantidade dinâmica
de itens e a gente tenha que lidar com isso.
E é exatamente nesse tipo de cenário
em que você vai querer usar os args.
Normalmente, a gente costuma
usar eles com listas,
que vão vir de algum recurso externo,
onde a gente não controla
a quantidade de itens que vai ter,
mas quer lidar com todos eles.
E é dessa forma que a gente
consegue lidar
com essa lista dinâmica de itens,
sem ter que necessariamente
se preocupar com a quantidade informada.