Trilha de aprendizado · Nível 4 · Tutorial 4

Receber argumentos variáveis com *args e **kwargs

Crie funções que aceitem uma quantidade variável de argumentos e use dados de sequências ou dicionários em chamadas.

  • Nível: Intermediário
  • Duração: 20 min
  • 8 passos
Receber argumentos variáveis com *args e **kwargs

O que você vai percorrer

  1. Reunir argumentos posicionais com *args Aprenda a coletar argumentos posicionais adicionais em uma tupla e a processá-los, inclusive quando nenhum valor é fornecido. 2 min
  2. Reunir argumentos nomeados com **kwargs Entenda como argumentos nomeados adicionais são reunidos em um dicionário e processe os dados coletados. 2 min
  3. Combinar parâmetros explícitos e variáveis Organize parâmetros comuns, coletores variáveis e opções somente nomeadas em uma assinatura, acompanhando o destino de cada argumento. 3 min
  4. Expandir listas e tuplas com * Use * em uma chamada para distribuir os elementos de uma lista ou tupla como argumentos posicionais separados. 2 min
  5. Expandir dicionários com ** Use dicionários para fornecer argumentos nomeados e combine sua expansão com argumentos posicionais. 3 min
  6. Evitar conflitos ao expandir argumentos Identifique quando duas origens tentam preencher o mesmo parâmetro e corrija a chamada antes de executá-la novamente. 2 min
  7. Escolher uma assinatura que comunique a intenção Decida quais informações devem aparecer claramente na assinatura e quando coletores variáveis representam melhor os dados. 2 min
  8. Aplicar: resumir um lote de valores Implemente no seu computador uma função que combina parâmetros explícitos, argumentos variáveis e expansão de coleções. 4 min

O que você vai aprender

  • Definir funções que reúnam argumentos posicionais adicionais em uma tupla e nomeados adicionais em um dicionário.
  • Processar os valores recebidos por *args e **kwargs com operações de coleções já conhecidas.
  • Expandir sequências e dicionários em chamadas, respeitando as regras de associação dos argumentos.
  • Escolher parâmetros explícitos quando uma assinatura variável esconder informações importantes.

Antes de começar

  • Usar argumentos nomeados e valores padrão
  • Agrupar e desempacotar valores com tuplas
  • Consultar e atualizar dados com dicionários

Passo 1 de 8

Reunir argumentos posicionais com *args

Aprenda a coletar argumentos posicionais adicionais em uma tupla e a processá-los, inclusive quando nenhum valor é fornecido.

Vários argumentos, uma tupla

O asterisco coleta os valores

Um parâmetro precedido de * reúne todos os argumentos posicionais fornecidos na chamada. Dentro da função, esses valores formam uma tupla, na mesma ordem em que foram passados.

Em def registrar(*valores):, é o asterisco que produz esse comportamento. valores é apenas o nome escolhido para a tupla.

Da chamada para a tupla

Diagrama em que os valores posicionais 8, 3 e 5 seguem, na mesma ordem, de uma chamada de função para três posições de uma tupla.

Na chamada registrar(8, 3, 5), os três argumentos tornam-se a tupla (8, 3, 5).

Processar os valores recebidos

Use as operações que você já conhece

Como o parâmetro representa uma tupla, você pode percorrê-lo em um laço e consultar sua quantidade com len. A função abaixo aceita um, dois ou quantos valores posicionais forem necessários.

Quantidade e soma dos argumentos

Execute chamadas com quantidades diferentes de números.

python
def resumir(*valores):
    total = 0

    for valor in valores:
        total += valor

    return len(valores), total


print(resumir(7))
print(resumir(7, 2, 4))

Exemplo

Resultados

A primeira chamada retorna (1, 7). A segunda retorna (3, 13): valores contém a tupla (7, 2, 4).

Quando nenhum argumento é fornecido

A tupla vazia

A função ainda pode ser chamada sem argumentos posicionais.

