Trilha de aprendizado · Nível 4 · Tutorial 3

Usar argumentos nomeados e valores padrão

Defina funções com opções claras de chamada e valores padrão seguros, sem compartilhar coleções mutáveis por acidente.

  • Nível: Iniciante
  • Duração: 20 min
  • 8 passos
Usar argumentos nomeados e valores padrão

O que você vai percorrer

  1. Associar argumentos por posição e por nome Identifique como argumentos posicionais e nomeados são associados aos parâmetros de uma função. 2 min
  2. Definir parâmetros com valores padrão Defina parâmetros opcionais e reconheça quando uma chamada usa ou substitui seus valores padrão. 3 min
  3. Combinar argumentos sem ambiguidade Misture argumentos posicionais e nomeados para alterar apenas as opções desejadas, sem preencher o mesmo parâmetro duas vezes. 2 min
  4. Reconhecer e corrigir chamadas inválidas Localize conflitos entre parâmetros e argumentos, diferencie erros de associação de erros de sintaxe e faça a menor correção necessária. 2 min
  5. Entender quando o padrão é avaliado Descubra por que reatribuir uma variável depois da definição não altera o valor padrão já armazenado por uma função. 2 min
  6. Prever o acúmulo em um padrão mutável Entenda por que uma lista usada como valor padrão pode guardar dados de chamadas anteriores. 3 min
  7. Criar uma coleção independente com None Use None como marcador para criar uma lista nova quando nenhuma coleção for fornecida, preservando listas recebidas do chamador. 3 min
  8. Aplicar e revisar chamadas com padrões seguros Complete e execute uma função que combina argumento obrigatório, opção textual padrão e uma lista opcional criada com segurança. 4 min

O que você vai aprender

  • Associar argumentos posicionais e nomeados aos parâmetros corretos.
  • Definir parâmetros opcionais e combinar argumentos sem omissões ou atribuições duplicadas.
  • Prever o compartilhamento causado por um valor padrão mutável em chamadas sucessivas.
  • Usar None como marcador para criar uma coleção independente quando um argumento for omitido.

Antes de começar

  • Definir funções com parâmetros e retorno
  • Controlar o escopo e o estado das funções

Passo 1 de 8

Associar argumentos por posição e por nome

Identifique como argumentos posicionais e nomeados são associados aos parâmetros de uma função.

Associação por posição

A ordem determina o destino

Você já conhece a diferença entre parâmetros e argumentos. Em uma chamada com argumentos posicionais, o primeiro argumento é associado ao primeiro parâmetro, o segundo argumento ao segundo parâmetro e assim por diante.

Leia da esquerda para a direita

Na chamada, "Caio" ocupa a posição de nome, enquanto "Bom dia" ocupa a posição de saudacao.

python
def montar_saudacao(nome, saudacao):
    return f"{saudacao}, {nome}!"

mensagem = montar_saudacao("Caio", "Bom dia")
print(mensagem)  # Bom dia, Caio!

Do argumento ao parâmetro

Compare as associações por posição e por nome.

Diagrama com uma definição de função e duas chamadas válidas. Na chamada posicional, Caio se conecta a nome e Bom dia se conecta a saudacao. Na chamada nomeada em ordem invertida, cada argumento se conecta ao parâmetro de mesmo nome.

Por posição, siga a ordem. Por nome, siga os rótulos, mesmo quando aparecem em outra ordem.

Associação pelo nome

O nome seleciona o parâmetro

Em uma chamada totalmente nomeada, escreva nome=valor para indicar diretamente qual parâmetro receberá o argumento. Como a associação depende dos nomes, você pode mudar a ordem dos argumentos nomeados sem mudar o resultado.

Mesma associação, outra ordem

As duas chamadas fornecem os mesmos valores aos mesmos parâmetros.

python
def montar_saudacao(nome, saudacao):
    return f"{saudacao}, {nome}!"

primeira = montar_saudacao(nome="Caio", saudacao="Bom dia")
segunda = montar_saudacao(saudacao="Bom dia", nome="Caio")

print(primeira)  # Bom dia, Caio!
print(segunda)   # Bom dia, Caio!

Dica

Duas estratégias de leitura

