* (unpacking operator, 언패킹 연산자)의 역할
*과 **은 단순히 변수 이름 앞에 붙는 기호가 아닌, 언패킹 연산자로 작동합니다.
- * : 위치 인자를 튜플로 모아줍니다.
- ** : 키워드 인자를 딕셔너리로 모아줍니다.
1. *args: 여러 개의 위치 인자 받기
*args는 함수에 여러 개의 위치 인자를 넘길 때 사용합니다. *args로 받은 인자들은 튜플에 저장되며, 순서대로 접근할 수 있습니다.
*args에서 'args'는 관례일 뿐 다른 이름을 사용해도 됩니다.
def add_numbers(*numbers):
result = 0
for num in numbers:
result += num
return result
print(add_numbers(1, 2, 3)) #출력 6
print(add_numbers(5, 10, 15, 20)) #출력 50
위의 예시에서 add_numbers는 여러 개의 숫자를 입력받아 합산합니다. *numbers는 입력된 모든 숫자를 튜플로 저장하고, 각 값을 꺼내서 더할 수 있게 해줍니다.
2. **kwargs: 여러 개의 키워드 인자 받기
**kwargs는 키워드 인자, 즉 딕셔너리 형식의 인자를 받을 때 사용합니다. kwargs라는 이름도 마찬가지로 관례로 쓰이며, 다른 이름을 사용해도 됩니다.
def introduce(**info):
for key, value in info.items():
print(f"{key}: {value}")
introduce(name="kim", age=25, city="Seoul")
# 출력:
# name: Alice
# age: 25
# city: Seoul
위의 예시에서 introduce 함수는 name, age, city 등 다양한 키워드 인자를 받아 출력합니다. 여기에서 **info는 딕셔너리로 저장되며, key: value 형식으로 값을 다룰 수 있습니다.
3. *args와 **kwargs 같이 사용하기
*args와 **kwargs를 동시에 사용할 수 있으며, 이때는 순서가 중요합니다. 항상 *args가 앞에 와야 하고, **kwargs는 뒤에 와야 합니다.
def display_info(*args, **kwargs):
print("args:", args)
print("kwargs:", kwargs)
display_info(1, 2, 3, name="kim", age=25)
# 출력:
# Arguments: (1, 2, 3)
# Keyword Arguments: {'name': 'Alice', 'age': 25}
display_info 함수는 위치 인자를 *args로, 키워드 인자를 **kwargs로 받습니다. 이렇게 하면 위치와 키워드 인자를 모두 사용할 수 있습니다.
왜 *args가 **kwargs보다 먼저 와야하는가?
파이썬에는 위치 인자는 항상 키워드 인자보다 먼저 와야한다는 함수 호출 규칙이 있습니다. *args는 위치 인자를, **kwargs는 키워드 인자를 받기 때문에, 함수 정의에서 *args가 먼저, 그 다음에 **kwargs가 와야 합니다.
요약
- *args: 위치 인자 여러 개를 튜플로 받음
- **kwargs: 키워드 인자 여러 개를 딕셔너리로 받음
- *args와 **kwargs는 함께 사용할 수 있으며, 이 경우 순서가 중요