Funções Python

PythonBeginner
Pratique Agora

Introdução

Em Python, uma função é um bloco de código organizado e reutilizável usado para executar uma única ação relacionada. As funções proporcionam melhor modularidade para sua aplicação e um alto grau de reutilização de código.

Neste laboratório, você aprenderá os fundamentos da criação e uso de funções em Python. Você praticará a definição de funções que aceitam argumentos, o uso de argumentos de palavra-chave (keyword arguments) para maior clareza, o retorno de valores, a compreensão da diferença entre escopos de variáveis locais e globais, e a criação de funções anônimas concisas com lambda.

Argumentos de Função

Nesta etapa, você aprenderá a definir uma função que aceita argumentos. Uma função pode receber argumentos, que são valores que você passa para a função quando a chama.

Nota: Se você não está familiarizado com o uso do WebIDE (semelhante ao VS Code), aprenda primeiro neste laboratório neste lab.

Vamos criar uma função que aceita um argumento name e imprime uma saudação personalizada.

Primeiro, abra o arquivo arguments.py no explorador de arquivos à esquerda.

Em seguida, copie e cole o seguinte código no arquivo arguments.py. Este código define uma função say_hello que aceita um argumento, name.

## Define a function that takes one argument
def say_hello(name):
   print(f'Hello {name}')

## Call the function with a string argument
say_hello('Carlos')
say_hello('Wanda')
say_hello('Rose')

Agora, vamos executar o script. Abra um terminal no WebIDE e execute o seguinte comando:

python3 arguments.py

Você deverá ver a função sendo chamada com nomes diferentes, produzindo uma saudação única para cada um.

Hello Carlos
Hello Wanda
Hello Rose

Isso demonstra como os argumentos tornam as funções flexíveis e reutilizáveis.

Argumentos de Palavra-Chave (Keyword Arguments)

Nesta etapa, você aprenderá a usar argumentos de palavra-chave (keyword arguments) para melhorar a legibilidade do código. Quando uma função tem múltiplos parâmetros, você pode especificar a qual parâmetro cada argumento corresponde usando o nome do parâmetro. Isso é chamado de argumento de palavra-chave.

Quando você usa argumentos posicionais, a ordem em que você os passa é importante. Com argumentos de palavra-chave, a ordem não importa, o que torna seu código mais explícito e fácil de entender.

Abra o arquivo keywords.py no explorador de arquivos. Copie e cole o código a seguir nele.

## Function with multiple parameters
def say_hi(name, greeting):
   print(f"{greeting} {name}")

## Positional arguments: order matters
print("Calling with positional arguments:")
say_hi('John', 'Hello')

## Keyword arguments: order doesn't matter, more readable
print("\nCalling with keyword arguments:")
say_hi(name='Anna', greeting='Hi')

Agora, execute o script a partir do terminal:

python3 keywords.py

Você verá a saída de ambas as chamadas de função. Observe como os argumentos de palavra-chave permitem que você passe valores em qualquer ordem.

Calling with positional arguments:
Hello John

Calling with keyword arguments:
Hi Anna

Valores de Retorno

Nesta etapa, você explorará como usar a instrução return para fazer com que uma função produza uma saída. Enquanto print() exibe um valor no console, return envia um valor de volta da função. Este valor retornado pode ser armazenado em uma variável ou usado em outras expressões.

Vamos criar uma função que recebe dois números, os soma e retorna o resultado.

Abra o arquivo returns.py e adicione o seguinte código. A função sum_two_numbers calcula a soma e usa a palavra-chave return para emitir o resultado.

## Function that returns a value using return statement
def sum_two_numbers(number_1, number_2):
   return number_1 + number_2

## Call function and store the returned value
result = sum_two_numbers(7, 8)
print(result)

Execute o script no terminal:

python3 returns.py

A saída será o valor que a função retornou, que foi armazenado na variável result e depois impresso.

15

