kb.erickguedes.com
Python: De Noob a Hero

Funções

Aula 4 de 10

Definindo Funções

def saudacao(nome):
    """Documentação: exibe saudação."""
    return f"Olá, {nome}!"

print(saudacao("Maria"))

# Múltiplos parâmetros
def soma(a, b):
    return a + b

Parâmetros

# Parâmetros posicionais
def config(host, porta, debug=False):
    print(f"{host}:{porta}, debug={debug}")

# Chamadas válidas
config("localhost", 8080)
config("localhost", 8080, True)
config(host="localhost", porta=8080, debug=True)
config(porta=8080, host="localhost")  # kwargs fora de ordem

# Parâmetros default (devem vir após obrigatórios)
def login(user, pwd, timeout=30, retries=3):
    pass

# *args (argumentos posicionais variáveis)
def soma(*numeros):
    return sum(numeros)

print(soma(1, 2, 3, 4, 5))  # 15

# **kwargs (argumentos nomeados variáveis)
def exibir(**dados):
    for chave, valor in dados.items():
        print(f"{chave}: {valor}")

exibir(nome="Ana", idade=30, cidade="SP")

Escopo

global_var = 10

def funcao():
    global global_var
    local_var = 5
    global_var += 1          # modifica variável global
    print(global_var)        # 11
    print(local_var)         # 5

# nonlocal (closures)
def externa():
    x = 0
    def interna():
        nonlocal x
        x += 1
        return x
    return interna

contador = externa()
print(contador())  # 1
print(contador())  # 2

Funções Lambda

# lambda args: expressão
quadrado = lambda x: x ** 2
print(quadrado(5))       # 25

# Úteis com sorted, filter, map
numeros = [3, 1, 4, 1, 5]
ordenado = sorted(numeros, key=lambda x: -x)  # [5, 4, 3, 1, 1]

pares = list(filter(lambda x: x % 2 == 0, range(10)))  # [0, 2, 4, 6, 8]
dobros = list(map(lambda x: x * 2, range(5)))           # [0, 2, 4, 6, 8]

Decorators

from functools import wraps
import time

def timer(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        inicio = time.time()
        resultado = func(*args, **kwargs)
        duracao = time.time() - inicio
        print(f"{func.__name__} levou {duracao:.3f}s")
        return resultado
    return wrapper

@timer
def processar():
    time.sleep(0.5)
    return "feito"

Funções são cidadãs de primeira classe em Python: podem ser passadas como argumento, retornadas e armazenadas. Use *args/**kwargs para APIs flexíveis.