python
def somar(*numeros):
    total = 0

    for numero in numeros:
        total += numero

    return total


print(somar())       # 0
print(somar(10))     # 10
print(somar(10, 5))  # 15

Dica

Escolha um nome informativo

args é um nome convencional, mas não obrigatório. *numeros, *itens e *notas têm o mesmo comportamento e podem comunicar melhor o papel dos valores. Sem argumentos, o parâmetro recebe a tupla vazia (); por isso, o acumulador iniciado em zero produz um resultado coerente.

Confira o que foi coletado

Complete a definição

Complete o parâmetro para que a função aceite qualquer quantidade de argumentos posicionais:

def quantidade(_____):
return len(valores)

Preveja os resultados

Considere esta função:

def analisar(*numeros):
total = 0
for numero in numeros:
total += numero
return len(numeros), total

O que retornam, respectivamente, analisar(), analisar(4) e analisar(4, 6, 3)?

Passo 2 de 8

Reunir argumentos nomeados com **kwargs

Entenda como argumentos nomeados adicionais são reunidos em um dicionário e processe os dados coletados.

Dos argumentos ao dicionário

Coleta com dois asteriscos

Na definição, um parâmetro precedido de ** reúne os argumentos nomeados adicionais em um dicionário. O nome de cada argumento vira uma chave textual, e o valor fornecido vira o valor associado.

def coletar(**metadados):
    return metadados

resultado = coletar(cor="azul", prioridade=2)

Nesse caso, metadados recebe {"cor": "azul", "prioridade": 2}.

Correspondência nome–valor

A associação preserva cada nome usado na chamada como uma chave do dicionário recebido pela função.

Diagrama ligando os argumentos nomeados cor igual a azul e prioridade igual a 2 às entradas correspondentes de um dicionário chamado metadados.

Cada par nome=valor da chamada se torna uma entrada nome: valor no dicionário.

Dica

O nome pode comunicar o propósito

kwargs é apenas uma convenção. Os dois asteriscos determinam a coleta; você pode usar um nome descritivo, como metadados, opcoes ou detalhes.

Consultar e processar os dados

O parâmetro se comporta como um dicionário

Dentro da função, use operações de dicionários já conhecidas. É possível consultar uma chave com get, contar entradas com len ou percorrer os pares.

Produzindo um resumo

A função conta os argumentos recebidos e consulta a origem. Quando nenhum argumento é fornecido, metadados é um dicionário vazio.

python
def resumir_metadados(**metadados):
    return {
        "quantidade": len(metadados),
        "origem": metadados.get("origem", "não informada"),
    }

print(resumir_metadados(origem="site", campanha="inverno"))
print(resumir_metadados())

# Saídas esperadas:
# {'quantidade': 2, 'origem': 'site'}
# {'quantidade': 0, 'origem': 'não informada'}

Associe chamada e coleta

Formação do dicionário

Associe cada elemento da definição ou da chamada ao resultado correspondente.

Toque em um item e depois no par correspondente.

Preveja o processamento

Valores nomeados em uma acumulação

Leia a função e acompanhe o dicionário recebido em cada chamada.

python
def totalizar(**valores):
    total = 0
    for valor in valores.values():
        total += valor
    return len(valores), total

resultado_a = totalizar(cafe=8, suco=6)
resultado_b = totalizar()

Quais são os resultados?

Preveja os valores de resultado_a e resultado_b. Na resposta, descreva também o conteúdo recebido pelo parâmetro valores em cada chamada.

Escreva pelo menos 40 caracteres (0/40).

Passo 3 de 8

Combinar parâmetros explícitos e variáveis

Organize parâmetros comuns, coletores variáveis e opções somente nomeadas em uma assinatura, acompanhando o destino de cada argumento.

A ordem organiza a assinatura

Parâmetros comuns vêm primeiro

