Python에서 패킹(Packing)과 언패킹(Unpacking)은 변수에 여러 개의 값을 효율적으로 할당하고 사용할 수 있도록 도와주는 강력한 기능이다. 이를 활용하면 코드의 가독성을 높이고, 보다 Pythonic한 방식으로 데이터를 다룰 수 있다.
What is Pythonic?
그냥..일단 Pythonic한 코드는 Python답고, 효율적이며, 가독성이 높은 코드라고 이해하면 될 것 같다.. 😊🚀
패킹(Packing)은 여러 개의 값을 하나의 변수(튜플, 리스트 등)로 묶는 것을 의미한다.
# 여러 개의 값을 하나의 변수에 패킹
numbers = 1, 2, 3, 4, 5 # 튜플로 자동 패킹됨
print(numbers) # (1, 2, 3, 4, 5)
words = ["Python", "is", "fun"] # 리스트 패킹
print(words) # ['Python', 'is', 'fun']
위의 예제에서 numbers는 여러 개의 정수를 하나의 튜플로 패킹했고, words는 리스트로 패킹한 예시이다.
언패킹(Unpacking)은 패킹된 변수(튜플, 리스트 등)에서 개별 요소를 각각의 변수에 할당하는 과정을 말한다.
# 튜플 언패킹
numbers = (1, 2, 3)
a, b, c = numbers # 각각의 변수에 값 할당
print(a, b, c) # 1 2 3
# 리스트 언패킹
words = ["Hello", "World"]
x, y = words
print(x, y) # Hello World
튜플이나 리스트의 요소 개수와 변수 개수가 일치해야 정상적으로 언패킹이 가능하다. 만약 개수가 다르면 오류가 발생한다.
numbers = (1, 2)
a, b, c = numbers # ValueError: not enough values to unpack (expected 3, got 2)
만약 언패킹할 요소 개수가 가변적이라면, *를 사용하여 남은 요소들을 리스트로 받을 수 있게 해준다.
# 앞의 두 값은 각각 할당하고, 나머지는 리스트로 받기
numbers = (1, 2, 3, 4, 5)
a, b, *rest = numbers
print(a, b, rest) # 1 2 [3, 4, 5]
# 중간의 값들을 리스트로 받기
first, *middle, last = numbers
print(first, middle, last) # 1 [2, 3, 4] 5
위의 예시처럼 *변수를 사용하면 특정 요소만 개별 변수에 할당하고 나머지는 리스트로 묶을 수 있게된다.
함수에서도 패킹과 언패킹을 활용하면 가변 인자 처리를 쉽게 할 수 있게 해준다.
def add(*numbers):
return sum(numbers) # 모든 입력값을 더하기
print(add(1, 2, 3)) # 6
print(add(4, 5, 6, 7)) # 22
*args는 여러 개의 입력값을 튜플로 패킹하여 함수 내에서 사용할 수 있도록 해준다.
def greet(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
# 여러 개의 키워드 인자 전달
print(greet(name="Alice", age=25, city="Seoul"))
# name: Alice
# age: 25
# city: Seoul
**kwargs는 여러 개의 키워드 인자를 딕셔너리로 패킹하여 처리할 수 있도록 해준다.
def multiply(a, b, c):
return a * b * c
nums = (2, 3, 4)
print(multiply(*nums)) # 24 (튜플 언패킹)
nums_list = [1, 5, 6]
print(multiply(*nums_list)) # 30 (리스트 언패킹)
*nums처럼 리스트나 튜플을 언패킹하여 개별 요소를 함수 인자로 전달할 수 있게 해준다.
def introduce(name, age, city):
print(f"이름: {name}, 나이: {age}, 도시: {city}")
data = {"name": "Bob", "age": 30, "city": "New York"}
introduce(**data)
# 이름: Bob, 나이: 30, 도시: New York
**data를 사용하면 딕셔너리의 키-값 쌍을 개별 인자로 전달할 수 있게 해준다.
Python에서는 패킹과 언패킹을 적극 활용하면 코드의 가독성과 효율성이 향상된다.
a, b = 10, 20
b, a = a, b # Python에서는 이렇게 한 줄로 Swap 가능!
print(a, b) # 20 10
def get_point():
return 3, 7 # 튜플 반환 (자동 패킹)
x, y = get_point() # 자동 언패킹
print(x, y) # 3 7
tuple_list = [(1, 'one'), (2, 'two'), (3, 'three')]
for num, word in tuple_list:
print(num, word)
# 1 one
# 2 two
# 3 three
"Python의 패킹과 언패킹을 공부하면서 내가 이미 자연스럽게 사용하고 있었다는 걸 깨달았다.
하지만 그 개념을 정확히 몰랐을 뿐, 실제로 코드에서 자주 활용하고 있었던 것이다.
특히!! *args, kwargs, 리스트 컴프리헨션, 튜플 언패킹 등의 문법이 단순한 편의 기능이 아니라, Pythonic한 코드 작성을 위한 강력한 도구라는 걸 알게 되었다.
그리고 사람들이 그렇게 'Pythonic'을 강조하는 이유도 이제야 이해가 된다.
결국 Pythonic하다는 건, Python이 제공하는 직관적이고 가독성 좋은 기능을
최대한 활용하여 'Python답게' 코드를 짜는 것이라는 걸 깨달았다!" 🚀