맛동산

파이썬 *args **kwargs 본문

파이썬/기초

파이썬 *args **kwargs

오지고지리고알파고포켓몬고 2017. 12. 16. 22:31

파이썬 *args **kwargs는 무엇인가?


파이썬 함수를 보면 종종 *args나 **kwargs가 인자로 사용되는 것을 볼 수 있습니다. C를 배우신 분들은 *을 보면 포인터를 먼저 떠올리시겠지만 사실 이것은 포인터가 아니라 가변인수라고 합니다.


가변인수란 어떤 함수를 호출할 때 입력받을 인자가 일정하지 않을 때 사용됩니다.

우선 핵심부터 말씀드리면 *args는 인자들을 tuple형태로 받고, **kwargs는 인자들을 dict(key : value) 형태로 받아옵니다.

1
2
3
4
5
6
7
8
9
def·args1(*args):¬
····print('args·:',args)¬
¬
def·args2(**kwargs):¬
····print('kwargs·:',kwargs)¬
¬
args1(1,2,3)·#·args·:·(1,2,3)¬
args2(name='daseul',·addr='incheon')·#·kwargs·:·{'name':'daseul',·'addr'='incheon'}¬
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX


언제 쓸 수 있는가?


자바를 배워보신 분이라면 '오버로딩'을 들어보신 적 있으실겁니다. 오버로딩을 간략하게 설명드리자면, 인자의 개수, 자료형을 다르게 정의하면 동일한 이름으로 여러개의 함수를 정의할 수 있는 것 입니다.


함수계의 hello world, 덧셈을 수행하는 add()라는 함수를 예로 오버로딩이 필요한 이유를 설명하겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
//·java·code¬
class·Calc{¬
····//add1¬
····public·int·add1(int·a,·int·b){¬
········return·a+b;¬
····}¬
····/*¬
····#·as·python¬
¬
····def(a,b):¬
········return·a+b¬
····*/¬
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX


덧셈을 수행하는 add1()함수가 주석 add1에 작성되어 있습니다. 이 함수는 두 수 a와 b의 합을 구한 결과를 반환하고 있습니다.

하지만 두가지 숫자가 아니라 세가지 숫자를 더하고 싶다면, 네가지 숫자를 더하고 싶다면 add2(a, b, c), add3(a, b, c, d)라는 함수를 작성해야할까요? 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//·java·code¬
class·Calc{¬
····//add1¬
····public·int·add(int·a,·int·b){¬
········return·a+b;¬
····}¬
¬
····//add2¬
····public·int·add(int·a,·int·b,·int·c){¬
········return·a+b+c;¬
····}¬
¬
····//add3¬
····public·int·add(int·a,·int·b,·int·c,·int·d){¬
········return·a+b+c+d;¬
····}¬
¬
····//add....¬
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX


아니죠~ 오버로딩을 사용하면 add()라는 하나의 함수명으로 인자의 개수나 자료형에 따라 다른 동작을 수행하도록 정의할 수 있습니다.


그렇다면 혹시'함수 뒤에 숫자만 안붙혔다 뿐이지 결국 일일이 써줘야 하는것 아니냐? '라는 생각을 하셨나요?

초심자 분들은 와닿지 않으실 수 있지만 오버로딩의 중요한 포인트는 add()라는 하나의 명칭으로 호출할 수 있다는 것 입니다.


오버로딩이고 뭐고 지금부터 가변인수 *를 사용한 예를 보시면 그 생각마저 지워질 것 입니다.


1
2
3
4
5
6
7
8
9
10
def·add(*params):¬
····result·=·0¬
····for·p·in·params:¬
········result·+=·p¬
····return·result¬
¬
#·or¬
¬
def·add2(*params):¬
····return·sum(params)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

자, 느낌이 좀 오시나요? 이제 함수 안에 인자 10개가 있어도, 100개가 있어도 add(1,2,3,4 ...) 이렇게 하나의 함수로 처리할 수 있습니다.

마찬가지로 **kwargs도 DB 접속 정보 등 여러 방면에 사용할 수 있습니다.



어떻게 쓸 수 있는가?


*args와 **kwargs는 함께 사용하는 것도 가능합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def·args1(*args):¬
····print('args·:',args)¬
¬
def·args2(**kwargs):¬
····print('kwargs·:',kwargs)¬
¬
def·args3(*args,·**kwargs):¬
····print(args)¬
····print(kwargs)¬
¬
args1(1,2,3)·#·args·:·(1,2,3)¬
args2(name='daseul',·addr='incheon')·#·kwargs·:·{'name':'daseul',·'addr'='incheon'}¬
args3(1,2,c=3,d=4)¬
#(1,·2)¬
#{'c':·3,·'d':·4}¬
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX


'파이썬 > 기초' 카테고리의 다른 글

xml 파싱 후 커스텀하여 json으로 저장  (0) 2017.12.06
수치 연산자  (0) 2017.05.12
unread result found 에러  (1) 2016.12.07
파이썬 파일 입출력  (0) 2016.10.07
파이썬 파일 입출력_파일읽기  (3) 2016.10.07
Comments