Desempacotamento em Python: asterisco, troca e desestruturação
Este tutorial foi traduzido do original em inglês.Read in EnglishLeer en españolЧитать на русскомอ่านภาษาไทยAvisar sobre um erro de tradução
Imagine que você comprou pela internet um pacote com três itens: um livro, um fone de ouvido e uma capinha de celular. Quando a caixa chega, você abre e coloca cada item no seu lugar. O livro vai para a estante, o fone vai para a mesa e a capinha vai para o celular.
O desempacotamento em Python funciona do mesmo jeito. Você pega uma coleção de valores (uma tupla, uma lista ou qualquer iterável) e atribui cada valor à sua própria variável em uma única linha limpa. Não é preciso acessar os itens um por um com índices.
Neste tutorial, você vai aprender o desempacotamento básico, o truque elegante para trocar variáveis, as expressões com asterisco que capturam vários itens, o desempacotamento dentro de laços e como desestruturar dados aninhados.
Como funciona o desempacotamento básico?
Quando você tem uma tupla ou uma lista com vários valores, pode atribuir cada valor a uma variável separada em uma linha. O número de variáveis à esquerda precisa ser igual ao número de itens à direita.
10 20 30 red green blue
Sem desempacotamento, você precisaria acessar cada item pelo índice. O desempacotamento deixa o código mais curto e muito mais legível.
point = (10, 20, 30)
x = point[0]
y = point[1]
z = point[2]
print(x, y, z)point = (10, 20, 30)
x, y, z = point
print(x, y, z)Você também pode desempacotar direto na atribuição, sem criar uma tupla com nome antes. O Python cria a tupla automaticamente quando você separa valores com vírgulas.
Alice 25 Paris <class 'tuple'>
Como trocar variáveis em uma linha
Na maioria das linguagens de programação, trocar o valor de duas variáveis exige uma variável temporária. O desempacotamento do Python torna isso desnecessário. Você pode trocar os valores em uma única linha elegante.
world hello
Isso funciona porque o Python avalia primeiro o lado direito, empacotando os valores em uma tupla (b, a), e depois os desempacota em a, b. Tudo acontece com segurança em um único passo.
a = 1
b = 2
temp = a
a = b
b = temp
print(a, b) # 2 1a = 1
b = 2
a, b = b, a
print(a, b) # 2 1Você pode trocar três ou mais variáveis do mesmo jeito. O Python resolve tudo em um único passo.
Before: a=1, b=2, c=3 After: a=2, b=3, c=1
O que são expressões com asterisco (*rest)?
Às vezes você não sabe exatamente quantos itens uma coleção tem, ou só se importa com alguns itens específicos. A expressão com asterisco (*variable) captura os itens que sobram em uma lista.
1 [2, 3, 4, 5] [1, 2, 3, 4] 5
Você também pode colocar o asterisco no meio. Isso é ótimo quando você conhece o primeiro e o último item, mas quer ignorar tudo o que está entre eles.
First: 95 Middle: [80, 75, 90, 85, 70] Last: 88
10 20 [] H ['e', 'l', 'l'] o
Como usar desempacotamento em laços for
O desempacotamento brilha dentro de laços for. Quando você percorre uma lista de tuplas (ou de listas), pode desempacotar cada item direto em variáveis com nome, em vez de acessá-las pelo índice.
Alice is 16 years old Bob is 15 years old Charlie is 17 years old
Esse padrão é usado o tempo todo com enumerate() e dict.items(). Os dois retornam tuplas, e o desempacotamento deixa o código muito mais limpo.
0: apple 1: banana 2: cherry Alice -> 16 Bob -> 15 Charlie -> 17
Como desempacotar estruturas de dados aninhadas
O desempacotamento em Python pode descer vários níveis. Se um valor dentro da sua coleção também for uma tupla ou uma lista, você pode desempacotá-lo usando parênteses aninhados no lado esquerdo.
Alice: 95, 87, 92
Isso funciona em qualquer profundidade. Você pode até combinar o desempacotamento aninhado com uma expressão com asterisco: name, (first, *others) = ('Alice', (95, 87, 92)) coloca 95 em first e [87, 92] em others.
Alice: average = 91.3 Bob: average = 84.3 Charlie: average = 85.3
Erros comuns de desempacotamento para evitar
O desempacotamento fica intuitivo quando você pega o jeito, mas existem algumas armadilhas que pegam os iniciantes.
Alice 10 20 42 <class 'list'>
Exercícios práticos
Desempacote a tupla point em três variáveis: x, y e z. Depois exiba as três em uma linha, separadas por espaços, usando print(x, y, z).
As variáveis first e second estão com os valores trocados. Inverta os valores usando a sintaxe de desempacotamento do Python (uma linha, sem variável temporária) e depois exiba as duas.
Use uma expressão com asterisco para desempacotar a lista numbers em head (o primeiro item) e tail (todo o resto). Exiba os dois em linhas separadas.
O que este código exibe? Pense no que o asterisco captura e em qual tipo ele vira.
a, *b, c = [1, 2, 3, 4, 5, 6]
print(a)
print(b)
print(c)Escreva três instruções print() que produzam exatamente a mesma saída.
Você tem uma lista de registros de alunos. Cada registro é uma tupla (name, (math_score, english_score)). Use desempacotamento aninhado em um laço for para calcular e exibir a média de cada aluno.
Exiba cada linha no formato Name: average, em que a média é arredondada para 1 casa decimal com :.1f.