우선, 기본적으로 python에서 인자를 넣는 방법을 살펴보자.

def sum(x, y):
    return x + y
  • Position argument (args): 처음부터 번째 수를 맞춰서 딱딱 넣어준다. (Array 성격)
    • ex) sum(1, 2)
  • Keyword argument (kwargs): 어떤 이름에 들어갈 것이라고 지정해서 알려준다. (Dict 성격)
    • ex) sum(y=2, x=1)

args 특징 알아보기

다음과 같이 함수를 정의하고, 그 차이점을 비교해보자.

def print_variable_no_args(x, y):
    print(f"x: {x}")
    print(f"y: {y}")
def print_variable_with_args(x, y, *args):
    print(f"x: {x}")
    print(f"y: {y}")
variable_list = ["핫", "둘", "셋"]

이와 같이 출력하면,

print("print_variable_no_args")
print_variable_no_args(variable_list[0], variable_list[1])
print("print_variable_with_args")
print_variable_with_args(variable_list[0], variable_list[1])

다음과 같이 두 함수 모두 결과가 잘 나온다.

print_variable_no_args
x: 
y: 
print_variable_with_args
x: 
y: 

하지만 인자를 하나 더 늘리면
print_variable_no_args()는 에러가 나고,
print_variable_with_args()만이 다음과 같은 결과가 나온다.

print_variable_with_args(variable_list[0],
                       variable_list[1],
                       variable_list[2])
x: 핫
y: 둘

그 이유가 뭘까?
좀 더 확실하게 알기 위해 *args로 들어가는 인자를 출력하는 함수를 새로 구성했다.

def print_variable_print_args(x, y, *args):
    print(f"x: {x}")
    print(f"y: {y}")
    print(f"args: {args}")

다음과 같이 출력해보면,

print_variable_print_args(variable_list[0],
                       variable_list[1],
                       variable_list[2])
print_variable_print_args(1, 2, 3, 4, 5, 6)

이와 같은 결과가 나온다. 즉, 함수에서 x,y인자 외에 추가적으로 들어가면 모두 args에 저장되는 것을 알 수 있다.

x: 핫
y: 둘
args: ('셋',)
x: 1
y: 2
args: (3, 4, 5, 6)

다음과 같이 함수를 정의하면, args에 저장된 특정 인자의 값을 가져올 수 있다.

def print_variable_get_args(x, y, *args):
    print(f"x: {x}")
    print(f"y: {y}")
    print(f"args[0]: {args[0]}")

아까와 같이 출력해보면,

print_variable_get_args(variable_list[0],
                       variable_list[1],
                       variable_list[2])
print_variable_get_args(1, 2, 3, 4, 5, 6)

결과는 다음과 같다.

x: 핫
y: 둘
args[0]: 셋
x: 1
y: 2
args[0]: 3

kargs 특징 알아보기

같은 방법으로 다음과 같이 함수를 정의하고, 그 차이점을 비교해보자.

def print_variable_with_kwargs(x, y, **kwargs):
    print(f"x: {x}")
    print(f"y: {y}")

args와 같이 다음과 같은 결과가 나오는 것을 알 수 있다.

print_variable_with_kwargs(x="마",y="라",z="탕")
x: 마
y: 라

이번에도 **kwargs로 들어가는 인자를 출력하는 함수를 구성해보자.

def print_variable_print_kwargs(x, y, **kwargs):
    print(f"x: {x}")
    print(f"y: {y}")
    print(f"kwargs: {kwargs}")

이와 같이 출력해보면, 결과는 다음과 같다.

print_variable_print_kwargs(x="마",y="라",z="탕", yk="떡볶이")
x: 마
y: 라
kwargs: {'z': '탕', 'yk': '떡볶이'}

이처럼 key와 value값을 활용해서 특정값을 가져올 수 있다.

def print_variable_get_kwargs(x, y, **kwargs):
    print(f"x: {x}")
    print(f"y: {y}")
    for key, value in kwargs.items():
        print(f"In kwargs: key {key}, value {value}")
print_variable_get_kwargs(x="마",y="라",z="탕", yk="떡볶이")
x: 마
y: 라
In kwargs: key z, value 탕
In kwargs: key yk, value 떡볶이