Python Funções Básico
Funções e argumentos
Em Python, funções são blocos de código reutilizáveis que podem receber argumentos para personalizar seu comportamento. Você pode passar argumentos por posição ou por nome (keyword arguments), o que torna a chamada mais legível e permite alterar a ordem. Além disso, funções podem ter valores padrão para parâmetros, mas cuidado: usar um objeto mutável como padrão (ex.: []) pode causar surpresas, pois o valor é compartilhado entre chamadas.
Para aceitar um número variável de argumentos, use *args (para posicionais) e **kwargs (para nomeados). Isso é útil quando você não sabe quantos argumentos serão passados. Por fim, Python 3 introduziu parâmetros keyword-only, que só podem ser passados por nome, usando * na definição. Isso força a clareza na chamada e evita erros.
Neste card, você vai explorar esses recursos com exemplos práticos e exercícios que cobrem desde o básico até um desafio que combina todos os conceitos.
Pontos-chave
- Argumentos nomeados permitem passar valores associando o nome do parâmetro, melhorando a legibilidade.
- Valores padrão mutáveis são avaliados uma única vez e compartilhados entre chamadas; use
Nonecomo padrão e crie o objeto dentro da função. *argscaptura argumentos posicionais extras como uma tupla;**kwargscaptura argumentos nomeados extras como um dicionário.- Parâmetros keyword-only são definidos após um
*e só podem ser passados por nome. - A ordem dos parâmetros na definição importa: posicionais, *args, keyword-only com padrão, **kwargs.
# Exemplo completo de funções e argumentos em Python
def saudacao(nome, mensagem="Olá"):
"""Função com argumento posicional e valor padrão."""
return f"{mensagem}, {nome}!"
# Argumento posicional
print(saudacao("Ana")) # Olá, Ana!
# Argumento nomeado
print(saudacao(nome="Beto", mensagem="Bom dia")) # Bom dia, Beto!
# Valor padrão mutável (evite!)
def adicionar_item(item, lista=[]):
lista.append(item)
return lista
print(adicionar_item("a")) # ['a']
print(adicionar_item("b")) # ['a', 'b'] -> surpresa!
# Forma correta: usar None como padrão
def adicionar_item_seguro(item, lista=None):
if lista is None:
lista = []
lista.append(item)
return lista
print(adicionar_item_seguro("a")) # ['a']
print(adicionar_item_seguro("b")) # ['b']
# *args e **kwargs
def mostra_tudo(*args, **kwargs):
print("Posicionais:", args)
print("Nomeados:", kwargs)
mostra_tudo(1, 2, 3, nome="Ana", idade=25)
# Keyword-only: após *
def configurar(*, host, porta=8080):
return f"{host}:{porta}"
print(configurar(host="localhost")) # localhost:8080
# print(configurar("localhost")) # Erro: argumento posicional não permitido