Em chamadas posicionais, trace as associações da esquerda para a direita. Em chamadas nomeadas, procure o parâmetro que possui exatamente o nome escrito antes de =.

Pratique as associações

Qual valor cada parâmetro recebe?

Considere def montar_saudacao(nome, saudacao):. Relacione cada chamada à associação correta.

Toque em um item e depois no par correspondente.

Passo 2 de 8

Definir parâmetros com valores padrão

Defina parâmetros opcionais e reconheça quando uma chamada usa ou substitui seus valores padrão.

Obrigatórios e opcionais

Um valor disponível quando o argumento é omitido

Na definição, escreva parâmetro=valor para estabelecer um valor padrão. Um parâmetro sem padrão é obrigatório; um parâmetro com padrão pode ser omitido na chamada. Em assinaturas simples, coloque primeiro os parâmetros obrigatórios e depois os que possuem padrão.

Texto obrigatório, duas opções

texto é obrigatório. prefixo e final possuem valores padrão.

python
def montar_mensagem(texto, prefixo="INFO", final="."):
    return f"{prefixo}: {texto}{final}"

print(montar_mensagem("Servidor ativo"))
# INFO: Servidor ativo.

Definição e chamada lado a lado

Observe que o mesmo sinal = desempenha papéis diferentes conforme o lugar em que aparece.

Comparação entre uma definição de função com valores padrão e uma chamada com argumentos nomeados.

Na definição, = estabelece um padrão. Na chamada, = associa um argumento ao parâmetro indicado pelo nome.

Omitir ou substituir

A chamada decide qual valor será usado

Quando um argumento opcional é omitido, a função usa o padrão da definição. Quando o argumento é fornecido, o valor recebido substitui o padrão somente naquela chamada.

Exemplo

Compare as chamadas

Com a função montar_mensagem já definida:

padrao = montar_mensagem("Servidor ativo")
personalizada = montar_mensagem(
    texto="Servidor ativo",
    prefixo="AVISO",
    final="!"
)

print(padrao)       # INFO: Servidor ativo.
print(personalizada)  # AVISO: Servidor ativo!

A primeira chamada omite as duas opções. A segunda fornece novos valores por nome.

Confira sua compreensão

Complete a definição

Complete a assinatura com o parâmetro obrigatório chamado mensagem:

def criar_aviso(____, urgente=False):

Quais valores serão usados?

Considere def montar_mensagem(texto, prefixo="INFO", final="."):. Na chamada montar_mensagem(texto="Pronto", prefixo="OK"), quais valores recebem texto, prefixo e final, nessa ordem?

Passo 3 de 8

Combinar argumentos sem ambiguidade

Misture argumentos posicionais e nomeados para alterar apenas as opções desejadas, sem preencher o mesmo parâmetro duas vezes.

Posição primeiro, nomes depois

Combine as duas formas

Em uma chamada simples, escreva primeiro os argumentos posicionais e depois os nomeados. Os posicionais preenchem os parâmetros na ordem; cada argumento nomeado seleciona, pelo nome, um parâmetro que ainda não foi preenchido.

Uma função com duas opções

O texto é obrigatório. prefixo e final têm valores padrão.

python
def montar_mensagem(texto, prefixo="INFO", final="."):
    return f"{prefixo}: {texto}{final}"

mensagem = montar_mensagem("Servidor ativo", final="!")
print(mensagem)  # INFO: Servidor ativo!

Como os valores são associados

Na chamada do exemplo, o argumento posicional ocupa o primeiro parâmetro. O argumento nomeado salta diretamente para final, enquanto prefixo conserva seu padrão.

Diagrama com três espaços de parâmetros. Um argumento posicional aponta para o primeiro espaço, um argumento nomeado aponta para o terceiro e o segundo permanece com o valor padrão.

Por posição: primeiro espaço disponível. Por nome: parâmetro indicado. As demais opções mantêm seus padrões.

Altere somente o necessário

Obrigatórios também aceitam nome

Um parâmetro obrigatório pode ser fornecido pelo nome. Se todos os argumentos forem nomeados, a ordem deles na chamada pode mudar. Isso permite escolher uma opção posterior sem informar as opções anteriores.

