Комментарии (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
Итого: когда использовать распаковку
✅ Используй:
- Распаковка функций для чистоты кода
- Игнорирование значений с
_ - Работа с кортежами и списками в циклах
- Строго типизированные структуры
❌ Избегай:
- Сложной вложенной распаковки (неразборчиво)
- Безопасность при неизвестной структуре (проверяй размер)
Распаковка — это питоничный способ написания кода!