ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] 함수 가변인자 *args, **kwargs 사용법 알아보기
    Python/파이썬 기초 2023. 8. 22. 09:39
    반응형

    파이썬 함수에서 가변인자 *args, **kwargs 사용법 알아보기


    우리가 프로그래밍을 하다보면 함수를 사용하기 마련입니다. 그리고, 파이썬(Python)에서 함수를 쓰다보면 간혹 이상한 표현이 눈에 띄기도 하지요. 바로 *args, 또는 **kwargs라는 표현입니다. 이 두 가지 표현은 가변인자 (Variadic Arguments) 라고 표현하는데요, 굳이 사용하지 않더라도 대부분의 프로그래밍 과정에는 문제가 없지만 알고 있다면 코드 작성의 편의성이 크게 늘어나기 때문에 알아두시는 것을 추천드립니다.

     

     

    *args의 용도 알아보기


    *args는 파이썬의 가변인자 중에서 몇개를 입력할지 모르는 상황에서 사용하는 표현입니다. 파이썬의 함수에서 어떤 값을 받을때는 몇개를 받을지 명시를 하는 것이 보통입니다. 하지만, *args 표현을 사용하게 된다면, 내가 나중에 이 함수를 이용해서 값을 하나만 입력할지, 아니면 여러개를 입력할지 모르는 상황에서 유연한 함수 정의를 할 수 있다는 장점이 있답니다.

     

     

    *args의 사용 예시는 아래와 같습니다. 이 문서에서는 args라고 적긴 했지만 이건 개발자들 사이의 암묵적인 표현 방법으로, 원한다면 *hello, *var1 등의 표현도 가능하니 굳이 똑같이 적지 않아도 된다는 점을 유의해 주세요.

     

     

    def function1(*args):
        for i in args:
            print(i)
    
    function1('hello', 2, [321], {478}, (500, 499))
    hello
    2
    [321]
    {478}
    (500, 499)

     

    # *args 표현을 사용하지 않는다면 TypeError가 발생합니다
    def function1(args):
        for i in args:
            print(i)
    
    function1('hello', 2, [321], {478}, (500, 499))
    ---------------------------------------------------------------------------
    
    TypeError                                 Traceback (most recent call last)
    
    Cell In[2], line 6
          3     for i in args:
          4         print(i)
    ----> 6 function1('hello', 2, [321], {478}, (500, 499))
    
    
    TypeError: function1() takes 1 positional argument but 5 were given

     

     

    **kwargs의 용도 알아보기


    앞서 살펴본 *args와 같이, **kwargs도 파이썬의 가변인자입니다. 이 역시 함수에 사용했을 때 *args와 동일한 역할을 할 수 있는데요, 특이한 점은 **kwargs는 키워드 파라미터 (keyword parameter) 를 입력할 때만 사용할 수 있다는 점입니다. 이러한 특징을 이용하면, 함수에서 어떤 값을 키워드와 함께 입력했을 때 입력한 키워드를 함께 이용할 수 있다는 장점이 있지요. 코드를 적어서 예를 들어보면 아래와 같습니다.

     

     

    def function2(**kwargs):
        for i, j in kwargs.items():
            print(i, j)
    
    function2(greeting = 'hello', no2 = 2, list1 = [321], set1 = {478}, tuple1 = (500, 499))
    greeting hello
    no2 2
    list1 [321]
    set1 {478}
    tuple1 (500, 499)

     

    # **kwargs 표현을 쓸 때는, 키워드 파라미터가 아닌 경우 에러가 발생합니다
    def function2(**kwargs):
        for i, j in kwargs.items():
            print(i, j)
    
    function2('hello', no2 = 2, list1 = [321], set1 = {478}, tuple1 = (500, 499))
    ---------------------------------------------------------------------------
    
    TypeError                                 Traceback (most recent call last)
    
    Cell In[4], line 6
          3     for i, j in kwargs.items():
          4         print(i, j)
    ----> 6 function2('hello', no2 = 2, list1 = [321], set1 = {478}, tuple1 = (500, 499))
    
    
    TypeError: function2() takes 0 positional arguments but 1 was given

     

     

    *args, **kwargs 함께 사용하기


    만약에 어떤 변수를 설정하면서 일반 파라미터와 키워드 파라미터를 혼용해서 사용할 수도 있습니다. 이 때는, *args, **kwargs를 함께 사용해서 문제를 해결할 수 있지요.

     

     

    def function2(*args, **kwargs):
        for a in args:
            print(a)
        for i, j in kwargs.items():
            print(i, j)
    
    function2('hello', no2 = 2, list1 = [321], set1 = {478}, tuple1 = (500, 499))
    hello
    no2 2
    list1 [321]
    set1 {478}
    tuple1 (500, 499)

     

    # *args, **kwargs를 함께 사용할 때는 일반 파라미터, 키워드 파라미터 순서로 작성해야 합니다
    def function2(*args, **kwargs):
        for a in args:
            print(a)
        for i, j in kwargs.items():
            print(i, j)
    
    function2(greeting = 'hello', 2, list1 = [321], set1 = {478}, tuple1 = (500, 499))
      Cell In[6], line 8
        function2(greeting = 'hello', 2, list1 = [321], set1 = {478}, tuple1 = (500, 499))
                                                                                         ^
    SyntaxError: positional argument follows keyword argument
    반응형

    댓글

문의: jwkang3929@naver.com