25/09/2024, 14:09 01 - Funcoes
FUNÇÕES
BEHRMAN, Kennedy R.Fundamentos de Python
para Ciência de Dados. Porto Alegre: Bookman,
2023, p. 67-75
Definindo Funções
Trata-se de uma declaração composta
As funções fornecem uma forma de nomear um bloco de código integrado como um
objeto
Esse código pode ser chamado usando esse nome, o que permite que o mesmo código
seja chamado diversas vezes e em vários lugares
Assim, a definição de uma função estabelece um objeto função, que integra um bloco
executável
Os blocos de construção de uma função são a declaração de controle, uma docstring
opcional, o bloco de código controlado e uma declaração de retorno (return)
Declaração de controle
A primeira linha de uma definição é a declaração de controle: def Nome Função
(Parâmetros):
In [5]: #Exemplo:
def soma(a,b):
resultado = a + b
return resultado
soma(5,2)
Out[5]: 7
Docstring
É a string de documentação (docstring), que contém a documentação da função
A docstring comunica a suas intenções ao escrever uma função, o que faz e como deve
ser chamada
Ela consiste em uma linha ou diversas linhas entre três pares de aspas duplas que
seguem imediatamente a declaração de controle
file:///C:/Users/Usuário/Downloads/01 - Funcoes.html 1/7
25/09/2024, 14:09 01 - Funcoes
In [14]: #Exemplo:
def soma(a,b):
"""
Esta função efetua a soma de duas variáveis e retorna o resultado
parâmetros:
a - variável numérica (float, int ou complexo)
b - variável numérica (float, int ou complexo)
Retorna o resultado de acordo com o tipo de variável numérica
"""
resultado = a + b
return resultado
print(soma(15.5, 23.7))
print(soma(2 + 10j,15 + 2j))
print(soma(13, 15))
39.2
(17+12j)
28
In [15]: help(soma)
Help on function soma in module __main__:
soma(a, b)
Esta função efetua a soma de duas variáveis e retorna o resultado
parâmetros:
a - variável numérica (float, int ou complexo)
b - variável numérica (float, int ou complexo)
Retorna o resultado de acordo com o tipo de variável numérica
Parâmetros
Os parâmetros permitem passar valores para a função, que podem ser usados no bloco
de código dessa função
Uma função não precisa aceitar nenhuma parâmetro
Os valores do parâmetro podem ser definidos com base na posição em que são
passados ou com base em palavras-chave. Não é possível usar uma atribuição de
palavra-chave à esquerda de uma atribuição posicional
In [2]: #Exemplo:
def multiplicacao(x,y):
"""
Função que recebe dois parâmetros e efetua a multiplicação entre eles
Parâmetros:
x - variável numérica tipo int
y - variável numérica tipo int
A função não aceita como parâmetro valores complexos, retornando um Type
file:///C:/Users/Usuário/Downloads/01 - Funcoes.html 2/7
25/09/2024, 14:09 01 - Funcoes
Mas aceita valores tipo float, retornando, porém, um resultado numérico
Ao se passar valores tipo float, a função os transforma em int, arredond
returna o resultado da multiplicação x * y
"""
mult = int(x) * int(y)
return mult
multiplicacao(2.6,1.7)
Out[2]: 2
In [28]: multiplicacao(2j,5.6)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Cell In[28], line 1
----> 1 multiplicacao(2j,5.6)
Cell In[27], line 19, in multiplicacao(x, y)
3 def multiplicacao(x,y):
4 """
5 Função que recebe dois parâmetros e efetua a multiplicação entre eles
6
(...)
17
18 """
---> 19 mult = int(x) * int(y)
20 return mult
TypeError: int() argument must be a string, a bytes-like object or a real number,
not 'complex'
In [4]: multiplicacao(y=6, x=30)
Out[4]: 180
In [5]: def multiplicacao(a,b,c):
resultado = a*b*c
return resultado
In [8]: multiplicacao(a=2, b=3, c=4)
Out[8]: 24
In [9]: multiplicacao(c=10, a=-1, b=4)
Out[9]: -40
In [10]: multiplicacao(c=2, 2, 3)
Cell In[10], line 1
multiplicacao(c=2, 2, 3)
^
SyntaxError: positional argument follows keyword argument
file:///C:/Users/Usuário/Downloads/01 - Funcoes.html 3/7
25/09/2024, 14:09 01 - Funcoes
Pode-se requerer que um parâmetro seja chamado apenas usando o método da palavra-
chave colocando * à esquerda da definição da função
Todos os parâmetros à direita do asterisco podem ser chamados apenas usando palavra-
chave
In [1]: #Exemplo
def does_keyword(first, second, *, third):
print(f'First: {first}')
print(f'Second: {second}')
print(f'Third: {third}')
In [2]: does_keyword(1,2, third=3)
First: 1
Second: 2
Third: 3
In [3]: does_keyword(1,2,3)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Cell In[3], line 1
----> 1 does_keyword(1,2,3)
TypeError: does_keyword() takes 2 positional arguments but 3 were given
É possível tornar opcional um parâmetro atribuindo um valor padrão a ele na definição
da função
Esse valor será uasdo se nenhum valor for fornecido para o parâmetro durante a
chamada da função
Não é possível definir uma função com um parâmetro de valor padrão à esquerda de um
parâmetro de valor não padrão
In [4]: #Exemplo
def soma(a,b,c=3):
resultado = a + b + c
return resultado
In [5]: soma(1,2,4)
Out[5]: 7
In [6]: soma(1,2)
Out[6]: 6
In [7]: #Exemplo2
def soma(a=2,b,c):
resultado = a + b + c
return resultado
file:///C:/Users/Usuário/Downloads/01 - Funcoes.html 4/7
25/09/2024, 14:09 01 - Funcoes
Cell In[7], line 3
def soma(a=2,b,c):
^
SyntaxError: non-default argument follows default argument
O uso de objetos mutáveis (lista ou dicionários) para valores padrão pode gerar
problemas
In [8]: def funcao_default(lista=[]):
lista.append(1)
print(lista)
In [9]: funcao_default()
[1]
In [10]: funcao_default()
[1, 1]
In [11]: funcao_default()
[1, 1, 1]
Sempre que a função é chamada, a lista mantém os valores das chamadas anteriores
Recomenda-se não usar objetos mutáveis como parâmetros padrão para evitar erros
difíceis de rastrear e confunsão
Uma forma de solucionar é definir o valor padrão como None
In [17]: def funcao_default(lista=None):
lista = lista or []
lista.append(1)
print(lista)
In [18]: funcao_default()
[1]
In [19]: funcao_default()
[1]
É possível restringir os parâmetros à atribuição posicional apenas
Um parâmetro à esquerda da barra (/) em uma definição de função é restrito à atribuição
posicional
In [20]: def does_positional(first, /, second, third):
print(f'First: {first}')
print(f'Second: {second}')
print(f'Third: {third}')
In [21]: does_positional(1,2,3)
First: 1
Second: 2
Third: 3
file:///C:/Users/Usuário/Downloads/01 - Funcoes.html 5/7
25/09/2024, 14:09 01 - Funcoes
In [22]: does_positional(first=1, second=2, third=3)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Cell In[22], line 1
----> 1 does_positional(first=1, second=2, third=3)
TypeError: does_positional() got some positional-only arguments passed as keyword
arguments: 'first'
O parâmetro first é posicional apenas
In [24]: does_positional(1,2,third=3)
First: 1
Second: 2
Third: 3
In [25]: does_positional(1,third=3, second=2)
First: 1
Second: 2
Third: 3
In [26]: does_positional(1,second=2, 3)
Cell In[26], line 1
does_positional(1,second=2, 3)
^
SyntaxError: positional argument follows keyword argument
O parâmetro first é posicional apenas
O parâmetro second pode ser definido usando a atribuição posicional ou de palavra-
chave. O third é palavra-chave apenas
In [2]: def does_positional(first, /, second, *, third):
print(f'First: {first}')
print(f'Second: {second}')
print(f'Third: {third}')
does_positional(1,2,third=3)
First: 1
Second: 2
Third: 3
É possível passar curingas nas definições da função para aceitar um número indefinido
de argumentos posicionais ou palavras-chave
Parâmetros curinga posicionais (*args) e de palavra-chave (**kwargs) podem ser usados
na mesma função, bastando definir os parâmetros posicionais primeiro e os parâmetros
de palavra-chave depois.
In [3]: def does_wildcard_positions(*args):
for item in args:
print(item)
does_wildcard_positions('Marcos', 'Cesar', 'Botelho', 49)
file:///C:/Users/Usuário/Downloads/01 - Funcoes.html 6/7
25/09/2024, 14:09 01 - Funcoes
Marcos
Cesar
Botelho
49
In [4]: does_wildcard_positions(1,10, '14', 9.6, 1+20j, True)
1
10
14
9.6
(1+20j)
True
In [5]: def does_wildcard_keywords(**kwargs):
for key, value in kwargs.items():
print(f'{key} : {value}')
does_wildcard_keywords(number=49, name='Marcos', bool=True)
number : 49
name : Marcos
bool : True
In [6]: def does_wildcards(*args, **kwargs):
print(f'Posicional: {args}')
print(f'Keyword: {kwargs}')
In [7]: does_wildcards(1,2,a='a', b=3)
Posicional: (1, 2)
Keyword: {'a': 'a', 'b': 3}
file:///C:/Users/Usuário/Downloads/01 - Funcoes.html 7/7