Uma assinatura pode combinar parâmetros explícitos e variáveis. Antes de *pontos, os parâmetros comuns seguem a regra já conhecida: os obrigatórios vêm antes daqueles com valor padrão.

Em def registrar(nome, categoria="geral", *pontos, ativo=True, **dados):, os argumentos posicionais preenchem primeiro nome e categoria. Somente os posicionais que sobrarem serão reunidos na tupla pontos.

Uma assinatura combinada

Observe o destino de cada parte da chamada.

python
def registrar(nome, categoria="geral", *pontos, ativo=True, **dados):
    return {
        "nome": nome,
        "categoria": categoria,
        "pontos": pontos,
        "ativo": ativo,
        "dados": dados,
    }

resultado = registrar(
    "Ana",
    "jogo",
    10,
    20,
    ativo=False,
    equipe="Azul",
)

print(resultado)

# Resultado esperado:
# {'nome': 'Ana', 'categoria': 'jogo', 'pontos': (10, 20),
#  'ativo': False, 'dados': {'equipe': 'Azul'}}

Da chamada para cada destino

Explícitos primeiro, coletores depois

Na chamada, "Ana" e "jogo" são consumidos pelos parâmetros comuns nome e categoria. Os posicionais restantes, 10 e 20, formam pontos.

Como ativo foi declarado depois de *pontos, ele só pode ser fornecido por nome. O nome equipe não corresponde a um parâmetro explícito, então vai para dados. Já ativo não entra nesse dicionário, pois foi associado ao parâmetro explícito de mesmo nome.

Mapa da associação

Diagrama com argumentos da chamada seguindo por setas para dois parâmetros explícitos, uma tupla de valores adicionais, uma opção somente nomeada e um dicionário de dados adicionais.

Os parâmetros explícitos recebem seus valores antes dos coletores: nome recebe "Ana", categoria recebe "jogo", pontos recebe (10, 20), ativo recebe False e dados recebe {"equipe": "Azul"}.

Dica

Depois de *args, use o nome

Parâmetros declarados depois do coletor posicional, como ativo, são fornecidos somente por nome. Eles podem ser obrigatórios ou ter um valor padrão. Em ambos os casos, não são preenchidos por argumentos posicionais adicionais.

Limites e posição dos coletores

Um coletor de cada tipo

Uma assinatura admite no máximo um coletor de argumentos posicionais, escrito com *, e no máximo um coletor de argumentos nomeados, escrito com **.

O coletor com ** deve ficar no final da assinatura. Assim, a organização completa é: parâmetros comuns, coletor posicional, parâmetros somente nomeados e, por último, coletor nomeado.

Por exemplo, esta ordem é válida:
def registrar(nome, categoria="geral", *pontos, ativo=True, **dados):

Ordene a assinatura

Organize os componentes dentro dos parênteses para formar uma assinatura válida.

  1. **dados
  2. categoria="geral"
  3. nome
  4. *pontos
  5. ativo=True

Confira o mapeamento

Argumentos e destinos

Considere registrar("Ana", "jogo", 10, 20, ativo=False, equipe="Azul"). Associe cada parâmetro ao valor que ele recebe.

Toque em um item e depois no par correspondente.

Passo 4 de 8

Expandir listas e tuplas com *

Use * em uma chamada para distribuir os elementos de uma lista ou tupla como argumentos posicionais separados.

Uma coleção ou vários argumentos?

O asterisco distribui os elementos

Na chamada, *sequencia fornece cada elemento de uma lista ou tupla como um argumento posicional separado, preservando a ordem.

Sem o asterisco, a coleção inteira é um único argumento. Com o asterisco, seus elementos ocupam posições consecutivas na chamada.

Da sequência para os parâmetros

Imagine o * como um distribuidor: ele retira os elementos da sequência, na ordem, e os encaminha separadamente para a função.

Diagrama de um recipiente com três elementos coloridos atravessando um distribuidor em forma de asterisco e chegando separadamente a três posições de uma função.

