Conceitos e Sintaxe de Funções em Python

Funções são estruturas fundamentais na programação, permitindo a reutilização de código e a modularização de lógicas complexas. Vamos explorar a sintaxe e os conceitos essenciais de funções em Python.

Cenários de Uso de Funções

Considere um cenário onde percisamos processar dados de vendas repetidamente. Sem funções, o código pode se tornar redundante:

vendas = [100, 200, 300, 400]
total = 0
for valor in vendas:
    total += valor
media = total / len(vendas)
print(f"Total: {total}, Média: {media}")

# Repetição semelhante para outro conjunto de dados
outras_vendas = [50, 150, 250]
total2 = 0
for valor in outras_vendas:
    total2 += valor
media2 = total2 / len(outras_vendas)
print(f"Total: {total2}, Média: {media2}")

Para eliminar essa duplicidade, encapsulamos a lógica em uma função:

def calcular_estatisticas(dados):
    soma = 0
    for elemento in dados:
        soma += elemento
    media_calculada = soma / len(dados) if len(dados) > 0 else 0
    return soma, media_calculada

vendas_1 = [100, 200, 300, 400]
total_1, media_1 = calcular_estatisticas(vendas_1)
print(f"Total: {total_1}, Média: {media_1}")

vendas_2 = [50, 150, 250]
total_2, media_2 = calcular_estatisticas(vendas_2)
print(f"Total: {total_2}, Média: {media_2}")

Ao definir a função calcular_estatisticas, reutilizamos o código simplesmente chamando-a com diferentes argumentos.

Estrutura Sintática Básica

A definição de uma função segue o padrão:

def nome_da_funcao():
    corpo_da_funcao

nome_da_funcao()  # Chamada

A palavra-chave def inicia a definição, seguida pelo nome e parênteses. O corpo é indentado e executado apenas quando a função é chamada.

Estruturas Avançadas

Funções podem incluir parâmetros e valores de retorno.

Função Vazia: Usada como maracdor durante o desenvolvimento.

def funcao_vazia():
    pass

Função com Parâmetros: Aceita entradas para processamento.

def saudacao(nome):
    print(f"Olá, {nome}!")

saudacao("Maria")

Função com Retorno: Devolve um valor ao chamador.

def quadrado(numero):
    resultado = numero ** 2
    return resultado

valor = quadrado(5)
print(valor)  # Saída: 25

Valores de Retorno

O valor de retorno é a saída produzida por uma função. Métodos embutidos, como pop em listas, exemplificam isso:

lista_exemplo = [10, 20, 30]
item_removido = lista_exemplo.pop()
print(item_removido)  # 30
nova_lista = lista_exemplo
print(nova_lista)  # [10, 20]

A palavra-chave return define o valor de retorno. Se omitido, a função retorna None.

def verificar_par(numero):
    if numero % 2 == 0:
        return True
    return False

resultado = verificar_par(4)
print(resultado)  # True

def imprimir_mensagem():
    print("Processando...")
    # Sem return explícito, retorna None

saida = imprimir_mensagem()
print(saida)  # None

Múltiplos valores são retornados como uma tupla:

def min_max(dados):
    menor = min(dados)
    maior = max(dados)
    return menor, maior

valores = [3, 1, 4, 1, 5]
min_val, max_val = min_max(valores)
print(min_val, max_val)  # 1 5

Parâmetros de Funções (Foco Principal)

Funções podem ser sem parâmetros ou com parâmetros, permitindo a passagem de dados.

Parâmetros Formais vs. Argumentos Reais

Parâmetros formais são variáveis declaradas na definição. Argumentos reais são os valores passados na chamada.

def calcular_desconto(preco, taxa):
    desconto = preco * (taxa / 100)
    return preco - desconto

preco_final = calcular_desconto(100, 10)
print(preco_final)  # 90.0

Aqui, preco e taxa são parâmetros formais; 100 e 10 são argumentos reais.

