주제: print에서의 언패킹, 함수 호출 시 언패킹, 리스트 결합, starred assignment, zip과의 결합, 실수하기 쉬운 포인트
구성: 문제 코드 → 실행 결과 → 상세 설명 → 핵심 포인트
*iterable은 값을 풀어서 전달합니다.a, *b, c = ...처럼 나머지를 모을 수 있습니다.[*a, *b]로 리스트를 자연스럽게 합칠 수 있습니다.zip(*data)는 행과 열을 바꾸는 대표 패턴입니다.a = [1, 2, 3]
print(*a)
1 2 3*a는 리스트 [1, 2, 3]을 각각의 값으로 풀어 print(1, 2, 3)처럼 전달합니다. print(a)와 달리 대괄호 없이 공백으로 나열됩니다.word = "star"
print(*word)
s t a r*word는 's', 't', 'a', 'r'로 풀립니다.t = (10, 20, 30)
print(*t)
10 20 30print(10, 20, 30)과 같은 효과가 납니다.a = [1, 2, 3]
print(*a, sep=' / ')
1 / 2 / 3sep가 결정합니다. 여기서는 공백 대신 ' / '가 들어갑니다.print(*(x*x for x in range(4)))
0 1 4 9*가 이 값을 하나씩 꺼내 print에 전달합니다. 따라서 제너레이터 객체 자체가 아니라 실제 값들이 출력됩니다.def add(a, b, c):
return a + b + c
nums = [3, 4, 5]
print(add(*nums))
12*nums는 3, 4, 5로 풀립니다. 따라서 함수 호출은 add(3, 4, 5)와 같아집니다.def f(x, y):
print(x, y)
pair = (100, 200)
f(*pair)
100 200x, y로 들어갑니다. 언패킹은 인자 수가 함수 정의와 맞아야 정상 동작합니다.print(*range(1, 6))
1 2 3 4 5range(1, 6)은 1부터 5까지의 값을 만듭니다. *가 이를 하나씩 꺼내서 출력합니다.nums = [7, 1, 9, 4]
print(max(*nums[:2], 8))
8nums[:2]는 [7, 1]입니다. 따라서 max(*nums[:2], 8)은 max(7, 1, 8)이 되어 결과는 8입니다.def add(a, b, c):
return a + b + c
nums = [1, 2]
print(add(*nums))
TypeError 발생nums에는 값이 2개뿐입니다. 언패킹은 편리하지만, 함수가 요구하는 개수와 정확히 맞아야 합니다.a = [1, 2]
b = [3, 4]
c = [*a, *b]
print(c)
[1, 2, 3, 4]*는 다른 iterable의 원소를 풀어서 넣습니다. 따라서 [*a, *b]는 두 리스트를 자연스럽게 이어 붙인 새 리스트가 됩니다.a = [2, 3]
b = [7, 8]
c = [0, *a, 5, *b, 9]
print(c)
[0, 2, 3, 5, 7, 8, 9]letters = [*"ABC"]
print(letters)
['A', 'B', 'C']a = []
b = [1, 2]
print([*a, *b])
[1, 2]b의 원소만 들어갑니다.a, *b = [10, 20, 30, 40]
print(a)
print(b)
10
[20, 30, 40]a에 들어가고, 나머지는 모두 리스트 형태로 b에 모입니다. 이때 b는 항상 리스트입니다.a, *b, c = [1, 2, 3, 4, 5]
print(a)
print(b)
print(c)
1
[2, 3, 4]
5a, 마지막 값은 c, 가운데 값들은 전부 b에 리스트로 담깁니다. 시험에서 매우 자주 나오는 형태입니다.a, *b = [7]
print(a)
print(b)
7
[]a에 들어갑니다. 남는 값이 없으므로 b는 빈 리스트가 됩니다.a, *b, c = [1]
ValueError 발생a와 c에 최소 한 개씩은 값이 있어야 하는데, 리스트에는 값이 하나뿐입니다. 따라서 언패킹할 값이 부족하여 오류가 납니다.pairs = [('a', 1), ('b', 2), ('c', 3)]
x, y = zip(*pairs)
print(x)
print(y)
('a', 'b', 'c')
(1, 2, 3)*pairs는 ('a', 1), ('b', 2), ('c', 3)를 각각의 인자로 전달합니다. 그러면 zip이 같은 위치끼리 묶어 첫 번째 요소들, 두 번째 요소들로 재구성합니다. 즉 행과 열을 바꾸는 효과가 납니다.star = ['① A', '② B', '③ C', '④ D', '⑤ E']
print(*(x for x in star if x[0] not in '①②④⑤'))
③ Cx[0]는 각 문자열의 첫 글자입니다.'①②④⑤'에 없는 첫 글자를 가진 항목만 남깁니다.'③ C'만 조건을 통과합니다.*를 붙이면 실제 값이 풀려서 출력됩니다.print(*a)는 print(a)와 다릅니다. 전자는 값을 풀어서 출력하고, 후자는 리스트/튜플 자체를 출력합니다.*를 쓰면 iterable의 원소가 각각의 위치 인자로 들어갑니다.[*a, *b]는 리스트 결합의 대표 패턴입니다.a, *b, c = ...에서 별표가 붙은 변수는 남는 값을 리스트로 받습니다.zip(*data)는 행과 열을 바꾸는 매우 중요한 패턴입니다.print([1,2,3])와 print(*[1,2,3])의 차이를 헷갈림TypeError 발생a, *b, c에서 값이 부족해 ValueError 발생*는 iterable의 값을 풀어서 전달하는 기호이며, 출력·함수 호출·리스트 결합·구조 분해에서 매우 자주 사용됩니다.