Em [[Linguagem de programação Python|Python]], o **desempacotamento de sequências** é uma funcionalidade poderosa que permite atribuir os elementos de uma sequência (como tuplas, listas, strings, etc.) a múltiplas variáveis de uma só vez. Isso torna o código mais legível e conciso, eliminando a necessidade de acessar elementos individualmente por índice.
# Desempacotamento Básico
O desempacotamento mais comum ocorre quando o número de variáveis à esquerda da atribuição corresponde exatamente ao número de elementos na sequência à direita.
**Exemplo 1: Desempacotando Tuplas**
```python
coordenadas_lax = (33.9425, -118.408056)
latitude, longitude = coordenadas_lax
print(f"Latitude: {latitude}, Longitude: {longitude}")
# Saída: Latitude: 33.9425, Longitude: -118.408056
```
**Exemplo 2: Troca de Valores de Variáveis**
Uma aplicação elegante do desempacotamento é a troca de valores entre duas variáveis sem a necessidade de uma variável temporária.
```python
a = 5
b = 3
a, b = b, a # Os valores de 'a' e 'b' são trocados
print(f"a: {a}, b: {b}")
# Saída: a: 3, b: 5
```
# Desempacotamento em Chamadas de Função (`*` para argumentos)
O operador `*` pode ser usado para desempacotar uma sequência de argumentos ao chamar uma função. Isso é útil quando uma função espera múltiplos argumentos posicionais e você tem esses argumentos armazenados em uma lista ou tupla.
**Exemplo:**
A função `divmod(a, b)` retorna o quociente e o resto da divisão de `a` por `b`.
```python
t = (20, 8)
# Desempacota a tupla 't' em dois argumentos para divmod
resultado_divmod = divmod(*t)
print(resultado_divmod)
# Saída: (2, 4)
# Você pode desempacotar o resultado diretamente em variáveis
quociente, resto = divmod(*t)
print(f"Quociente: {quociente}, Resto: {resto}")
# Saída: Quociente: 2, Resto: 4
```
# Desempacotamento em Literais de Lista ou Tupla (`*` para expansão)
O operador `*` também pode ser usado dentro de literais de lista ou tupla para "expandir" os elementos de um iterável existente.
**Exemplo:**
```python
numeros_iniciais = range(4) # Gera 0, 1, 2, 3
lista_completa = [*numeros_iniciais, 4, 5]
print(lista_completa)
# Saída: [0, 1, 2, 3, 4, 5]
# Também funciona com tuplas
tupla_completa = (*numeros_iniciais, 4, 5)
print(tupla_completa)
# Saída: (0, 1, 2, 3, 4, 5)
```
# Desempacotamento Estendido (`*` para coletar múltiplos itens)
Introduzido na [[PEP 3132 – Extended Iterable Unpacking]], o operador `*` permite coletar um número arbitrário de itens restantes de uma sequência em uma lista. Isso é conhecido como "desempacotamento estendido".
**Exemplo:**
```python
dados = [10, 20, 30, 40, 50, 60]
primeiro, *meio, ultimo = dados
print(f"Primeiro: {primeiro}") # Saída: Primeiro: 10
print(f"Meio: {meio}") # Saída: Meio: [20, 30, 40, 50]
print(f"Ultimo: {ultimo}") # Saída: Ultimo: 60
# Outro exemplo: coletar o início
*inicio, penultimo, final = dados
print(f"Inicio: {inicio}") # Saída: Inicio: [10, 20, 30, 40]
print(f"Penúltimo: {penultimo}") # Saída: Penúltimo: 50
print(f"Final: {final}") # Saída: Final: 60
```
A variável prefixada com `*` sempre resultará em uma lista, mesmo que não haja elementos para coletar (resultando em uma lista vazia).
:: **Referência** :: [PEP 448 – Generalizações adicionais de desempacotamento](https://peps.python.org/pep-0448/)