여기서는 * 문법을 따로 외우기보다 구조를 변수로 풀어 받는지, 아니면 묶인 값을 호출 자리에서 펼치는지를 먼저 봅니다.
대입에서는 언패킹, 호출에서는 펼치기라는 흐름으로 읽으면 *rest, *args, **kwargs가 한 덩어리로 정리됩니다.
숏컷 코드
point = (10, 20)
x, y = point
first, *middle, last = [1, 2, 3, 4, 5]
values = [1, 2, 3]
print(*values)문법
기본형은 고정 길이 언패킹, starred 수집, 위치 인수 펼치기, 키워드 인수 펼치기까지 같이 보면 됩니다.
a, b = seq
head, *body, tail = seq
func(*args, **kwargs)*rest는 남는 값을 리스트로 모으고, 호출 자리의 *args, **kwargs는 묶인 구조를 함수 인수 자리로 펼칩니다.
대입 언패킹
고정 길이 구조를 변수로 풀면 언패킹이다
시퀀스를 통째로 들고 다니지 않고, 필요한 이름으로 바로 풀어 두고 싶을 때 씁니다.
user = ("Mina", 26)
name, age = useruser[0], user[1]를 반복하는 것보다 변수 이름이 바로 생기기 때문에 의도가 빨리 드러납니다.
starred 수집
나머지를 한 번에 모으면 *rest를 쓴다
길이가 정확히 고정되지 않았을 때는 starred 표현식이 유용합니다. 특히 "앞 몇 개는 중요하고 나머지는 묶어서 받는다"는 패턴이 깔끔해집니다.
first, *rest = [10, 20, 30, 40]
head, *body, tail = [1, 2, 3, 4]*rest는 리스트로 모인다는 점도 같이 기억하면 좋습니다.
호출 펼치기
함수 호출의 *와 **도 같은 감각으로 읽는다
대입에서는 구조를 풀어 받는 문법이고, 호출에서는 값을 펼쳐 넘기는 문법입니다.
def add(a, b, c):
return a + b + c
nums = [1, 2, 3]
result = add(*nums)
options = {"sep": " | ", "end": "\n"}
print("a", "b", **options)즉 starred 문법은 "묶여 있는 구조를 문맥에 맞게 펼친다"는 하나의 감각으로 읽으면 됩니다.
연결되는 구조
tuple, 함수 반환값, args/kwargs 카드와 자연스럽게 이어진다
언패킹은 보통 단독 문법이 아니라 다른 카드들과 자연스럽게 이어집니다.
- tuple에서 여러 값을 받아 온다
- 함수가 여러 값을 반환한 뒤 바로 푼다
- 함수 호출에서
*args,**kwargs와 연결된다
즉 언패킹은 시퀀스 읽기와 함수 호출 문법을 이어 주는 공통 문법으로 보면 정리가 쉽습니다.
주의할 점
언패킹 대상의 길이가 맞지 않으면 ValueError가 납니다. 길이가 고정인지 먼저 확인해야 합니다.
# ❌ 값이 3개인데 변수는 2개
x, y = [1, 2, 3]
# ✅ 길이를 맞추거나 starred를 사용
x, y, z = [1, 2, 3]
# 또는
x, *rest = [1, 2, 3]참고 링크
2 sources