Uma sequência com três elementos fornece três argumentos posicionais quando é expandida com *.

Comparando as duas chamadas

A primeira chamada entrega uma lista. A segunda entrega três valores separados.

python
def observar(*itens):
    print(itens)

valores = [10, 20, 30]

observar(valores)   # ([10, 20, 30],)
observar(*valores)  # (10, 20, 30)

Expandir e coletar são operações opostas

Observe onde está o asterisco

Na definição, *valores coleta argumentos adicionais em uma tupla. Na chamada, *notas expande uma sequência em argumentos separados.

A expansão também funciona com funções de parâmetros fixos, desde que a quantidade de elementos corresponda aos parâmetros necessários.

Lista, tupla e sequência vazia

Execute o código e compare as chamadas equivalentes.

python
def criar_ponto(x, y, z):
    return (x, y, z)

coordenadas = [4, 7, 2]
print(criar_ponto(*coordenadas))  # (4, 7, 2)


def somar(*valores):
    total = 0
    for valor in valores:
        total += valor
    return total

notas = (8, 7, 9)
print(somar(*notas))  # 24
print(somar(*()))     # 0

Dica

Sequência vazia

Expandir uma sequência vazia fornece zero argumentos. Isso funciona em somar(*()) porque a função aceita não receber valores adicionais. Porém, a expansão vazia não preenche parâmetros obrigatórios: criar_ponto(*[]) ainda falha porque x, y e z não recebem valores.

Escolha a chamada correta

Forneça três valores

Considere:

def exibir(primeiro, segundo, terceiro):
    print(primeiro, segundo, terceiro)

itens = ("A", "B", "C")

Qual chamada fornece corretamente os três elementos aos três parâmetros?

Complete a expansão

Zero argumentos adicionais

Complete a chamada para expandir vazia sem deixar de fornecer o parâmetro obrigatório nome:

def registrar(nome, *valores):
    return nome, valores

vazia = []
resultado = registrar("lote", ___vazia)
# resultado: ("lote", ())

Passo 5 de 8

Expandir dicionários com **

Use dicionários para fornecer argumentos nomeados e combine sua expansão com argumentos posicionais.

Do dicionário para os parâmetros

Dois asteriscos distribuem pares nome–valor

Na chamada, **dicionario expande cada entrada do dicionário como um argumento nomeado. As chaves se tornam os nomes dos argumentos, e os valores são associados aos parâmetros correspondentes.

Por isso, todas as chaves usadas nessa expansão precisam ser textos. A ordem escrita na assinatura determina os parâmetros disponíveis, mas a associação dos dados expandidos ocorre pelos nomes das chaves.

Coletar e expandir são sentidos opostos

Na definição, **dados reúne argumentos nomeados em um dicionário. Na chamada, **opcoes distribui as entradas de um dicionário como argumentos nomeados separados.

Comparação em dois sentidos: pares nome–valor reunidos em um dicionário na definição e entradas de um dicionário distribuídas para parâmetros na chamada.

A posição dos asteriscos muda o sentido: a definição reúne; a chamada distribui.

A função não precisa ter **kwargs

As chaves podem encontrar parâmetros fixos

Usar ** na chamada não exige um coletor **kwargs na definição. A função pode ter apenas parâmetros comuns, desde que aceite todos os nomes fornecidos pelas chaves. Se o dicionário trouxer um nome que a assinatura não aceita, a chamada não poderá associá-lo.

Expansão para uma assinatura fixa

Compare a chamada expandida com sua forma equivalente. O dicionário vazio não fornece nenhum argumento nomeado adicional.

python
def montar_etiqueta(produto, quantidade, cor="branca"):
    return f"{produto}: {quantidade} unidade(s), cor {cor}"

opcoes = {"quantidade": 3, "cor": "azul"}
print(montar_etiqueta("caderno", **opcoes))

