Salve salve Pythonista!
Uma função nada mais é que um trecho de código que possui uma responsabilidade específica e que damos um nome à ele.
Nesse post você vai aprender:
- Como criar funções com a palavra reservada
def
, - Como definir seus parâmetros,
- O que são
args
e o que sãokwargs
, - Como retornar dados de funções,
- Como definir funções com uma linha e muito mais!
Então vem com a gente!
Vá Direto ao Assunto…
- Introdução
- Parâmetros
- Valores Padrão (ou Valores Default)
- Chamada de Função Posicional versus Chamada de Função Nomeada
- Parâmetro
*args
- Parâmetro
**kwargs
- Funções com retorno de dados
- Palavra reservada
pass
- Função de uma linha
Introdução
Funções são blocos de código que executam funcionalidades específicas.
Normalmente são utilizados para evitar que determinada parte do seu código sejá escrito varias vezes.
Em Python sua sintaxe é definida usando def
e atribuindo um nome a ela, veja um exemplo:
1
2
def funcao():
print("Bloco de código")
Observando essa função, podemos extrair algumas informações, iniciando com a palavra reservada para funções def
o nome atribuido à função funcao
e os parênteses ()
utilizado para definição dos dados de entrada da função, também chamados de parâmetros.
Em seguida usa-se dois pontos :
e abaixo o bloco de código a ser executado, que neste caso é apenas imprimir de uma string.
Para “chamar” uma função, utilizamos o nome que foi definido, dessa forma:
1
2
3
4
5
def funcao():
print("Bloco de código")
funcao()
Resultado do código acima:
1
Bloco de código
Parâmetros
Além de executar código, funções também podem receber e retornar dados.
Podemos enviar dados para uma função através de seus parâmetros.
Observe o exemplo:
1
2
3
4
5
6
7
def imprime_nome(nome):
print(f"Nome: {nome}")
imprime_nome("Erickson")
imprime_nome("Renan")
imprime_nome("Daniel")
Resultado do código acima:
1
2
3
Nome: Erickson
Nome: Renan
Nome: Daniel
Não entendeu essa notação do
print(f"Nome: {nome}")
? Isso se chama F-strings e é uma maneira de formatar código Python e Strings! Quer saber mais sobre esse assunto, então acesse nosso Post completo sobre F-Strings!
Quando a função é chamada, passamos uma string como dado de entrada - através do parâmetro nome
- que é concatenada e impressa dentro da função.
Caso nenhum valor seja infomado ao chamar a função, um erro será gerado. Por exemplo, o seguinte código:
1
2
3
4
5
def imprime_nome(nome):
print(f"Nome: {nome}")
imprime_nome()
Ocasionará o seguinte erro:
1
TypeError: imprime_nome() missing 1 required positional argument: 'nome'
Podemos resolver esse erro utilizando os “Valores Padrão” e é exatamente isso que veremos agora!
Está curtindo esse conteúdo?
Que tal receber 30 dias de conteúdo direto na sua Caixa de Entrada?
Valores Padrão (ou Valores Default)
A utilização dos valores padrão serve para dar um valor quando quem chamou a função não passar nenhum valor para os parâmetros definidos.
Fazemos isso dessa forma:
1
2
3
4
5
6
def flor(flor='Rosa', cor='Vermelha'):
print("A cor da {flor} é {cor}")
flor()
flor("Orquídea", "Azul")
Veja o resultado:
1
2
A cor da Rosa é Vermelha
A cor da Orquídea é Azul
Ou seja, o erro anterior não ocorrou novamente!
Chamada de Função Posicional versus Chamada de Função Nomeada
Quando chamamos uma função, podemos utilizar a localização dos parâmetros para fazer o casamento entre o que foi chamado e o que foi definido na função.
Para entender melhor, veja o exemplo a seguir:
1
2
3
4
5
def monta_computador(cpu='', armazenamento=0, memoria=0):
print('A configuração é: \n\t- CPU: {cpu}\n\t- Armazenamento: {armazenamento}Tb\n\t- Memória: {memoria}Gb')
monta_computador('Intel Core i9', 4, 64)
A saída será:
1
2
3
4
A configuração é:
- CPU: Intel Core i9
- Armazenamento: 4Tb
- Memória: 64Gb
O programador que escreveu a chamada da função monta_computador
está respeitando a posição dos parâmetros, ou seja:
- O valor
"Intel Core i9"
é referente ao primeiro parâmetro (cpu
) - O valor
4
é referente ao segundo parâmetro (armazenamento
) - O valor
64
se refere ao terceiro parâmetro (memoria
)
Essa é uma chamada de função posicional, ou seja: que respeita a ordem dos parâmetros.
Outra forma de fazer essa chamada de função é utilizar os nomes dos parâmetros!
Dessa forma, não é necessário respeitar a ordem de definição dos parâmetros!
Veja o mesmo exemplo, mas agora utilizando os nomes dos parâmetros:
1
monta_computador(memoria=64, armazenamento=4, cpu='Intel Core i9')
A saída será a mesma, pois como utilizamos os nomes, o Python saberá qual valor referncia qual parâmetro!
Parâmetro *args
Caso você queira desenvolver uma função que recebe um número variável de parâmetros, você pode utilizar o parâmetro *args
!
Dessa forma, a função receberá os argumentos em forma de Tupla e você poderá processá-los com um loop for
por exemplo!
Veja o código abaixo para entender melhor:
1
2
3
4
5
6
7
8
9
10
def maior_30(*args):
print(args)
print(type(args))
for num in args:
if num > 30:
print(num)
maior_30(10, 20, 30, 40, 50, 60)
A função acima irá receber todos os valores passados para função no parâmetro *args
e irá iterar sobre eles com um loop for
.
Veja a saída:
1
2
3
4
5
(10, 20, 30, 40, 50, 60)
<class 'tuple'>
40
50
60
Observação: O nome
*args
é uma convenção, ou seja uma boa prática entre programadores Python! Contudo, nada te impede de alterar esse nome para*numeros
por exemplo. Dessa forma, a definição da função seria:def maior_30(*numeros):
Parâmetro **kwargs
Agora, se quiser desenvolver uma função com número variado de parâmetros nomeados, utilize **kwargs
.
Dessa forma, todos os dados passados à função serão guardados nessa variável **kwargs
, em formato de um dicionário.
Oberve como podemos obter a chave a valor deles percorrendo os itens deste dicionário:
1
2
3
4
5
6
7
8
def dados_pessoa(**kwargs):
print(type(kwargs))
for chave, valor in kwargs.items():
print(f"{chave}: {valor}")
dados_pessoa(nome='João', idade=35, carreira='Desenvolvedor Fullstack')
Na saída podemos observar o tipo de dado que a função recebeu e a estrutura construida para percorrer o dicionário:
1
2
3
4
<class 'dict'>
nome: João
idade: 35
carreira: Desenvolvedor Fullstack
Observação: O nome
**kwargs
é uma convenção, ou seja uma boa prática entre programadores Python! Contudo, nada te impede de alterar esse nome para**pessoa
por exemplo.
Funções com retorno de dados
As funções também podem retornar valores através da palavra reservada return
.
Veja o exemplo:
1
2
3
4
5
6
7
8
def soma_dois_numeros(valor1, valor2):
soma = valor1 + valor2
return soma
valor_soma = soma_dois_numeros(32, 15)
print(valor_soma)
print(soma_dois_numeros(50, 10))
Saída com o retorno da soma dos valores introduzidos na função:
1
2
47
60
Funções com retorno múltiplos
Funções também podem retornar múltiplos dados. Veja o exemplo:
1
2
3
4
5
6
7
8
9
10
def soma_dois_numeros_e_calcula_media(valor1, valor2):
soma = valor1 + valor2
media = (valor1 + valor2)/2
return soma, media
valor_soma = soma_dois_numeros_e_calcula_media(32, 15)
print(valor_soma)
print(soma_dois_numeros_e_calcula_media(50, 10))
A saída será:
1
2
(47, 23.5)
(60, 30.0)
Palavra reservada pass
Caso você deseje definir uma função sem corpo nenhum, ou seja, sem código, saiba que isso irá disparar o erro IndentationError
, pois funções não podem estar vazias.
Porém se por algum motivo precisar use a palavra reservada pass
, da seguinte forma:
1
2
def funcao():
pass
Função de uma linha
Python possibilita a criação de funções com apenas uma linha de código. Veja os exemplo a seguir:
1
2
3
4
5
6
7
8
9
# Definição das funções
def soma(valor1, valor2): return valor1 + valor2
def divisao(valor1, valor2): return valor1 / valor2
def multiplicacao(valor1, valor2): return valor1 * valor2
# Chamada das funções
print(soma(1, 5))
print(divisao(8, 2))
print(multiplicacao(8, 2))
O resultado do código acima será:
1
2
3
6
4.0
16
Por hoje é só pessoal!
Espero que tenham curtido este conteúdo
Conclusão
Nesse post vimos como podemos criar Funções em Python, que nada mais é que “pedaço de código nomeado”.
Vimos a sintaxe para sua criação, parâmetros, retorno, chamada e muito mais!
Se ficou com alguma dúvida, fique à vontade para deixar um comentário no box aqui embaixo! Será um prazer te responder!