Duas chamadas válidas

Compare o preenchimento dos parâmetros em cada chamada.

python
print(montar_mensagem("Servidor ativo", final="!"))
# INFO: Servidor ativo!

print(montar_mensagem(final="?", texto="Tudo certo"))
# INFO: Tudo certo?

Dica

Cada parâmetro recebe um único valor

Depois que texto recebe um valor por posição, não use texto=... na mesma chamada. A chamada montar_mensagem("Ativo", texto="Inativo") é inválida porque tenta preencher texto duas vezes.

Escolha a chamada sem conflito

Preserve um dos padrões

Qual chamada fornece o texto por posição, altera final para "!" e mantém o prefixo padrão?

Forneça o obrigatório pelo nome

Complete a chamada

Complete a chamada para produzir INFO: Tudo certo? sem fornecer um valor para prefixo:

montar_mensagem(____, final="?")

Passo 4 de 8

Reconhecer e corrigir chamadas inválidas

Localize conflitos entre parâmetros e argumentos, diferencie erros de associação de erros de sintaxe e faça a menor correção necessária.

Quatro causas de chamadas inválidas

Compare a assinatura com a chamada

Para diagnosticar uma chamada, leia primeiro a assinatura e marque quais parâmetros já receberam valores. Procure um obrigatório vazio, um nome inexistente, dois valores destinados ao mesmo parâmetro ou um argumento posicional colocado depois de um nomeado.

Teste somente um caso por vez

Todas as chamadas inválidas estão comentadas para que o arquivo possa ser executado. Descomente apenas uma, execute e volte a comentá-la antes de testar a próxima. O último caso precisa permanecer isolado: seu SyntaxError impede que o Python execute qualquer parte do arquivo.

python
def montar_mensagem(texto, prefixo="INFO", final="."):
    return f"{prefixo}: {texto}{final}"

# Caso 1: argumento obrigatório ausente
# montar_mensagem()

# Caso 2: nome que não existe na assinatura
# montar_mensagem("Falha", categoria="ERRO")

# Caso 3: dois valores para o mesmo parâmetro
# montar_mensagem("Falha", texto="Parada")

# Caso 4: posicional explícito depois de nomeado
# montar_mensagem(prefixo="ERRO", "Falha")

Associação inválida ou ordem sintática?

Mapa visual dos conflitos

Use os encaixes para distinguir as quatro causas: espaço obrigatório vazio, nome sem encaixe, duas setas para o mesmo espaço e argumento posicional atravessando a barreira criada por um nomeado.

Diagrama em quatro partes: parâmetro obrigatório sem valor, argumento com nome sem parâmetro correspondente, dois argumentos apontando para o mesmo parâmetro e argumento posicional colocado depois de um nomeado.

Nos três primeiros casos, a chamada pode ser analisada, mas a associação falha com TypeError. No quarto, a própria ordem escrita é inválida e produz SyntaxError.

Atenção

O `SyntaxError` acontece antes da execução

Quando um argumento posicional explícito aparece depois de um nomeado, o Python não consegue analisar a chamada. Se essa linha estiver ativa em um arquivo, nem as linhas anteriores serão executadas. Já os outros três casos chegam à tentativa de chamada e produzem TypeError.

Dica

Não memorize a mensagem inteira

O texto exato do erro pode variar entre versões do Python. Compare a assinatura com a chamada: confira os obrigatórios, valide os nomes, trace um único valor para cada parâmetro e só depois verifique a ordem dos argumentos.

Relacione cada chamada à causa

Diagnóstico das chamadas

Considere def montar_mensagem(texto, prefixo="INFO", final="."):. Relacione cada chamada inválida à sua causa.

Toque em um item e depois no par correspondente.

Faça a menor correção

Duas chamadas para corrigir

As linhas permanecem comentadas porque são inválidas. Reescreva cada chamada de modo que texto receba "Falha" e prefixo receba "ERRO", sem alterar a definição da função.

python
def montar_mensagem(texto, prefixo="INFO", final="."):
    return f"{prefixo}: {texto}{final}"

# A: texto recebe dois valores
# montar_mensagem("Falha", texto="Parada")

