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/)