Escopo Local e Global

Nesta etapa, você descobrirá a diferença entre os escopos de variáveis locais e globais. O escopo de uma variável determina onde no seu código ela pode ser acessada.

  • Escopo Global: Variáveis definidas fora de qualquer função estão no escopo global e podem ser acessadas de qualquer lugar no código, inclusive dentro de funções.
  • Escopo Local: Variáveis criadas dentro de uma função estão no escopo local dessa função. Elas só existem dentro dessa função e não podem ser acessadas de fora.

Vamos primeiro ver o que acontece quando você tenta acessar uma variável local a partir do escopo global. Se você executasse o código a seguir, ele levantaria um NameError porque local_variable não está definida no escopo global.

## This code will cause an error
global_variable = 'I am available everywhere'

def some_function():
    print(global_variable)
    local_variable = "only available within this function"
    print(local_variable)

## This will raise NameError because local_variable doesn't exist here
## print(local_variable)

A Declaração global

Se você precisar modificar uma variável global de dentro de uma função, você deve explicitamente informar ao Python que está fazendo isso com a declaração global.

Abra o arquivo scope.py e adicione o seguinte código. Aqui, a função spam usa a palavra-chave global para modificar a variável global eggs.

## Use 'global' keyword to modify global variable from inside function
def spam():
    global eggs  ## Declare that we're modifying the global variable
    eggs = 'spam'  ## This changes the global variable

eggs = 'global'
print(f"Before calling spam(), eggs is: {eggs}")
spam()  ## Function modifies global variable
print(f"After calling spam(), eggs is: {eggs}")

Agora, execute o script:

python3 scope.py

Observe a saída. O valor da variável global eggs é alterado permanentemente pela chamada da função.

Before calling spam(), eggs is: global
After calling spam(), eggs is: spam

Funções Lambda

Nesta etapa, você aprenderá a criar funções anônimas de linha única usando a palavra-chave lambda. Uma função lambda pode ter qualquer número de argumentos, mas pode ter apenas uma expressão. Elas são úteis para criar funções pequenas e temporárias sem a sobrecarga de uma definição de função padrão com def.

Por exemplo, uma função regular para somar dois números:

## Regular function definition
def add(x, y):
    return x + y

Isso é equivalente à seguinte função lambda:

## Lambda function: anonymous function defined in one line
add = lambda x, y: x + y

Lambdas também podem funcionar como closures lexicais, o que significa que elas podem "lembrar" um valor do escopo envolvente onde foram criadas. Vamos criar uma função que retorna uma lambda.

Abra o arquivo lambdas.py e adicione o seguinte código. A função make_adder recebe um número n e retorna uma nova função lambda que adiciona n a qualquer número x.

## Lambda closure: lambda function that captures a variable from the outer scope
def make_adder(n):
    return lambda x: x + n  ## Lambda captures 'n' from the outer function

## Create a function that adds 3
plus_3 = make_adder(3)

## Use the new function
result = plus_3(4)  ## This will be 4 + 3
print(result)

Execute o script no seu terminal:

python3 lambdas.py

A saída mostra o resultado de chamar a função lambda que foi criada e retornada por make_adder.

7

Você também pode criar outros somadores, por exemplo, plus_5 = make_adder(5), que criaria uma função que adiciona 5 ao seu argumento.

Resumo

Neste laboratório, você explorou os conceitos centrais de funções em Python. Você aprendeu a definir funções e a passar informações para elas usando argumentos. Você praticou o uso de argumentos posicionais e de palavra-chave (keyword arguments) para tornar suas chamadas de função mais claras. Você também aprendeu a fazer com que as funções produzam resultados com a declaração return, como gerenciar a acessibilidade de variáveis com escopos locais e globais, e como usar a palavra-chave global para modificar variáveis fora de uma função. Por fim, você foi apresentado ao poder e à concisão das funções anônimas lambda para criar funções simples de linha única e closures.