# Chamada equivalente:
print(montar_etiqueta("caderno", quantidade=3, cor="azul"))

sem_opcoes = {}
print(montar_etiqueta("caderno", 2, **sem_opcoes))

# Saídas esperadas:
# caderno: 3 unidade(s), cor azul
# caderno: 3 unidade(s), cor azul
# caderno: 2 unidade(s), cor branca

Dica

Dicionário vazio

Expandir {} fornece zero argumentos nomeados. Os argumentos obrigatórios ainda precisam vir de outra parte da chamada, enquanto parâmetros não fornecidos podem usar seus valores padrão.

Combinar as duas expansões

Posicionais antes dos nomeados

Uma chamada pode combinar *sequencia e **dicionario. Os elementos da sequência fornecem os argumentos posicionais, na ordem, e as entradas do dicionário fornecem os argumentos nomeados. Na forma convencional, escreva a expansão posicional antes da expansão nomeada.

Sequência e dicionário na mesma chamada

*posicionais fornece o nome e os pontos. Depois, **nomeados fornece ativo e o dado adicional equipe. O parâmetro ativo, declarado depois de *pontos, é associado pelo nome.

python
def registrar(nome, *pontos, ativo=True, **dados):
    return {
        "nome": nome,
        "pontos": pontos,
        "ativo": ativo,
        "dados": dados,
    }

posicionais = ["Ana", 10, 20]
nomeados = {"ativo": False, "equipe": "Azul"}

resultado = registrar(*posicionais, **nomeados)
print(resultado)

# Resultado esperado:
# {'nome': 'Ana', 'pontos': (10, 20),
#  'ativo': False, 'dados': {'equipe': 'Azul'}}

Confira a expansão

Complete a chamada combinada

Complete a chamada para expandir o dicionário nomeados:

resultado = registrar(*posicionais, _____nomeados)

Requisito das chaves

Um dicionário com uma chave numérica pode ser expandido com ** para fornecer argumentos nomeados.

Compatibilidade da assinatura

Para usar **opcoes em uma chamada, a função precisa obrigatoriamente declarar um parâmetro **kwargs.

Passo 6 de 8

Evitar conflitos ao expandir argumentos

Identifique quando duas origens tentam preencher o mesmo parâmetro e corrija a chamada antes de executá-la novamente.

Duas origens para o mesmo parâmetro

Expansão não permite duplicação

Cada parâmetro pode receber apenas um valor por chamada. No exemplo, *nomes fornece "Ana" para nome por posição, enquanto nome="Bia" tenta preencher o mesmo parâmetro por nome. O Python detecta o conflito, produz um TypeError e não inicia o corpo da função.

Valor posicional e valor nomeado duplicados

Execute este trecho separadamente para observar que a mensagem do corpo não aparece.

python
def apresentar(nome):
    print("Corpo iniciado")
    print(f"Olá, {nome}!")

nomes = ["Ana"]
apresentar(*nomes, nome="Bia")

# TypeError: o parâmetro 'nome' recebeu mais de um valor

Colisão na associação

A duplicação é determinada pelo destino dos argumentos, e não pela forma visual como eles aparecem na chamada.

Diagrama com um elemento de sequência e um argumento nomeado apontando para o mesmo espaço de parâmetro, provocando uma colisão.

Se duas setas chegam ao mesmo parâmetro, a associação falha antes da execução do corpo.

Conflitos entre argumentos nomeados

O mesmo nome não é sobrescrito

A duplicação também ocorre quando um argumento nomeado explícito e um dicionário expandido usam a mesma chave. Da mesma forma, dois dicionários expandidos não podem fornecer o mesmo nome. O último valor não substitui o anterior: a chamada é rejeitada.

Duas formas de duplicar um nome

Execute cada chamada inválida separadamente, pois a primeira interrompe o script com TypeError.

python
def configurar(**opcoes):
    print("Corpo iniciado")
    print(opcoes)

