Course
As funções são uma parte essencial da linguagem de programação Python: você já deve ter encontrado e usado algumas das muitas funções fantásticas que estão incorporadas na linguagem Python ou que vêm com seu ecossistema de bibliotecas. Entretanto, como cientista de dados, você precisará escrever constantemente suas próprias funções para resolver os problemas que os dados lhe apresentam.
Para executar facilmente todos os exemplos de código deste tutorial, você pode criar gratuitamente uma pasta de trabalho do DataLab que tenha o Python pré-instalado e contenha todos os exemplos de código. Para praticar mais a escrita de funções Python, confira este exercício prático do DataCamp ou experimente nosso curso Python Data Science Toolbox!
Funções em Python
Na programação, você usa funções para agrupar um conjunto de instruções que deseja usar repetidamente ou que, devido à sua complexidade, é melhor que estejam contidas em um subprograma e sejam chamadas quando necessário. Isso significa que uma função é um trecho de código escrito para executar uma tarefa específica. Para executar essa tarefa específica, a função pode ou não precisar de várias entradas. Quando a tarefa é executada, a função pode ou não retornar um ou mais valores.
Há três tipos de funções no Python:
- Funções incorporadas, como
help()
para solicitar ajuda,min()
para obter o valor mínimo,print()
para imprimir um objeto no terminal,... Você pode encontrar uma visão geral com mais dessas funções aqui. - Funções definidas pelo usuário (UDFs), que são funções que os usuários criam para ajudá-los; e
- Funções anônimas, que também são chamadas de funções lambda porque não são declaradas com a palavra-chave padrão
def
.
Funções versus métodos
Um método refere-se a uma função que faz parte de uma classe. Você o acessa com uma instância ou objeto da classe. Uma função não tem essa restrição: ela apenas se refere a uma função autônoma. Isso significa que todos os métodos são funções, mas nem todas as funções são métodos.
Considere este exemplo, em que você primeiro define uma função plus()
e, em seguida, uma classe Summation
com um método sum()
:
Se agora você quiser chamar o método sum()
que faz parte da classe Summation
, primeiro precisará definir uma instância ou objeto dessa classe. Então, vamos definir esse objeto:
Lembre-se de que essa instanciação não é necessária para quando você quiser chamar a função plus()
! Você poderá executar o plus(1,2)
no trecho de código do DataCamp Light sem problemas!
Parâmetros versus argumentos
Parâmetros são os nomes usados ao definir uma função ou um método e nos quais os argumentos serão mapeados. Em outras palavras, os argumentos são os elementos fornecidos a qualquer função ou chamada de método, enquanto o código da função ou do método se refere aos argumentos pelos nomes dos parâmetros.
Considere o exemplo a seguir e volte para o trecho do DataCamp Light acima: você passa dois argumentos para o método sum()
da classe Summation
, embora tenha definido anteriormente três parâmetros, a saber, self
, a
e b
.
O que aconteceu com self
?
O primeiro argumento de cada método de classe é sempre uma referência à instância atual da classe, que, nesse caso, é Summation
. Por convenção, esse argumento é chamado de self
.
Isso significa que você não passa a referência para self
nesse caso porque self
é o nome do parâmetro para um argumento passado implicitamente que se refere à instância por meio da qual um método está sendo chamado. Ele é inserido implicitamente na lista de argumentos.
Como definir uma função: Funções definidas pelo usuário (UDFs)
As quatro etapas para definir uma função em Python são as seguintes:
- Use a palavra-chave
def
para declarar a função e, em seguida, o nome da função. - Adicione parâmetros à função: eles devem estar dentro dos parênteses da função. Termine sua linha com dois pontos.
- Adicione instruções que as funções devem executar.
- Termine sua função com uma instrução de retorno se a função tiver que produzir algo. Sem a instrução return, sua função retornará um objeto
None
.
É claro que suas funções ficarão mais complexas à medida que você avança: você pode adicionar loops for, controle de fluxo, ... e muito mais para torná-las mais refinadas:
def hello():
name = str(input("Enter your name: "))
if name:
print ("Hello " + str(name))
else:
print("Hello World")
return
hello()
Na função acima, você solicita que o usuário forneça um nome. Se nenhum nome for fornecido, a função imprimirá "Hello World". Caso contrário, o usuário receberá uma resposta personalizada "Hello".
Lembre-se também de que você pode definir um ou mais parâmetros de função para o seu UDF. Você aprenderá mais sobre isso quando abordar a seção Argumentos de função. Além disso, você pode ou não retornar um ou vários valores como resultado de sua função.
Os return
Declaração
Observe que, como você está imprimindo algo no seu UDF hello()
, não é realmente necessário retorná-lo. Não haverá nenhuma diferença entre a função acima e esta:
No entanto, se quiser continuar a trabalhar com o resultado da sua função e experimentar algumas operações com ele, você precisará usar a instrução return
para realmente retornar um valor, como uma cadeia de caracteres, um número inteiro, .... Considere o seguinte cenário, em que hello()
retorna uma cadeia de caracteres "hello"
, enquanto a função hello_noreturn()
retorna None
:
A segunda função apresenta um erro porque você não pode realizar nenhuma operação com None
. Você receberá um TypeError
que diz que você não pode fazer a operação de multiplicação para NoneType
(o None
que é o resultado de hello_noreturn()
) e int
(2
).
As funções de dica saem imediatamente quando se deparam com uma instrução return
, mesmo que isso signifique que não retornarão nenhum valor:
Outra coisa que vale a pena mencionar quando você estiver trabalhando com a instrução return
é o fato de que você pode usá-la para retornar vários valores. Para fazer isso, você usa tuplas.
Lembre-se de que essa estrutura de dados é muito semelhante à de uma lista: ela pode conter vários valores. No entanto, as tuplas são imutáveis, o que significa que você não pode modificar os valores armazenados nelas! Você o constrói com a ajuda de parênteses duplos ()
. Você pode descompactar tuplas em várias variáveis com a ajuda da vírgula e do operador de atribuição.
Veja o exemplo a seguir para entender como sua função pode retornar vários valores:
Observe que a instrução return
return sum, a
teria o mesmo resultado que return (sum, a)
: a primeira, na verdade, empacota sum
e a
em uma tupla sob o capô!
Como chamar uma função
Nas seções anteriores, você já viu vários exemplos de como chamar uma função. Chamar uma função significa que você executa a função que definiu, seja diretamente do prompt do Python ou por meio de outra função (como você verá na seção "Funções aninhadas").
Chame a função recém-definida hello()
simplesmente executando hello()
, exatamente como no trecho do DataCamp Light abaixo:
Como adicionar docstrings a uma função Python
Outro aspecto essencial da escrita de funções em Python: docstrings. Os docstrings descrevem o que sua função faz, como os cálculos que ela executa ou seus valores de retorno. Essas descrições servem como documentação para sua função, de modo que qualquer pessoa que leia a docstring da função entenda o que ela faz, sem precisar rastrear todo o código na definição da função.
As cadeias de documentos de funções são colocadas na linha imediatamente após o cabeçalho da função e entre aspas triplas. Uma Docstring apropriada para sua função hello()
é 'Prints "Hello World"'.
def hello():
"""Prints "Hello World".
Returns:
None
"""
print("Hello World")
return
Observe que as docstrings podem ser mais extensas do que a que é fornecida aqui como exemplo. Se quiser estudar as docstrings em mais detalhes, é melhor dar uma olhada em alguns repositórios do Github de bibliotecas Python, como scikit-learn ou pandas, onde você encontrará muitos exemplos!
Argumentos de função em Python
Anteriormente, você aprendeu sobre a diferença entre parâmetros e argumentos. Em resumo, os argumentos são os elementos fornecidos a qualquer chamada de função ou método, enquanto o código da função ou do método se refere aos argumentos por seus nomes de parâmetros. Há quatro tipos de argumentos que os UDFs do Python podem receber:
- Argumentos padrão
- Argumentos necessários
- Argumentos de palavras-chave
- Número variável de argumentos
Argumentos padrão
Os argumentos padrão são aqueles que assumem um valor padrão se nenhum valor de argumento for passado durante a chamada da função. Você pode atribuir esse valor padrão usando o operador de atribuição =
, como no exemplo a seguir:
Argumentos necessários
Como o nome indica, os argumentos necessários de um UDF são aqueles que precisam estar lá. Esses argumentos precisam ser passados durante a chamada da função e exatamente na ordem correta, como no exemplo a seguir:
Você precisa de argumentos que mapeiem os parâmetros a
e b
para chamar a função sem receber nenhum erro. Se você alternar entre a
e b
, o resultado não será diferente, mas poderá ser se você alterar plus()
para o seguinte:
Argumentos de palavras-chave
Se você quiser ter certeza de que chamará todos os parâmetros na ordem correta, poderá usar a palavra-chave argumentos na chamada da função. Você os usa para identificar os argumentos pelo nome do parâmetro. Vamos usar o exemplo acima para deixar isso um pouco mais claro:
Observe que, ao usar a palavra-chave arguments (argumentos), você também pode trocar a ordem dos parâmetros e ainda obter o mesmo resultado ao executar a função:
Variável Número de argumentos
Nos casos em que você não sabe o número exato de argumentos que deseja passar para uma função, é possível usar a seguinte sintaxe com *args
:
O asterisco (*
) é colocado antes do nome da variável que contém os valores de todos os argumentos de variáveis que não sejam palavras-chave. Observe aqui que você poderia muito bem ter passado *varint
, *var_int_args
ou qualquer outro nome para a função plus()
.
Dica: tente substituir *args
por outro nome que inclua o asterisco. Você verá que o código acima continua funcionando!
Você vê que a função acima faz uso da função integrada do Python sum()
para somar todos os argumentos que são passados para plus()
. Se quiser evitar isso e criar a função inteiramente por conta própria, você pode usar esta alternativa:
Variáveis globais versus variáveis locais
Em geral, as variáveis definidas dentro do corpo de uma função têm um escopo local, e as definidas fora têm um escopo global. Isso significa que as variáveis locais são definidas em um bloco de funções e só podem ser acessadas dentro dessa função, enquanto as variáveis globais podem ser obtidas por todas as funções que possam estar no seu script:
Você verá que receberá um NameError
que diz que o name 'total' is not defined
quando você tenta imprimir a variável local total
que foi definida dentro do corpo da função. A variável init
, por outro lado, pode ser impressa sem problemas.
Funções anônimas em Python
As funções anônimas também são chamadas de funções lambda em Python porque, em vez de declará-las com a palavra-chave padrão def
, você usa a palavra-chave lambda
.
No trecho do DataCamp Light acima, lambda x: x*2
é a função anônima ou lambda. x
é o argumento, e x*2
é a expressão ou instrução que é avaliada e retornada. O que há de especial nessa função é que ela não tem nome, como os exemplos que você viu na primeira parte deste tutorial de funções. Se você tivesse que escrever a função acima em um UDF, o resultado seria o seguinte:
def double(x):
return x*2
Vamos considerar outro exemplo de uma função lambda em que você trabalha com dois argumentos:
Você usa funções anônimas quando precisa de uma função sem nome por um curto período de tempo, e ela é criada em tempo de execução. Contextos específicos em que isso seria relevante é quando você está trabalhando com filter()
, map()
e reduce()
:
A função filter()
filtra, como o nome sugere, a lista de entrada original my_list
com base em um critério >10
. Com map()
, por outro lado, você aplica uma função a todos os itens da lista my_list
. Nesse caso, você multiplica todos os elementos com 2
.
Observe que a função reduce()
faz parte da biblioteca functools
. Você usa essa função cumulativamente para os itens da lista my_list
, da esquerda para a direita, e reduz a sequência a um único valor, 55
, neste caso.
Usando main()
como uma função
Se você tiver alguma experiência com outras linguagens de programação, como Java, saberá que a função main
é necessária para executar funções. Como você viu nos exemplos acima, isso não é necessariamente necessário para o Python. No entanto, incluir uma função main()
no seu programa Python pode ser útil para estruturar o código de forma lógica - todos os componentes mais importantes estão contidos nessa função main()
.
Você pode definir facilmente uma função main()
e chamá-la da mesma forma que fez com todas as outras funções acima:
No entanto, da forma como está agora, o código da sua função main()
será chamado quando você importá-la como um módulo. Para garantir que isso não aconteça, você chama a função main()
quando __name__ == '__main__'
.
Isso significa que o código do trecho de código acima se torna:
Observe que, além da função __main__
, você também tem uma função __init__
que inicializa uma instância de uma classe ou de um objeto. Em termos simples, ele funciona como um construtor ou inicializador e é chamado automaticamente quando você cria uma nova instância de uma classe. Com essa função, o objeto recém-criado é atribuído ao parâmetro self, que você viu anteriormente neste tutorial. Dê uma olhada no exemplo a seguir:
class Dog:
"""
Requires:
legs - Legs so that the dog can walk.
color - A color of the fur.
"""
def __init__(self, legs, color):
self.legs = legs
self.color = color
def bark(self):
bark = "bark" * 2
return bark
if __name__ == "__main__":
dog = Dog(4, "brown")
bark = dog.bark()
print(bark)
Você quer praticar mais?
Parabéns! Você conseguiu concluir este breve tutorial sobre funções em Python. Se você quiser revisar outros materiais básicos de programação em Python, não perca o Data Types for Data Science, um curso em que você consolidará e praticará seus conhecimentos sobre listas, dicionários, tuplas, conjuntos e datas e horas.
Saiba mais sobre Python
Course
Writing Efficient Python Code
Course
Introduction to Python
tutorial
Função do sublinhado (_) no tutorial de Python
tutorial
Tutorial de lambda em Python
DataCamp Team
3 min
tutorial
Tutorial de indexação de lista Python()
tutorial
Tutorial e exemplos de funções e métodos de lista do Python
tutorial
Tutorial de Python
DataCamp Team
3 min
tutorial