
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.
Trilha de aprendizado · Nível 4 · Tutorial 3
Defina funções com opções claras de chamada e valores padrão seguros, sem compartilhar coleções mutáveis por acidente.
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
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
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
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
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
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
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
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

Passo 1 de 8
Identifique como argumentos posicionais e nomeados são associados aos parâmetros de uma função.
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.
Na chamada, "Caio" ocupa a posição de nome, enquanto "Bom dia" ocupa a posição de saudacao.
def montar_saudacao(nome, saudacao):
return f"{saudacao}, {nome}!"
mensagem = montar_saudacao("Caio", "Bom dia")
print(mensagem) # Bom dia, Caio!Compare as associações por posição e por nome.

Por posição, siga a ordem. Por nome, siga os rótulos, mesmo quando aparecem em outra ordem.
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.
As duas chamadas fornecem os mesmos valores aos mesmos parâmetros.
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
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 =.
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
Defina parâmetros opcionais e reconheça quando uma chamada usa ou substitui seus valores padrão.
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. prefixo e final possuem valores padrão.
def montar_mensagem(texto, prefixo="INFO", final="."):
return f"{prefixo}: {texto}{final}"
print(montar_mensagem("Servidor ativo"))
# INFO: Servidor ativo.Observe que o mesmo sinal = desempenha papéis diferentes conforme o lugar em que aparece.

Na definição, = estabelece um padrão. Na chamada, = associa um argumento ao parâmetro indicado pelo nome.
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
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.
Complete a assinatura com o parâmetro obrigatório chamado mensagem:
def criar_aviso(____, urgente=False):
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
Misture argumentos posicionais e nomeados para alterar apenas as opções desejadas, sem preencher o mesmo parâmetro duas vezes.
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.
O texto é obrigatório. prefixo e final têm valores padrão.
def montar_mensagem(texto, prefixo="INFO", final="."):
return f"{prefixo}: {texto}{final}"
mensagem = montar_mensagem("Servidor ativo", final="!")
print(mensagem) # INFO: Servidor ativo!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.

Por posição: primeiro espaço disponível. Por nome: parâmetro indicado. As demais opções mantêm seus padrões.
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.
Compare o preenchimento dos parâmetros em cada chamada.
print(montar_mensagem("Servidor ativo", final="!"))
# INFO: Servidor ativo!
print(montar_mensagem(final="?", texto="Tudo certo"))
# INFO: Tudo certo?Dica
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.
Qual chamada fornece o texto por posição, altera final para "!" e mantém o prefixo padrão?
Complete a chamada para produzir INFO: Tudo certo? sem fornecer um valor para prefixo:
montar_mensagem(____, final="?")

Passo 4 de 8
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.
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.
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.
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")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.

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
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
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.
Considere def montar_mensagem(texto, prefixo="INFO", final="."):. Relacione cada chamada inválida à sua causa.
Toque em um item e depois no par correspondente.
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.
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")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
Descubra por que reatribuir uma variável depois da definição não altera o valor padrão já armazenado por uma função.
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.
Observe a ordem de execução e compare as duas chamadas finais.
saudacao = "Olá"
def montar(nome, inicio=saudacao):
return f"{inicio}, {nome}!"
saudacao = "Oi"
print(montar("Lia"))
print(montar("Lia", inicio=saudacao))
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.
Coloque os eventos do exemplo na ordem em que acontecem.
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
Entenda por que uma lista usada como valor padrão pode guardar dados de chamadas anteriores.
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.
Execute o código completo sem redefinir a função entre as chamadas:
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 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.
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.
As três chamadas acessam a mesma lista. Cada append acrescenta um cartão ao objeto compartilhado, fazendo seu conteúdo crescer.

Chamadas que omitem o argumento reutilizam a mesma lista padrão.
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
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
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.
Primeiro, preveja cada linha impressa. Depois, execute o código no seu computador sem redefinir a função.
def adicionar_tarefa(tarefa, tarefas=[]):
tarefas.append(tarefa)
print(tarefas)
adicionar_tarefa("ler")
adicionar_tarefa("praticar")
adicionar_tarefa("revisar", [])
adicionar_tarefa("testar")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
Use None como marcador para criar uma lista nova quando nenhuma coleção for fornecida, preservando listas recebidas do chamador.
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.
A lista é criada durante cada chamada que recebe o marcador, e não durante a definição da função.
def adicionar(item, destino=None):
if destino is None:
destino = []
destino.append(item)
return destinoO teste separa duas situações: criar uma lista nova ou continuar com a lista recebida.

None cria uma lista; qualquer lista fornecida é preservada e modificada.
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.
Copie o código para seu editor e observe tanto o conteúdo quanto as verificações de identidade.
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) # TrueDica
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.
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.
Qual trecho cria uma lista nova somente quando o argumento foi omitido ou recebeu None?

Passo 8 de 8
Complete e execute uma função que combina argumento obrigatório, opção textual padrão e uma lista opcional criada com segurança.
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.
Complete somente as três linhas indicadas.
def adicionar_mensagem(mensagem, prefixo="INFO", destino=None):
if destino is None:
destino = # complete
destino.append( # complete
)
return # completeA 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.
Compare esta versão com a que você completou.
def adicionar_mensagem(mensagem, prefixo="INFO", destino=None):
if destino is None:
destino = []
destino.append(f"[{prefixo}] {mensagem}")
return destinoQuando 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.

O marcador None cria independência; uma lista explícita preserva o compartilhamento intencional.
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.
Este trecho verifica o padrão, a substituição por nome, None explícito e uma lista fornecida pelo chamador.
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
['[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.
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
Ao definir e chamar funções com opções, verifique estes pontos:
None e crie a coleção dentro do corpo quando necessário.Parabéns! Você concluiu: Usar argumentos nomeados e valores padrão
Milhares de cursos online em vídeo, ebooks e áudiobooks.
Para testar seus conhecimentos no decorrer dos cursos online
Gerado diretamente na galeria de fotos do seu celular e enviado ao seu e-mail
Baixe nosso aplicativo pelo QR Code ou pelos links abaixo:.
+ de 10 milhões
de alunos
Certificado grátis e
válido em todo o Brasil
60 mil exercícios
gratuitos
4,8/5 classificação
nas lojas de apps
Cursos gratuitos em
vídeo, ebooks e audiobooks