이번 포스팅은 이전에 작성된 포스팅을 참고하여 작성하였다.

파이썬 코드를 살펴보다 보면 함수의 매개변수가 다음과 같은 형식으로 정의되는 것을 볼 때가 있다.

def some_func(*args):
    return 0


def some_func2(**kwargs):
    return 0

이번 포스팅에서는 위에서의 매개변수가 의미하는 바가 무엇인지, 그리고 간단한 사용법을 정리하였다.

함수의 매개변수 정의 앞에 *이 1개 붙어있는 경우

위의 첫 번째 예시인 some_func의 방법처럼 매개변수 args앞에 *가 1개가 붙어있는 경우에는 매개변수 args를 가변적인 갯수를 가진 위치 인수로 정의하겠다는 의미이다. 아래의 예시를 살펴보자.

def print_args(*args):
    print("Positional:", args)
    print("Type:", type(args))

print_args(1, 2)

>>>
Positional: 1, 2
Type: <class 'tuple'>

위와 같이 매개변수를 가변 갯수의 위치 인수로 설정하였기 때문에 임의의 변수들인 1, 2를 매개변수로 입력해줘도 잘 동작하는 것을 확인할 수 있다. 또한 입력받은 매개변수 1, 2는 튜플 형태로 입력되는 것도 추가적으로 확인할 수 있다. 함수를 정의할 때 매개변수를 가변적으로 그리고 따로 이름을 가지지 않은 위치 인수로 정의하고 싶다면 *을 한개 사용하여 매개변수를 정의하면 간단할 것이다. 예컨대 아래와 같은 활용도 가능하다.

def get_summation(*args):
    return sum(args)

print(get_summation(1, 2, 3, 4))

>>>
10

함수의 매개변수 정의 앞에 *이 2개 붙어있는 경우

맨 처음 예시로 들었던 some_func2처럼 매개변수 kwargs 앞에 *가 2개가 붙어있는 경우에는 매개변수 args를 가변적인 갯수를 가진 키워드 인수로 정의하겠다는 의미이다. 마찬가지로 예시를 들어보자.

def print_kwargs(**kwargs):
    print("Keyword:", kwargs)
    print("Type:", type(kwargs))

print_kwargs(foo=1, bar=2)

>>>
Keyword: {'bar': 2, 'foo': 1}
Type: <class 'dict'>

이번에는 위에서 *이 1개 붙어있는 경우와는 다르게 입력된 kwargs가 딕셔너리 형태로 전달되었다는 것을 확인할 수 있다. 딕셔너리 형태로 전달된 키워드 인수 각각을 사용하고 싶다면 함수 내부에서 딕셔너리의 각 요소에 접근하면 될 것이다. 예컨대 다음과 같다.

def get_summation(**kwargs):
    for key, val in kwargs.items():
        print("%s: %d", (key, sum(val)))

get_summation(first_semester=[40, 60, 50], second_semester=[30, 80, 90])

>>>
second_semester: 200
first_semester: 150

참고로 파이썬2에서는 키워드 인수 기능이 제공되지 않으며 만약 구현하고 싶으면 다음의 링크에서 확인할 수 있듯이 아래처럼 구현하면 된다.

# 파이썬2
def safe_division(number, divisor, **kwargs):
    ignore_overflow = kwargs.pop("ignore_overflow", False)
    ignore_zero_div = kwargs.pop("ignore_zero_division", False)
    if kwargs:
        raise TypeError("Unexpected **kwargs: %r" % kwargs)
    # ...

이런 방식으로 키워드 인수의 디폴트 값까지 설정이 가능하게 된다.

safe_division(1, 10)
safe_division(1, 0, ignore_zero_division=True)
safe_division(1, 10**500, ignore_overflow=True)

함수의 매개변수로 튜플 및 딕셔너리를 활용하는 방법: *을 활용

이번에는 반대로 정의된 함수에 매개변수로 튜플 및 딕셔너리를 입력하는 방법을 정리해보자. 위에서의 *의 활용 방식과 매우 유사한데 만약 튜플을 넘기고 싶다면 튜플의 변수명 앞에 *을 하나 붙이고 함수로 넘기고 딕셔너리의 경우에는 *을 2개 붙여서 넘기면 된다.

다음은 튜플을 함수의 매개변수로 넘기는 방법에 대한 예제이다.

def some_func(first_val, second_val, third_val):
    print("first:", first_val)
    print("second:", second_val)
    print("third:", third_val)

some_args = 4, "foo", "bar"
print(some_args)

some_func(*some_args)

>>>
(4, 'foo', 'bar')
first: 4
second: foo
third: bar

튜플 some_args를 정의한 이후에 함수 some_func에 *을 하나 붙여서 some_func(*some_args)와 같이 매개변수로 넘겨주면 우리가 예상하던 결과를 얻어낼 수 있다.

마찬가지로 딕셔너리 형태로 넘기는 방법을 생각해볼 수 있다.

some_kwargs = {"first_val": 4, "second_val": "foo", "third_val": "bar"}
some_func(**some_kwargs)

>>> 
first: 4
second: foo
third: bar

같은 결과를 얻을 수 있다. 이런 식으로 함수에 입력될 매개변수들을 딕셔너리 또는 튜플 형태로 구현해서 관리하는 방식은 개발자들에게 더 좋은 가독성을 제공할 수 있다는 장점이 있다.


Go back to the List of Studies