Definição e Estrutura de Funções
No desenvolvimento em Python, funções são blocos de construção essenciais que permitem o reaproveitamento de código e a modularização da lógica. A sintaxe básica utiliza a palavra-chave def seguida pelo nome da função e parênteses.
# Função sem parâmetros e sem retorno
def exibir_saudacao():
print("Olá, bem-vindo ao sistema!")
exibir_saudacao()
# Função sem parâmetros com retorno de valor
def obter_versao_sistema():
return "v2.1.0"
print(f"Versão atual: {obter_versao_sistema()}")
# Função com parâmetros sem retorno
def registrar_log(mensagem):
print(f"[LOG]: {mensagem}")
registrar_log("Inicializando processos...")
# Função com parâmetros e retorno (Cálculo de somatório)
def calcular_soma_intervalo(limite):
total = 0
for n in range(1, limite + 1):
total += n
return total
resultado = calcular_soma_intervalo(50)
print(f"A soma de 1 a 50 é: {resultado}")
Gerenciamento de Parâmetros
Parâmetros com Valores Padrão
Python permite definir valores padrão para argumentos. Caso o chamador não forneça um valor, o padrão é utilizado. É mandatório que parâmetros com valores padrão sejam declarados após os parâmetros obrigatórios.
def configurar_conexao(host, porta=8080):
print(f"Conectando a {host} na porta {porta}")
# Chamada omitindo o parâmetro padrão
configurar_conexao("127.0.0.1")
# Chamada sobrescrevendo o valor padrão
configurar_conexao("192.168.0.1", porta=443)
Argumentos de Extensão Variável (*args e **kwargs)
Para funções que precisam lidar com um número dinâmico de argumentos, utiliza-se *args para capturar múltiplos argumentos posicionais (como uma tupla) e **kwargs para argumentos nomeados (como um dicionário).
def processar_pedido(cliente, *itens, **detalhes):
print(f"Cliente: {cliente}")
print("Itens solicitados:", itens)
print("Informações adicionais:")
for chave, valor in detalhes.items():
print(f" - {chave}: {valor}")
processar_pedido("João Silva", "Laptop", "Mouse", "Teclado", frete="Expresso", cupom="DESC10")
Mecânica de Passagem por Referência
Em Python, todos os parâmetros são passados por referência. No entanto, o comportamento difere entre tipos mutáveis e imutáveis:
- Imutáveis (int, string, tuple): O valor original não é alterado, pois qualquer modificação gera um novo objeto.
- Mutáveis (list, dict): Alterações realizadas dentro da função refletem diretamente no objeto original.
def modificar_objetos(valor, lista):
valor += 10
lista.append("Novo Item")
print(f"Interno - Inteiro: {valor}, Lista: {lista}")
# Teste com imutável (int) e mutável (list)
meu_num = 5
minha_lista = ["Item A"]
modificar_objetos(meu_num, minha_lista)
print(f"Externo - Inteiro: {meu_num}, Lista: {minha_lista}")
# O inteiro permanece 5, mas a lista foi modificada.
Funções Anônimas (Lambda)
Expressões lambda são funções de uma única linha, frequentemente utilizadas para operações rápidas onde uma definição formal via def seria excessiva.
# Estrutura: lambda argumentos: expressão
multiplicador = lambda x, y: x * y
print(f"Resultado da multiplicação: {multiplicador(5, 4)}")
Aplicações Práticas de Lambdas
As lambdas são poderosas quando usadas como argumentos para outras funções ou métodos de ordenação.
# 1. Callback em funções de alta ordem
def operacao_matematica(a, b, acao):
return acao(a, b)
resultado_subtracao = operacao_matematica(20, 8, lambda x, y: x - y)
print(f"Subtração via lambda: {resultado_subtracao}")
# 2. Ordenação de estruturas complexas
produtos = [
{"nome": "Monitor", "preco": 1200},
{"nome": "Cadeira", "preco": 850},
{"nome": "Mesa", "preco": 1500}
]
# Ordenar por preço de forma crescente
produtos.sort(key=lambda item: item["preco"])
print("Ordenado por preço:", produtos)
# Ordenar alfabeticamente pelo nome
produtos.sort(key=lambda item: item["nome"])
print("Ordenado por nome:", produtos)