base = {"tema": "escuro"}
# configurar(tema="claro", **base)  # 'tema' aparece duas vezes

visual = {"tema": "claro", "fonte": 14}
acessibilidade = {"tema": "alto contraste"}
# configurar(**visual, **acessibilidade)  # 'tema' aparece nos dois dicionários

# Correção: mantenha uma única origem para cada nome.
base["tema"] = "claro"
configurar(**base)

visual["tema"] = "alto contraste"
configurar(**visual)

Atenção

O limite de **kwargs

**kwargs coleta nomes adicionais, mas não resolve duplicações. Se duas partes da chamada fornecem o mesmo nome, o conflito acontece antes que o dicionário de kwargs seja criado. Corrija removendo uma das origens ou reorganizando previamente os dados.

Preveja o resultado

O último valor vence?

Considere o código:

def enviar(destino, **opcoes):
print("Enviando")

dados = {"prioridade": "alta"}
enviar("suporte", prioridade="baixa", **dados)

O que acontece?

Diagnostique e corrija

Encontre as duas origens

Analise a chamada:

def resumo(titulo, *valores, **dados):
return titulo, valores, dados

pos = ["Semana", 10, 20]
extras = {"setor": "Norte", "titulo": "Duplicado"}
resumo(*pos, **extras)

Quais são as duas origens do valor de titulo? Reescreva os dados ou a chamada para preservar "Semana", os valores 10 e 20 e o setor "Norte", sem duplicação.

Escreva pelo menos 40 caracteres (0/40).

Passo 7 de 8

Escolher uma assinatura que comunique a intenção

Decida quais informações devem aparecer claramente na assinatura e quando coletores variáveis representam melhor os dados.

Flexibilidade com propósito

O que a assinatura deve revelar

Use *args quando vários valores desempenham o mesmo papel e a quantidade pode variar. Use **kwargs quando o conjunto de informações nomeadas é intencionalmente aberto.

Dados obrigatórios e opções conhecidas devem, em geral, aparecer como parâmetros explícitos. Assim, quem lê a chamada consegue perceber o que a função espera.

Genérica ou explícita?

Comparação entre uma entrada genérica que mistura todos os dados e uma assinatura organizada com espaços fixos e coletores variáveis.

À esquerda, coletores amplos escondem a função de cada entrada. À direita, dados essenciais ocupam posições claras e apenas as partes realmente variáveis seguem para coletores.

Parâmetros explícitos evitam surpresas

Exemplo

Compare as assinaturas

Assinatura excessivamente aberta:

def criar_usuario(**dados):

Ela não revela que nome e email são obrigatórios. Além disso, uma chamada como criar_usuario(nome="Ana", emial="ana@exemplo.com") pode coletar o erro de digitação sem acusar um nome desconhecido.

Assinatura que comunica melhor a intenção:

def criar_usuario(nome, email, tema="claro"):

Agora os requisitos e a opção conhecida estão visíveis. Já em def registrar_evento(evento, **detalhes):, o dicionário variável faz sentido se cada tipo de evento puder trazer detalhes diferentes.

Dica

Pergunta prática

Antes de adicionar um coletor, pergunte: “Todos esses valores têm o mesmo papel?” para *args e “Os nomes adicionais são realmente abertos?” para **kwargs. Se a resposta for não, prefira parâmetros explícitos.

Escolha e justifique

Assinatura para registrar medições

Uma função deve receber obrigatoriamente o nome de um sensor, qualquer quantidade de leituras numéricas e uma unidade opcional fornecida por nome. Qual assinatura comunica melhor essa intenção?

Explique sua decisão

Uma ocorrência exige um cliente, pode conter várias mensagens, tem prioridade opcional e pode receber campos de contexto diferentes conforme a integração. Proponha uma assinatura e justifique o que deve ser explícito ou variável.

Escreva pelo menos 40 caracteres (0/40).

Passo 8 de 8

