E aí, galera irada! Vocês estão bem? Ao trabalharmos com engenharia de dados, é essencial dominarmos algumas linguagens que se tornam nossas ferramentas diárias. Nesse sentido, SQL e Python são linguagens complementares, assim como um time de futebol que possui zagueiros, meio-campo e atacantes, cada um com suas posições e funções específicas. Juntas, essas linguagens apresentam vantagens e desvantagens que, quando combinadas, são um diferencial. Diante desse contexto, decidi abordar as DEF funções reutilizáveis em Python, que, se utilizadas corretamente, podem aumentar significativamente a produtividade do desenvolvedor. O que são DEF?
Em Python, existe uma palavra-chave muito importante chamada DEF. Essa palavra é usada para criar funções, que são blocos de código que fazem coisas específicas. Quando uma função é criada usando a palavra DEF em Python, um conjunto de instruções pode ser agrupado em um único bloco de código que pode ser usado várias vezes em um programa. Isso ajuda a deixar o código mais organizado e fácil de entender, além de permitir que as tarefas sejam reutilizadas em diferentes partes do programa. Em resumo, a palavra DEF é essencial para escrever código em Python de forma organizada e modular.
No exemplo abaixo, a função criada se chama "saudacao" e tem um parâmetro chamado "nome". Quando a função é chamada passando o valor "Maria" como argumento, ela exibe a mensagem "Olá, Maria! Como você está?" na tela. Da mesma forma, quando a função é chamada passando o valor "João" como argumento, ela exibe a mensagem "Olá, João! Como você está?" na tela. Dessa forma, podemos reutilizar essa função em diferentes partes do programa, sem precisar repetir o mesmo bloco de código várias vezes.
Qual é a sintaxe básica para definir DEF em Python?
A sintaxe básica para definir uma função usando a palavra-chave DEF em Python:
def: é a palavra-chave que indica que estamos definindo uma nova função.
nome_da_funcao: é o nome que damos à função. Esse nome deve seguir as mesmas regras de nomenclatura de variáveis em Python (por exemplo, não pode começar com um número).
parametro1, parametro2, ...: são os parâmetros da função. Eles são opcionais e podem ser usados para receber valores externos que a função vai usar para executar suas instruções.
corpo da função: é o bloco de código que contém as instruções que a função executa quando é chamada.
return resultado: é uma instrução opcional que especifica o valor que a função retorna quando é chamada. Se a função não precisar retornar nenhum valor, essa instrução pode ser omitida.
Note que os parâmetros são opcionais e podem ser deixados de fora, assim como a instrução return. Porém, a palavra-chave DEF é sempre necessária para criar uma nova função.
No exemplo abaixo criamos um dataframe com três colunas: id, nome, sobrenome: a função remover_caracteres_especiais usa a função regexp_replace para substituir qualquer caractere que não seja uma letra ou um número por uma string vazia.
A função é aplicada às colunas "nome" e "sobrenome" do DataFrame usando a função withColumn. O resultado é um novo DataFrame com duas novas colunas, "nome_sem_caracteres" e "sobrenome_sem_caracteres", que contêm os valores das colunas originais com os caracteres especiais removidos.
No exemplo abaixo, estamos passando um Dataframe declarado chamado df para a DEF colunas_para_maisculas(), com um parametro chamado colunas. O parâmetro "colunas" na assinatura da função "colunas_para_maiusculas" é uma lista de strings que especifica as colunas do dataframe que devem ser transformadas em maiúsculas.
Na definição da função, o parâmetro "colunas" é definido com o tipo de dados "list", indicando que é esperada uma lista como entrada. O nome "colunas" é apenas uma convenção de nomenclatura para tornar o código mais legível.
Dentro da função, a lista de colunas é percorrida em um loop for, e cada coluna é transformada em maiúscula usando a função "upper" do PySpark, que retorna uma nova coluna com os caracteres em maiúsculo. Em seguida, a coluna original é substituída pela nova coluna em maiúsculo no dataframe usando o método "withColumn".
Quais são os diferentes tipos de parâmetros que podem ser usados em DEF?
Existem três tipos de parâmetros que podem ser usados em funções DEF em Python. O primeiro tipo é o parâmetro posicional, que é obrigatório e deve ser passado na ordem em que é definido na função. Isso significa que se você tem uma função que recebe dois parâmetros posicionais, você deve passar o primeiro parâmetro primeiro e o segundo parâmetro em segundo lugar. O segundo tipo de parâmetro é o parâmetro com palavra-chave, que é opcional e tem um valor padrão. Esse tipo de parâmetro pode ser definido fora da ordem em que é definido na função, desde que o nome do parâmetro seja especificado. O terceiro tipo de parâmetro é o parâmetro de lista, que permite que uma função aceite um número variável de argumentos. Isso é útil quando você não sabe quantos argumentos serão passados para a função. Para definir um parâmetro de lista, você usa um asterisco (*) antes do nome do parâmetro e os argumentos são passados como uma lista.
Parâmetros obrigatórios: esses são os parâmetros que devem ser passados para a função. Se você não fornecer um valor para esses parâmetros, a função produzirá um erro. Um exemplo de uma função que usa parâmetros obrigatórios é a seguinte:
Neste exemplo, a função saudação tem um parâmetro obrigatório nome que deve ser fornecido ao chamar a função. Se você chamar a função sem fornecer um valor para nome, você receberá um erro.
Parâmetros opcionais: esses são os parâmetros que não precisam ser passados para a função. Se nenhum valor for fornecido para esses parâmetros, a função usará um valor padrão. Um exemplo de uma função que usa parâmetros opcionais é a seguinte:
Neste exemplo, a função somar tem dois parâmetros: x e y. O parâmetro y é opcional e tem um valor padrão de 0. Se você chamar a função sem fornecer um valor para y, a função usará o valor padrão de 0.
Parâmetros nomeados: Nesse tipo de parâmetro, é possível definir um valor padrão para um parâmetro, tornando-o opcional na chamada da função. Esse tipo de parâmetro é útil quando se tem muitos argumentos opcionais na função, tornando a chamada mais clara e legível.
Nesse exemplo, a função calcular_media recebe dois parâmetros obrigatórios (nota1 e nota2) e dois parâmetros opcionais (peso1 e peso2), que têm valores padrão definidos como 1. Na chamada da função, é passado um valor apenas para o parâmetro peso2, e o valor padrão é utilizado para peso1. Isso resulta em uma média ponderada com peso1=1 e peso2=2.
Como definir parâmetros padrão em DEF?
Para definir parâmetros padrão em uma definição de função usando o sinal de igual (=) depois do nome do parâmetro e, em seguida, o valor padrão que deseja atribuir a ele. Aqui está um exemplo simples:
Neste exemplo, a função saudacao() tem dois parâmetros: nome e saudacao. O valor padrão para o parâmetro saudacao é "Olá". Se o valor do parâmetro saudacao não for especificado ao chamar a função, o valor padrão "Olá" será usado. Como podemos ver na imagem acima, podemos chamar a função saudacao() de várias maneiras diferentes. Como usar parâmetros nomeados em DEF?
Em Python, você pode usar parâmetros nomeados (também conhecidos como argumentos nomeados) em uma definição de função para especificar explicitamente o valor de um parâmetro ao chamar a função, sem se importar com a ordem em que os parâmetros são declarados na definição da função.
Para usar parâmetros nomeados em uma definição de função, você precisa incluir o nome do parâmetro seguido de um sinal de igual (=) e, em seguida, o valor que deseja atribuir a ele ao chamar a função. Aqui está um exemplo simples.
Observe que, ao usar parâmetros nomeados, você não precisa se preocupar com a ordem em que os parâmetros são declarados na definição da função. Além disso, você pode misturar parâmetros nomeados e posicionais em uma chamada de função, mas é importante lembrar que todos os parâmetros posicionais devem vir antes dos parâmetros nomeados.
Parametros de entrada e saida
No seguinte exemplo, a e b são parâmetros de entrada da função "soma", mas não há um parâmetro de saída específico. O valor retornado pela função é um valor de saída que pode ser atribuído a uma variável, como você fez com a variável "c". Nesse caso, "c" é uma variável de saída que armazena o resultado da função.
No entanto, ao chamar a função "soma", é necessario passar os argumentos "a" e "b". Caso contrario isso resultará em um erro, pois a função espera receber dois argumentos.
Nesse exemplo, os valores de "a" e "b" são passados como argumentos ao chamar a função "soma", e o resultado é armazenado na variável "c" e impresso na tela. Para criar um exemplo que inclua um parâmetro de saída, podemos modificar a função "soma" para retornar tanto o resultado da soma quanto uma mensagem indicando que a operação foi realizada com sucesso. Assim:
Nesse caso, a função "soma" retorna uma tupla contendo o resultado da soma e uma mensagem indicando que a operação foi realizada com sucesso.
Em python a saída de uma DEF sempre será o valor de retorno de uma função (ou método) é especificado usando a instrução "return". Portanto, se você deseja que sua função retorne um valor específico, deve usar a instrução "return" dentro da função e especificar o valor que deseja retornar.
Resumo
Por hoje é isso pessoal, ficou extenso, mas o assunto é vasto. O texto acima explica o conceito de DEF em Python, que é a palavra-chave usada para criar funções que são blocos de código que executam tarefas específicas. As funções podem receber parâmetros e retornar valores. Elas ajudam a deixar o código mais organizado e modular, além de permitir a reutilização de tarefas em diferentes partes do programa. É possível definir funções em Python usando a sintaxe básica com a palavra-chave DEF, o nome da função, os parâmetros, o corpo da função e a instrução return, que é opcional. Um exemplo prático é dado com o uso da função para remover caracteres especiais em um DataFrame.