# B: posicional aparece depois de nomeado
# montar_mensagem(prefixo="ERRO", "Falha")

Corrija e justifique

Apresente uma correção para A e outra para B. Em seguida, explique por que A representa valor duplicado e B representa ordem sintática inválida.

Escreva pelo menos 40 caracteres (0/40).

Passo 5 de 8

Entender quando o padrão é avaliado

Descubra por que reatribuir uma variável depois da definição não altera o valor padrão já armazenado por uma função.

O padrão é definido junto com a função

O momento decisivo

A expressão usada como valor padrão é avaliada quando a instrução def é executada — não a cada chamada. O objeto obtido nesse momento fica armazenado como padrão e é reutilizado quando o argumento correspondente é omitido.

Por isso, reatribuir depois a variável usada na definição não atualiza automaticamente o padrão.

Definição antes da reatribuição

Observe a ordem de execução e compare as duas chamadas finais.

python
saudacao = "Olá"

def montar(nome, inicio=saudacao):
    return f"{inicio}, {nome}!"

saudacao = "Oi"

print(montar("Lia"))
print(montar("Lia", inicio=saudacao))

Linha do tempo do valor padrão

Linha do tempo em que saudacao começa apontando para Olá, a execução de def armazena esse valor como padrão e depois saudacao passa a apontar para Oi sem alterar o padrão armazenado.

Ao executar def, o padrão recebe o valor associado a saudacao naquele momento. A reatribuição posterior muda a variável, mas não o padrão já armazenado.

Organize a linha do tempo

Do primeiro ao último evento

Coloque os eventos do exemplo na ordem em que acontecem.

  1. `saudacao` recebe o valor `"Olá"`.
  2. A chamada omite `inicio` e usa o padrão armazenado: `"Olá"`.
  3. A instrução `def` é executada e armazena `"Olá"` como padrão de `inicio`.
  4. `saudacao` é reatribuída e passa a receber `"Oi"`.

Omitir ou fornecer o argumento

Preveja as duas saídas

Depois de saudacao ser reatribuída para "Oi", o que estas chamadas exibem, nesta ordem?

montar("Lia")
montar("Lia", inicio=saudacao)

Passo 6 de 8

Prever o acúmulo em um padrão mutável

Entenda por que uma lista usada como valor padrão pode guardar dados de chamadas anteriores.

Uma lista criada uma única vez

O padrão continua existindo

Como visto no step anterior, o valor padrão é avaliado quando a instrução def é executada. Portanto, historico=[] cria uma única lista. Se uma chamada omite esse argumento, o parâmetro recebe uma referência para essa mesma lista padrão.

Acúmulo entre chamadas

Execute o código completo sem redefinir a função entre as chamadas:

python
def registrar(mensagem, historico=[]):
    historico.append(mensagem)
    print(historico)


registrar("Início")
registrar("Processando")
registrar("Fim")

# Saída:
# ['Início']
# ['Início', 'Processando']
# ['Início', 'Processando', 'Fim']

Atenção

O padrão não é uma lista nova por chamada

O append modifica a lista padrão existente. Ele não cria outra lista, por isso cada chamada que omite historico encontra os itens adicionados anteriormente.

Chamadas diferentes, mesmo objeto

O nome local muda; o objeto é compartilhado

Em cada chamada, historico é um nome local. Porém, criar novamente esse nome não cria outra lista: nas chamadas que omitem o argumento, ele aponta para o mesmo objeto armazenado como padrão. A chamada termina, mas esse objeto continua associado à definição da função.

Referências para a lista padrão

As três chamadas acessam a mesma lista. Cada append acrescenta um cartão ao objeto compartilhado, fazendo seu conteúdo crescer.

Diagrama de três chamadas sucessivas apontando para uma única lista compartilhada, que passa de um para dois e depois para três elementos.

Chamadas que omitem o argumento reutilizam a mesma lista padrão.

O risco vale para outras coleções mutáveis

Não é um comportamento exclusivo das listas

O mesmo risco aparece quando um dicionário ou conjunto é usado como padrão e modificado pela função. Atualizar um dicionário ou adicionar elementos a um conjunto altera o objeto reutilizado pelas próximas chamadas que omitirem o argumento.

Exemplo