Aplicar: resumir um lote de valores

Implemente no seu computador uma função que combina parâmetros explícitos, argumentos variáveis e expansão de coleções.

Planeje a associação dos argumentos

Uma assinatura que comunica a intenção

Você criará resumir_lote, com quatro partes: nome identifica obrigatoriamente o lote; *valores reúne os números; unidade é uma opção fornecida somente por nome; e **metadados recebe informações adicionais, como origem e responsável.

Da chamada para os parâmetros

Fluxo que associa o primeiro argumento ao nome, os números seguintes a uma tupla, a unidade a um parâmetro próprio e os demais pares nome-valor a um dicionário.

Os parâmetros explícitos destacam os dados essenciais; os coletores recebem apenas o que sobra.

Implemente e confira no Python 3

Prática no seu computador

Crie um arquivo chamado resumo_lotes.py no seu editor, copie o código completo abaixo e execute-o com Python 3. A função acumula os valores em um laço e devolve um dicionário com nome, quantidade, total, unidade e metadados.

Código completo

python
def resumir_lote(nome, *valores, unidade="un.", **metadados):
    total = 0
    for valor in valores:
        total += valor

    return {
        "nome": nome,
        "quantidade": len(valores),
        "total": total,
        "unidade": unidade,
        "metadados": metadados,
    }


# Chamada direta
direto = resumir_lote(
    "Lote A",
    10,
    15,
    5,
    unidade="kg",
    origem="balança",
)

# Chamada equivalente com expansão
valores = [10, 15, 5]
opcoes = {"unidade": "kg", "origem": "balança"}
expandido = resumir_lote("Lote A", *valores, **opcoes)

# Chamada sem valores nem dados adicionais
vazio = resumir_lote("Lote vazio")

print(direto)
print(expandido)
print(direto == expandido)
print(vazio)

# Conflito: unidade seria fornecida duas vezes.
# Remova o comentário para observar o TypeError e depois restaure-o.
# resumir_lote("Lote B", *valores, unidade="g", **opcoes)

Exemplo

Resultado esperado

A execução deve mostrar:

{'nome': 'Lote A', 'quantidade': 3, 'total': 30, 'unidade': 'kg', 'metadados': {'origem': 'balança'}}

{'nome': 'Lote A', 'quantidade': 3, 'total': 30, 'unidade': 'kg', 'metadados': {'origem': 'balança'}}

True

{'nome': 'Lote vazio', 'quantidade': 0, 'total': 0, 'unidade': 'un.', 'metadados': {}}

Explique e corrija o comportamento

Revisão da execução

Compare os resultados direto e expandido. Explique por que são equivalentes, o que ocorre na chamada sem adicionais e por que a chamada comentada gera duplicação. Escreva uma versão corrigida dessa chamada e justifique por que nome e unidade são parâmetros explícitos.

Escreva pelo menos 120 caracteres (0/120).

Síntese do tutorial

Resumo

Coletar na definição, expandir na chamada

Os asteriscos cumprem sentidos complementares conforme o local em que aparecem.

  • Na definição, *valores coleta argumentos posicionais adicionais em uma tupla e **metadados coleta argumentos nomeados adicionais em um dicionário.
  • Na chamada, *sequencia distribui elementos como argumentos posicionais e **dicionario distribui entradas como argumentos nomeados.
  • Coleções vazias fornecem zero argumentos adicionais, mas não substituem parâmetros obrigatórios.
  • Um parâmetro não pode receber valores de duas origens na mesma chamada; **kwargs não elimina duplicações.
  • Parâmetros explícitos comunicam requisitos e opções conhecidas; coletores são adequados quando a quantidade ou o conjunto de dados é intencionalmente variável.

Tutorial concluído

Parabéns! Você concluiu: Receber argumentos variáveis com *args e **kwargs

Muito bem! Agora você consegue criar assinaturas variáveis sem esconder os dados essenciais da função.

100 XP

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