Argumentos Posicionais

Passados na ordem definida:

def concatenar(texto1, texto2):
    return texto1 + " " + texto2

resultado = concatenar("Bom", "dia")
print(resultado)  # Bom dia

Argumentos por Palavra-chave

Permitem especificar quais parâmetros recebem quais valores:

def exibir_info(nome, idade):
    print(f"{nome} tem {idade} anos")

exibir_info(idade=25, nome="Carlos")

Ao misturar argumentos posicionais e por palavra-chave, os posicionais devem vir primeiro:

def funcao_mista(a, b, c):
    print(a, b, c)

funcao_mista(1, c=3, b=2)  # Saída: 1 2 3

Parâmetros Padrão

Definem valores default, usados quando não fornecidos:

def gerar_relatorio(dados, formato="texto"):
    if formato == "texto":
        print("Relatório em texto:", dados)
    else:
        print("Relatório em outro formato:", dados)

gerar_relatorio([1, 2, 3])  # Usa formato padrão "texto"
gerar_relatorio([4, 5, 6], formato="gráfico")

Parâmetros padrão devem seguir os não-padrão na definição.

Parâmetros Variáveis (*args e **kwargs)

*args coleta argumentos posicionais adicionais em uma tupla:

def soma_variavel(*numeros):
    total = 0
    for num in numeros:
        total += num
    return total

print(soma_variavel(1, 2, 3))  # 6
print(soma_variavel(10, 20))   # 30

**kwargs coleta argumentos por palavra-chave adicionais em um dicionário:

def mostrar_configuracoes(**opcoes):
    for chave, valor in opcoes.items():
        print(f"{chave}: {valor}")

mostrar_configuracoes(tema="claro", fonte="Arial")

Esses parâmetros podem ser combinados com outros:

def funcao_complexa(a, b=10, *args, **kwargs):
    print(a, b)
    print("args:", args)
    print("kwargs:", kwargs)

funcao_complexa(1, 2, 3, 4, chave="valor")
# Saída:
# 1 2
# args: (3, 4)
# kwargs: {'chave': 'valor'}

Na chamada, * desempcaota iteráveis e ** desempacota dicionários:

def processar(a, b, c):
    print(a, b, c)

lista = [10, 20, 30]
processar(*lista)  # 10 20 30

dicionario = {'a': 1, 'b': 2, 'c': 3}
processar(**dicionario)  # 1 2 3

Ordem dos Parâmetros na Definição

A ordem recomendada é: parâmetros normais, parâmetros padrão, *args, **kwargs.

def exemplo_final(x, y=5, *args, **kwargs):
    print(f"x={x}, y={y}")
    print("args:", args)
    print("kwargs:", kwargs)

exemplo_final(1, 2, 3, 4, nome="teste")
# Saída:
# x=1, y=2
# args: (3, 4)
# kwargs: {'nome': 'teste'}

Exercício Prático

Crie funções para gerenciar uma lista de tarefas. Implemente adicionar_tarefa e listar_tarefas.

tarefas = []

def adicionar_tarefa(descricao, prioridade="média"):
    nova_tarefa = {"descricao": descricao, "prioridade": prioridade, "concluida": False}
    tarefas.append(nova_tarefa)
    print(f"Tarefa adicionada: {descricao}")

def listar_tarefas():
    if not tarefas:
        print("Nenhuma tarefa cadastrada.")
    else:
        for i, tarefa in enumerate(tarefas, 1):
            status = "Concluída" if tarefa["concluida"] else "Pendente"
            print(f"{i}. {tarefa['descricao']} - Prioridade: {tarefa['prioridade']} - {status}")

# Uso
adicionar_tarefa("Estudar Python")
adicionar_tarefa("Fazer exercícios", prioridade="alta")
listar_tarefas()

Tags: Python funções parâmetros retorno argumentos

Publicado em 6-4 17:56 por Thomas