Programming Language/Python

[Python] 함수 파라미터 *args와 **kwargs

monkeykim 2024. 11. 1. 01:17

* (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는 함께 사용할 수 있으며, 이 경우 순서가 중요