파이썬을 쓰면서 여러 가지 문서를 보다 보면 빠지지 않고 항상 나오는 것이
*args와 **kwargs이다. 이것들은 과연 무엇일까?
일단 단어 뜻부터 알아보자. args는 arguments(인자들)이란 뜻이고,
kwargs는 keyword arguments(키워드 된 인자들)이란 뜻이다. 물론 keyword 말고도 named라고도 한다.
*args는 positional argument, *kwargs는 keyword argument가 정식 명칭이며 중요한 점은 args와 kwargs는 그냥 관용적으로 사용하는 이름일 뿐 *p, **k와 같이 이름을 다르게 해도 상관없다. 그러면 이러한 것들은 어떻게 사용하는 것일까?
def func1(arg1, arg2):
print('arg1: {}'.format(arg1))
print('arg2: {}'.format(arg2))
func1('hello', 123)
arg1: hello
arg2: 123
위와 같이 결과가 나오게 된다.
너무나 당연한 것이다. 일단 중요한 것은 func1의 arg1, arg2는 keyword argument이다.
그러면 이제 *args에 대해서 알아보자.
def func2(arg1, arg2, *args):
print(arg1, arg2)
print( type(args) )
print( len(args) )
print(args)
def func3(*args):
print( type(args) )
print( len(args) )
print(args)
func2('hello', 123, 'a', 'b', 'c', 1, 2, 3)
print('\n----------\n')
func3('hello', 123, 'a', 'b', 'c', 1, 2, 3)
hello 123
<class 'tuple'>
6
('a', 'b', 'c', 1, 2, 3)
----------
<class 'tuple'>
8
('hello', 123, 'a', 'b', 'c', 1, 2, 3)
그냥 보면 바로 이해할 것이다.
함수를 정의할 때 있지 않던 매개변수가 인자로 넘어오게 되면 모두 args tuple이 돼서 넘어간다.
참고로 얘기하면 매개변수(parameter)는 함수를 정의할 때 변수를 부르는 말이고
인자(argument)는 함수를 호출할 때 매개변수 자리에 넘기는 변수를 의미한다.
func2와 func3을 보면 좀 더 확실해진다.
이제 **kwargs를 알아보자.
def func4(arg, *args, **kwargs):
print('arg: {}'.format(arg))
print( len(args) )
print(args)
print( type(kwargs) )
print(kwargs)
func4('hello', 'a', 'b', 1, 2, 'abc')
print('\n----------\n')
func4(1, 2, 3, some='value', kim='sooran')
arg: hello
5
('a', 'b', 1, 2, 'abc')
<class 'dict'>
{}
----------
arg: 1
2
(2, 3)
<class 'dict'>
{'some': 'value', 'kim': 'sooran'}
위에서 보면 알겠지만 함수를 호출할 때 그냥 일반적인 방법으로 인자를 넘기면 kwargs에는 아무것도 들어가지 않는다.
또한 kwargs는 dictionary라는 사실을 알 수 있다.
원래 keyword argument란 것이 python 함수 호출시 인자를 파라미터가 정의된 순서대로 넘기는 것이 아니라 원하는 인자만 선택해서 넘길 때 사용한다.
그런데 만약 함수 정의에 없는 파라미터가 키워드 돼서 인자로 넘어오면 kwargs 사전에 들어가서 넘어가게 된다.
중요한 점은 만약 *args와 **kwargs를 사용할 때는 반드시 순서를 지켜서 넘겨줘야 한다.
func4('first', arg='apple', 3, 4, b='bee')
이런 식으로 호출하면 순서에 대한 에러가 나게 된다.
마지막으로 *args와 **kwargs가 정의된 함수에 변수로 사용하던 리스트나 딕셔너리를 넘기는 방법을 알아보자.
여기서 주의할 점은 아래의 방법은 '이렇게도 할 수 있다.'이지 '이러려고 사용한다.'가 아니다.
def func5(*args, **kwargs):
print( len(args) )
print(args)
print( len(kwargs) )
print(kwargs)
items = ['hello', 'hi', 'kim']
bank = { 'kim': 10000, 'lee': 500, 'hong': 1200 }
func5(*items, **bank)
3
('hello', 'hi', 'kim')
3
{'kim': 10000, 'lee': 500, 'hong': 1200}
이렇게 여러 python 문서에서 볼 수 있는 *args와 **kwargs에 대해서 알아봤다.
'Python > Python 용어 정리' 카테고리의 다른 글
sorted( ) 함수 (0) | 2022.07.21 |
---|---|
배열의 축(axis) 이해하기 (0) | 2022.07.12 |
고유값(eigenvalue), 고유벡터(eigenvector) 의 정의 (0) | 2022.07.12 |
Norm, 노름 (0) | 2022.07.12 |
벡터란 무엇인가? (0) | 2022.07.12 |