Python: Parâmetros Avançados e Escopo
Última atualização: 2026-09-22
Agora que você aprendeu o básico das funções, vamos explorar algumas técnicas avançadas. De quantas maneiras você pode escrever parâmetros? O que significa "escopo de variável"? O que é recursão? Estes conceitos levarão seu entendimento de funções ao próximo nível.
1. Parâmetros Padrão
Parâmetros padrão permitem omitir argumentos ao chamar uma função:
▶ Exemplo: Parâmetros Padrão Básicos
▶ ExperimenteSaída:
# Function defined successfully
(1) ⚠️ A Armadilha do Parâmetro Padrão
Os valores dos parâmetros padrão são avaliados apenas uma vez, no momento da definição da função, não cada vez que a função é chamada. Se o padrão for um objeto mutável (como uma lista ou dicionário), isso pode levar a comportamento inesperado:
▶ Exemplo: Armadilha do Padrão Mutável
def add_item(item, items=[]): # ❌ Perigoso!
items.append(item)
return items
print(add_item("maçã")) # ['maçã']
print(add_item("banana")) # ['maçã', 'banana'] — não ['banana']!
print(add_item("laranja")) # ['maçã', 'banana', 'laranja']
Por quê: A lista vazia items=[] é criada uma vez na definição da função. Cada chamada subsequente adiciona à mesma lista.
Abordagem correta: Use None como padrão e crie uma nova lista dentro da função:
▶ Exemplo: Parâmetro Padrão Seguro
▶ ExperimenteSaída:
# Function defined successfully
None, números, strings, tuplas). Nunca use objetos mutáveis como listas ou dicionários como padrão.
2. Argumentos Nomeados (Keyword Arguments)
Ao chamar uma função, você pode especificar valores pelo nome do parâmetro, permitindo passar argumentos fora de ordem:
▶ Exemplo: Argumentos Nomeados
▶ ExperimenteSaída:
# Function defined successfully
3. *args: Argumentos Posicionais Variáveis
Se você não sabe quantos argumentos uma função receberá, use *args:
▶ Exemplo: *args para Função de Soma
▶ ExperimenteSaída:
# Function defined successfully
*args empacota todos os argumentos posicionais em uma tupla:
▶ Exemplo: Inspecionando args
▶ ExperimenteSaída:
# Function defined successfully
4. **kwargs: Argumentos Nomeados Variáveis
**kwargs aceita qualquer número de argumentos nomeados e os empacota em um dicionário:
▶ Exemplo: **kwargs para Construir Perfis de Usuário
▶ ExperimenteSaída:
Perfil do Usuário:
name: Alice
age: 25
city: São Paulo
job: Engenheira
▶ Exemplo: Combinando *args e **kwargs
▶ ExperimenteSaída:
# Function defined successfully
parâmetros normais → *args → parâmetros padrão → **kwargs
5. Escopo: Regra LEGB
Onde uma variável pode ser acessada? Isso é determinado pelo escopo. Python tem quatro níveis de escopo:
▶ Exemplo: Aninhamento de Escopo LEGB
▶ ExperimenteSaída:
# Function defined successfully
LEGB significa:
- Local — dentro da função atual
- Enclosing (envolvente) — locais da função envolvente
- Global — nível do módulo
- Built-in — funções embutidas do Python (como
print,len)
Python busca variáveis na ordem L → E → G → B.
(1) global e nonlocal
Para modificar uma variável global dentro de uma função, use global:
▶ Exemplo: Usando global
▶ ExperimenteSaída:
# Function defined successfully
global. Variáveis globais tornam o código mais difícil de entender e depurar. Funções devem receber entrada através de parâmetros e retornar saída através de return, não modificar secretamente variáveis globais.
6. Básico de Recursão
Recursão é quando uma função chama a si mesma. A ideia central: transforme um grande problema em subproblemas menores e similares.
▶ Exemplo: Fatorial Recursivo
▶ ExperimenteExecução:
factorial(5) = 5 * factorial(4)
= 5 * 4 * factorial(3)
= 5 * 4 * 3 * factorial(2)
= 5 * 4 * 3 * 2 * factorial(1)
= 5 * 4 * 3 * 2 * 1
= 120
▶ Exemplo: Sequência de Fibonacci (Dificuldade ⭐⭐⭐)
▶ ExperimenteSaída:
# Function defined successfully
7. Casos de Uso Comuns
- Parâmetros padrão: Opções de configuração, valores de timeout, funções de callback.
*args: Funções de agregação matemática (soma, média), formatação de log.**kwargs: Wrappers de função, mesclagem de configuração, parâmetros de consulta de banco de dados.- Recursão: Travessia de árvore de diretórios, análise JSON aninhada, fórmulas matemáticas (fatorial/fibonacci).
- Escopo: Entender closures (próxima lição), entender tempo de vida de variáveis.
❓ Perguntas Frequentes
*args e a sintaxe de desempacotamento de palavras-chave?*args e o desempacotamento de palavras-chave com dois asteriscos são apenas convenções de nomenclatura — os asteriscos são o que importa. Você poderia escrever *numbers ou usar dois asteriscos com options. Mas seguir a convenção é recomendado para que outros programadores Python entendam imediatamente.x = 10 dentro de uma função é tratado como "criar uma variável local x." Se você realmente precisa modificar uma global, use global. Mas isso geralmente significa que seu design pode ser melhorado.📖 Resumo
- Parâmetros padrão adicionam flexibilidade; nunca use objetos mutáveis como padrão
- Argumentos nomeados permitem passar por nome, não por posição
*argsempacota argumentos posicionais extras em uma tupla;**kwargsempacota argumentos nomeados em um dict- Ordem dos parâmetros: normal →
*args→ padrões →**kwargs - Regra LEGB determina a ordem de busca de variáveis: Local → Enclosing → Global → Built-in
globalmodifica variáveis globais de dentro de uma função; minimize seu uso- Recursão é uma função chamando a si mesma; precisa de condição de término e condição recursiva
📝 Exercícios
-
Básico (Dificuldade ⭐): Escreva uma função
multiply(*nums)que aceita qualquer número de números e retorna seu produto. Se nenhum argumento, retorne 0. -
Intermediário (Dificuldade ⭐⭐): Escreva uma função
create_student(name, **scores)que recebe um nome de aluno e qualquer número de notas de disciplinas (argumentos nomeados), calcula e retorna a média. Exemplo de chamada:create_student("Alice", Português=85, Matemática=92, Inglês=78). -
Desafio (Dificuldade ⭐⭐⭐): Escreva uma função recursiva
sum_digits(n)que calcula a soma dos dígitos de um inteiro positivo. Por exemplo,sum_digits(123)retorna1+2+3=6. Dica: Módulo 10 dá o último dígito; divisão inteira por 10 o remove. Condição de término: n < 10.