Operações que também acumulam estado

Um padrão {} pode conservar novas chaves adicionadas durante chamadas anteriores. Um padrão set() pode conservar elementos incluídos anteriormente. O ponto em comum é: a função modifica um objeto mutável criado durante a execução de def.

Dica

Pergunta para diagnosticar o problema

Ao analisar um padrão mutável, pergunte: “A função modifica esse objeto?”. Se a resposta for sim, chamadas futuras que omitirem o argumento poderão observar as modificações anteriores.

Preveja antes de executar

Acompanhe as duas listas

Primeiro, preveja cada linha impressa. Depois, execute o código no seu computador sem redefinir a função.

python
def adicionar_tarefa(tarefa, tarefas=[]):
    tarefas.append(tarefa)
    print(tarefas)


adicionar_tarefa("ler")
adicionar_tarefa("praticar")
adicionar_tarefa("revisar", [])
adicionar_tarefa("testar")

Explique o resultado

Quais são as quatro listas impressas? Explique por que os dados se acumulam em algumas chamadas, mas não na chamada que fornece [] explicitamente.

Escreva pelo menos 80 caracteres (0/80).

Passo 7 de 8

Criar uma coleção independente com None

Use None como marcador para criar uma lista nova quando nenhuma coleção for fornecida, preservando listas recebidas do chamador.

Troque o padrão mutável por um marcador

Uma lista nova somente quando necessário

Em vez de usar uma lista como valor padrão, use None como marcador. Dentro da função, is None indica que uma nova lista deve ser criada. Se o chamador fornecer uma lista, a função usa essa mesma lista — mesmo que ela esteja vazia.

Padrão seguro com None

A lista é criada durante cada chamada que recebe o marcador, e não durante a definição da função.

python
def adicionar(item, destino=None):
    if destino is None:
        destino = []

    destino.append(item)
    return destino

Os dois caminhos da coleção

O teste separa duas situações: criar uma lista nova ou continuar com a lista recebida.

Fluxo em que None leva à criação de uma lista nova, enquanto uma lista recebida segue como o mesmo objeto; os caminhos terminam em append e return.

None cria uma lista; qualquer lista fornecida é preservada e modificada.

Compare as formas de chamada

Omitir, fornecer None ou fornecer uma lista

Com essa definição, omitir destino e fornecer None explicitamente têm o mesmo efeito: uma lista nova é criada. Já uma lista fornecida pertence ao chamador e continua sendo o mesmo objeto após a chamada.

Execute e confira os resultados

Copie o código para seu editor e observe tanto o conteúdo quanto as verificações de identidade.

python
def adicionar(item, destino=None):
    if destino is None:
        destino = []
    destino.append(item)
    return destino

primeira = adicionar("A")
segunda = adicionar("B")
terceira = adicionar("C", None)

vazia = []
retorno_vazia = adicionar("D", vazia)

preenchida = ["início"]
retorno_preenchida = adicionar("E", preenchida)

print(primeira)                 # ['A']
print(segunda)                  # ['B']
print(terceira)                 # ['C']
print(vazia)                    # ['D']
print(retorno_vazia is vazia)   # True
print(preenchida)               # ['início', 'E']
print(retorno_preenchida is preenchida)  # True

Dica

Não substitua o teste por if not destino

Uma lista vazia também é considerada falsa em uma condição. Por isso, if not destino criaria outra lista e deixaria de preservar a lista vazia fornecida pelo chamador. Para reconhecer especificamente o marcador, use if destino is None.

Identifique o destino usado

Associe cada situação ao comportamento

Considere a função adicionar(item, destino=None) apresentada. Relacione cada forma de chamada ao que acontece com a coleção.

Toque em um item e depois no par correspondente.

Complete a correção

Qual correção é segura?

Qual trecho cria uma lista nova somente quando o argumento foi omitido ou recebeu None?

Passo 8 de 8

Aplicar e revisar chamadas com padrões seguros

Complete e execute uma função que combina argumento obrigatório, opção textual padrão e uma lista opcional criada com segurança.

Complete a função

Desafio final

A função deve receber uma mensagem obrigatória, usar "INFO" como prefixo padrão e adicionar o texto formatado a uma lista. Quando destino for omitido ou receber None, ela deve criar uma lista nova.

