← Назад к вопросам

Приведи пример распаковки в Python

2.0 Middle🔥 201 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Распаковка в Python: полный справочник

Распаковка (unpacking) — мощная и часто недооценённая особенность Python, позволяющая разбирать структуры данных. Покажу все варианты с примерами.

1. Базовая распаковка кортежей и списков

Распаковка кортежа в переменные

# Простой случай
a, b, c = (1, 2, 3)
print(a, b, c)  # 1 2 3

# Работает и с листами
x, y = [10, 20]
print(x, y)  # 10 20

# Работает и без скобок (кортеж подразумевается)
p, q = 100, 200
print(p, q)  # 100 200

Когда размеры не совпадают

a, b = (1, 2, 3)  # ❌ ValueError: too many values to unpack

# Исправление: используй * для остатка
first, *rest = (1, 2, 3, 4, 5)
print(first)  # 1
print(rest)   # [2, 3, 4, 5]

2. Распаковка со звёздочкой (*)

Захват остатка в начале

*head, tail = [1, 2, 3, 4, 5]
print(head)  # [1, 2, 3, 4]
print(tail)  # 5

Захват остатка в середине

first, *middle, last = range(10)
print(first)   # 0
print(middle)  # [1, 2, 3, 4, 5, 6, 7, 8]
print(last)    # 9

Игнорирование значений с _

a, _, c = (1, 2, 3)
print(a, c)  # 1 3

# Игнорирование многих значений
first, *_, last = range(100)
print(first, last)  # 0 99

3. Распаковка словарей

Распаковка ключей

data = {'name': 'Alice', 'age': 30}

# Только ключи
a, b = data
print(a, b)  # name age

# Ключи и значения
(k1, v1), (k2, v2) = data.items()
print(k1, v1)  # name Alice
print(k2, v2)  # age 30

Распаковка в функцию

def greet(name, age):
    return f"{name} is {age} years old"

user = {'name': 'Bob', 'age': 25}
result = greet(**user)  # ** распаковывает словарь
print(result)  # Bob is 25 years old

4. Распаковка списков (*)

В функциях

def add(a, b, c):
    return a + b + c

numbers = [10, 20, 30]
result = add(*numbers)  # * распаковывает список
print(result)  # 60

В конструкторах

list1 = [1, 2, 3]
list2 = [4, 5, 6]

# Объединение через распаковку
combined = [*list1, *list2]
print(combined)  # [1, 2, 3, 4, 5, 6]

# То же самое
combined = list1 + list2

Распаковка в новый список

head = [1, 2]
tail = [7, 8, 9]

full_list = [0, *head, 3, 4, 5, 6, *tail]
print(full_list)  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

5. Распаковка вложенных структур

Вложенные кортежи

(a, (b, c)) = (1, (2, 3))
print(a, b, c)  # 1 2 3

# Неправильная структура
(a, (b, c)) = (1, 2, 3)  # ❌ ValueError

Список списков

matrix = [[1, 2], [3, 4], [5, 6]]

for row, col in matrix:
    print(f"({row}, {col})")
# (1, 2)
# (3, 4)
# (5, 6)

6. Распаковка в циклах

Распаковка в for

pairs = [(1, 'a'), (2, 'b'), (3, 'c')]

for num, letter in pairs:
    print(f"{num}: {letter}")
# 1: a
# 2: b
# 3: c

# Игнорирование значения
for num, _ in pairs:
    print(num)  # 1 2 3

Распаковка из словаря

users = [
    {'name': 'Alice', 'age': 30},
    {'name': 'Bob', 'age': 25}
]

for {'name': name, 'age': age} in users:
    print(f"{name}: {age}")
# Alice: 30
# Bob: 25

7. Распаковка с помощью walrus :=

Присваивание при распаковке

if (first, *rest := [1, 2, 3, 4]):
    print(f"First: {first}, Rest: {rest}")
# First: 1, Rest: [2, 3, 4]

# В цикле
while (data := input()) != 'quit':
    print(f"You said: {data}")

8. Реальные примеры в коде

Парсинг функций

def parse_function_call(call_string):
    # "foo(1, 2, 3)" → ("foo", [1, 2, 3])
    func_name, *args_str = call_string.rstrip(')').split('(')
    args = [int(x.strip()) for x in args_str[0].split(',')]
    return func_name, args

name, args = parse_function_call("sum(10, 20, 30)")
print(name, args)  # sum [10, 20, 30]

Работа с результатами запросов

# API возвращает (status_code, data, headers)
code, *response_data = (200, {'id': 1}, {'X-Token': 'abc'})
print(f"Code: {code}, Data: {response_data}")
# Code: 200, Data: [{'id': 1}, {'X-Token': 'abc'}]

Построение конфига

# Берём переменные окружения
import os

db_host, db_user, *db_opts = os.environ.get('DB_CONFIG', 'localhost:root:').split(':')
print(f"Host: {db_host}, User: {db_user}, Options: {db_opts}")

Работа с tuple/list в функциях

def calculate(*args):
    if not args:
        return 0
    
    # Распаковка: первый элемент и остаток
    first, *rest = args
    
    # Рекурсивный подход
    return first + sum(rest) if rest else first

print(calculate(1, 2, 3, 4, 5))  # 15

9. Распаковка JSON

Распаковка JSON в модель

import json
from typing import NamedTuple

class User(NamedTuple):
    name: str
    age: int

json_str = '{"name": "Alice", "age": 30}'
data = json.loads(json_str)

# Распаковка в NamedTuple
user = User(**data)
print(user)  # User(name='Alice', age=30)

10. Частые ошибки

Ошибка 1: неправильное количество

a, b, c = [1, 2]  # ❌ ValueError: not enough values to unpack

Ошибка 2: всегда проверяй структуру

# Если не уверен в размере
data = get_api_response()  # Может быть [1, 2, 3] или [1, 2]

# Правильно:
first, *rest = data  # Всегда работает

# Неправильно:
first, second = data  # Падает, если один элемент

Ошибка 3: можно только одну *

a, *b, *c = [1, 2, 3, 4]  # ❌ SyntaxError

Итого: когда использовать распаковку

Используй:

  • Распаковка функций для чистоты кода
  • Игнорирование значений с _
  • Работа с кортежами и списками в циклах
  • Строго типизированные структуры

Избегай:

  • Сложной вложенной распаковки (неразборчиво)
  • Безопасность при неизвестной структуре (проверяй размер)

Распаковка — это питоничный способ написания кода!

Приведи пример распаковки в Python | PrepBro