728x90

이번 포스팅은 함수의 매개변수에서 입력받는 *args와 **kwargs에 대해 알아보겠습니다. 아마 인공지능이나 여러 코드를 보면 다음과 같은 코드를 마주칠 일이 있을 겁니다.

def args_and_kwargs(*args, **kwargs):

다음과 같이 *와 **로 인자를 받는 함수를 보셨을 겁니다.

이 함수의 차이에 대해서 설명해 드리겠습니다.

 

*args 가변 위치 인자(Variable Positional Arguments)


  •  * args는 함수에 가변적인 개수의 비키워드 인자를 전달할 때 사용
  • 인자들을 튜플의 형태로 입력을 받음
  • 함수를 정의하면서 비키워드 인자의 수를 모를 때 사용

위의 말이 어렵다면 예시를 통해 설명해 드리겠습니다.

def print_args(*args):
    print(type(args))
    print(args)
    for arg in args:
        print(arg)

print_args('hello', 'world', 'I', 'am', 'here')

# Output
# <class 'tuple'>
# ('hello', 'world', 'I', 'am', 'here')
# hello
# world
# I
# am
# here

함수를 사용할 때 Hello, world, I, am, here이 tuple로 묶여서 args에 입력되는 것을 볼 수 있습니다.

출력이 tuple형태로 묶여서 출력되는 것을 볼 수 있습니다.(위치 순서 중요!)

 

**kwargs 가변 키워드 인자(Variable Keyword Arguments)


  • **kwargs는 함수에 가변적인 개수의 키워드 인자를 전달할 때 사용
  • 인자들을 딕셔너리 형태로 받음
  • 함수를 정의할 때 어떤 키워드 인자가 전달될지 모를 때 사용

이것도 마찬가지로 예시를 통해 설명해 드리겠습니다.

def print_kwargs(**kwargs):
    print(type(kwargs))
    print(kwargs)
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_kwargs(name='John', age=25, job='Developer')

# Output
# <class 'dict'>
# {'name': 'John', 'age': 25, 'job': 'Developer'}
# name: John
# age: 25
# job: Developer

함수를 사용할 때 name='John', age=25, job='Developer'이 dictionary로 묶여서 kwargs에 입력되는 것을 볼 수 있습니다.

출력이 dictionary형태로 묶여서 출력되는 것을 볼 수 있습니다.

 

*args**kwargs 함께 사용하기


함수에서 위치 인자와 키워드 인자를 동시에 가변적으로 받고 싶을 때 함께 사용할 수 있습니다.

def print_args_and_kwargs(*args, **kwargs):
    for arg in args:
        print(arg)
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_args_and_kwargs('I', 'like', 'Python', language='Python', version=3.8)

# Output
# I
# like
# Python
# language: Python
# version: 3.8

이러한 방식으로, *args**kwargs는 파이썬에서 함수의 유연성을 크게 높여줍니다. 

특히 인공지능에서 여러 개의 인자들을 받을 때 자주 사용하므로 알아두어야 하는 기능 중 하나입니다. 

그림으로 표현하면 다음과 같습니다.

 

728x90