Copie o código-base para seu editor e substitua os três comentários # complete antes de executar.

Código-base

Complete somente as três linhas indicadas.

python
def adicionar_mensagem(mensagem, prefixo="INFO", destino=None):
    if destino is None:
        destino =  # complete

    destino.append(  # complete
    )
    return  # complete

Confira a solução e o fluxo

Uma implementação segura

A assinatura coloca o parâmetro obrigatório primeiro. prefixo pode ser substituído sem informar destino, e destino=None evita a reutilização acidental de uma lista entre chamadas.

Solução

Compare esta versão com a que você completou.

python
def adicionar_mensagem(mensagem, prefixo="INFO", destino=None):
    if destino is None:
        destino = []

    destino.append(f"[{prefixo}] {mensagem}")
    return destino

Dois caminhos para a coleção

Quando o destino é None, cada chamada segue para uma lista recém-criada. Quando uma lista é fornecida, a função usa e modifica esse mesmo objeto.

Diagrama com um fluxo dividido: chamadas sem lista seguem para recipientes separados, enquanto chamadas com uma lista explícita convergem para o mesmo recipiente.

O marcador None cria independência; uma lista explícita preserva o compartilhamento intencional.

Execute chamadas variadas

Verificação manual

Mantenha a função no mesmo arquivo e acrescente as chamadas abaixo. Antes de executar, preveja quais listas serão independentes e quais chamadas modificarão a mesma lista.

Chamadas de verificação

Este trecho verifica o padrão, a substituição por nome, None explícito e uma lista fornecida pelo chamador.

python
primeira = adicionar_mensagem("Início")
segunda = adicionar_mensagem("Atenção", prefixo="AVISO")
terceira = adicionar_mensagem("Reinício", destino=None)

compartilhada = []
adicionar_mensagem("Etapa 1", destino=compartilhada)
adicionar_mensagem("Fim", "OK", compartilhada)

print(primeira)
print(segunda)
print(terceira)
print(compartilhada)

Exemplo

Resultado esperado

['[INFO] Início']
['[AVISO] Atenção']
['[INFO] Reinício']
['[INFO] Etapa 1', '[OK] Fim']

As três primeiras chamadas não acumulam mensagens entre si. As duas últimas usam intencionalmente a mesma lista compartilhada.

Explique e conclua

Explique o comportamento observado

Depois de executar o código, explique por que primeira, segunda e terceira não acumulam mensagens entre si e por que compartilhada termina com dois elementos.

Escreva pelo menos 80 caracteres (0/80).

Resumo

Critérios para chamadas e padrões seguros

Ao definir e chamar funções com opções, verifique estes pontos:

  • Forneça todos os argumentos obrigatórios, por posição ou por nome.
  • Em chamadas mistas, escreva os argumentos posicionais explícitos antes dos nomeados.
  • Atribua cada parâmetro somente uma vez na mesma chamada.
  • Use argumentos nomeados para substituir seletivamente opções posteriores.
  • Evite coleções mutáveis como valores padrão; use None e crie a coleção dentro do corpo quando necessário.
  • Se o chamador fornecer uma coleção, use-a conforme o contrato e lembre que as mutações serão visíveis fora da função.

Tutorial concluído

Parabéns! Você concluiu: Usar argumentos nomeados e valores padrão

Muito bem! Agora você consegue criar opções claras de chamada sem compartilhar coleções mutáveis por acidente.

Baixe o Aplicativo agora para ter acesso a + de 5000 cursos gratuitos, exercícios, certificado e muito conteúdo sem pagar nada!

  • Cursos online 100% gratuitos do início ao fim

    Milhares de cursos online em vídeo, ebooks e áudiobooks.

  • Mais de 60 mil exercícios gratuitos

    Para testar seus conhecimentos no decorrer dos cursos online

  • Certificado Digital gratuito válido em todo o Brasil

    Gerado diretamente na galeria de fotos do seu celular e enviado ao seu e-mail

Aplicativo Cursa na tela de ebook, na tela de curso em vídeo e na tela de exercícios do curso, mais o certificado de conclusão de curso