Python에서 *
와 **
를 함께 사용하기: 위치 인자와 키워드 인자 활용법
Python에서 *
와 **
를 동시에 사용하면 함수 호출 시 다양한 형태의 인자를 효율적으로 전달할 수 있습니다. 특히 함수에서 필수 인자, 위치 기반 인자, 키워드 인자를 모두 받을 때 *
와 **
는 강력한 도구가 됩니다. 이 가이드에서는 *args
와 **kwargs
를 함께 사용할 때의 구조와 다양한 예제를 통해 그 활용 방법을 소개합니다.
1. *args
와 **kwargs
의 기본 사용 구조
함수 정의 시 *args
와 **kwargs
를 함께 사용하면, 위치 기반 인자와 키워드 인자를 동시에 받아 처리할 수 있습니다. 위치 인자를 먼저 받고, 그다음 키워드 인자를 받기 때문에 함수 매개변수는 필수 인자 > *args
> `kwargs`** 순서로 작성해야 합니다.
def mixed_function(a, b, *args, **kwargs):
print(f"Required: {a}, {b}")
print(f"Args (additional positional): {args}")
print(f"Kwargs (additional keyword): {kwargs}")
# 호출 예시
mixed_function(1, 2, 3, 4, x=10, y=20)
출력 결과
Required: 1, 2
Args (additional positional): (3, 4)
Kwargs (additional keyword): {'x': 10, 'y': 20}
설명
a
와b
는 필수 인자로, 반드시 값을 전달해야 합니다.*args
는 위치 인자3
과4
를 튜플로 묶어 받습니다.**kwargs
는 키워드 인자x=10
과y=20
을 딕셔너리로 묶어 받습니다.- 이 구조 덕분에 함수 호출이 더욱 유연해지고, 필요에 따라 다양한 형태의 인자를 전달할 수 있습니다.
2. *
와 **
를 사용하여 동적으로 여러 인자 전달하기
*
와 **
는 함수 호출 시에도 사용할 수 있어, 리스트와 딕셔너리를 동시에 언패킹하여 인자로 전달할 수 있습니다. 이는 복잡한 인자 전달을 한 줄로 간단히 표현할 수 있게 해줍니다.
def order_summary(main, side, drink, *args, **kwargs):
print(f"Main: {main}, Side: {side}, Drink: {drink}")
print(f"Additional toppings: {args}")
print(f"Additional options: {kwargs}")
# 인자 설정
order_items = ["Burger", "Fries", "Cola"]
order_options = {"size": "Large", "extra_cheese": True}
# 리스트와 딕셔너리 동시 언패킹
order_summary(*order_items, "Bacon", "Onion", **order_options)
출력 결과
Main: Burger, Side: Fries, Drink: Cola
Additional toppings: ('Bacon', 'Onion')
Additional options: {'size': 'Large', 'extra_cheese': True}
설명
*order_items
는 리스트 요소를 언패킹하여main
,side
,drink
인자로 전달합니다."Bacon"
과"Onion"
은*args
로 전달되어 추가 토핑으로 분류됩니다.**order_options
는 딕셔너리를 언패킹하여 키워드 인자로 전달되므로,size
와extra_cheese
옵션이 적용됩니다.*
와**
를 함께 사용하면, 리스트와 딕셔너리를 필요한 위치에 맞춰 유연하게 전달할 수 있어 코드가 더욱 깔끔해집니다.
3. 클래스 초기화에서 *args
와 **kwargs
로 인자 관리하기
클래스 초기화 시 *args
와 **kwargs
를 함께 사용하면, 필수 속성 외의 추가 속성을 유연하게 받을 수 있어 클래스를 재사용하기 쉬워집니다.
class Product:
def __init__(self, name, price, *args, **kwargs):
self.name = name
self.price = price
self.features = args
self.options = kwargs
def show_info(self):
print(f"Product Name: {self.name}")
print(f"Price: {self.price}")
print(f"Features: {self.features}")
print(f"Options: {self.options}")
# 인스턴스 생성
item = Product("Laptop", 1200, "16GB RAM", "512GB SSD", color="Silver", warranty="2 years")
item.show_info()
출력 결과
Product Name: Laptop
Price: 1200
Features: ('16GB RAM', '512GB SSD')
Options: {'color': 'Silver', 'warranty': '2 years'}
설명
name
과price
는 필수 속성으로 받습니다.*args
는 추가적인 기능 정보를features
튜플로 저장합니다.**kwargs
는 옵션을 딕셔너리 형태로 받아options
에 저장합니다.- 기본 속성 외에도 추가 속성을 유연하게 받아 클래스를 다목적으로 활용할 수 있습니다.
4. 딕셔너리와 리스트 결합하기
*args
와 **kwargs
를 함께 사용하면, 딕셔너리와 리스트를 조합해 다양한 인자를 한 번에 처리할 수 있습니다. 이는 특히 설정값이나 다양한 옵션을 한꺼번에 전달할 때 유용합니다.
def configure_settings(*args, **kwargs):
print(f"General Settings: {args}")
print(f"Advanced Options: {kwargs}")
# 리스트와 딕셔너리 조합
general_settings = ["Dark Mode", "1080p"]
advanced_options = {"volume": 80, "brightness": 70}
configure_settings(*general_settings, **advanced_options)
출력 결과
General Settings: ('Dark Mode', '1080p')
Advanced Options: {'volume': 80, 'brightness': 70}
설명
*general_settings
는 리스트를 언패킹하여args
로 전달합니다.**advanced_options
는 딕셔너리를 언패킹하여kwargs
로 전달합니다.- 이 방식으로 설정값과 고급 옵션을 깔끔하고 효율적으로 전달할 수 있습니다.
요약: *
와 **
를 함께 사용하는 이유와 장점
Python에서 *args
와 **kwargs
를 함께 사용하면, 함수나 클래스에서 위치 인자와 키워드 인자를 동시에 유연하게 처리할 수 있습니다. *
와 **
를 결합해 사용하면 코드의 가독성과 재사용성이 높아지며, 반복적이고 복잡했던 인자 전달 방식이 단순해집니다.
*
와 **
의 동시 사용은 특히 다양한 인자 구성이 필요한 상황에서 매우 유용합니다. Python을 더욱 유연하고 효율적으로 사용하고 싶다면 이 문법을 익혀보세요!
'개발 > Python 스터디' 카테고리의 다른 글
[Python] 리스트 컴프리헨션과 메모리 절약: 더 빠르고 효율적인 코드 작성법 (1) | 2024.11.09 |
---|---|
[Python] `yield` 완벽 가이드: 효율적인 데이터 처리와 제너레이터 사용법 (0) | 2024.11.08 |
[Python] `**` 문법으로 복잡한 코드를 간단하게: 딕셔너리 언패킹과 키워드 인자 사용법 (1) | 2024.11.06 |
[Python] `*` 문법 완벽 가이드: 함수 인자, 언패킹, 가변 인자까지 (2) | 2024.11.05 |
[Python] `pdb`와 데코레이터 활용 가이드: 특정 함수만 효율적으로 디버깅하기 (0) | 2024.11.04 |