일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 알고리즘
- Python
- 자료형
- BAEKJOON
- online
- 토네이도
- 이클립스
- 연동
- API
- Tornado
- 오픈한글
- Judge
- spring
- Framework
- r
- 배열
- r script
- ubuntu
- MongoDB
- 설치
- 백준
- Java
- mariadb
- 프레임워크
- 연결
- 파이썬
- AWS
- OrientDB
- 자바스크립트
- 저지
- Today
- Total
맛동산
파이썬 *args **kwargs 본문
파이썬 *args **kwargs는 무엇인가?
파이썬 함수를 보면 종종 *args나 **kwargs가 인자로 사용되는 것을 볼 수 있습니다. C를 배우신 분들은 *을 보면 포인터를 먼저 떠올리시겠지만 사실 이것은 포인터가 아니라 가변인수라고 합니다.
가변인수란 어떤 함수를 호출할 때 입력받을 인자가 일정하지 않을 때 사용됩니다.
우선 핵심부터 말씀드리면 *args는 인자들을 tuple형태로 받고, **kwargs는 인자들을 dict(key : value) 형태로 받아옵니다.
123456789def·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'}¬¶
언제 쓸 수 있는가?
자바를 배워보신 분이라면 '오버로딩'을 들어보신 적 있으실겁니다. 오버로딩을 간략하게 설명드리자면, 인자의 개수, 자료형을 다르게 정의하면 동일한 이름으로 여러개의 함수를 정의할 수 있는 것 입니다.
함수계의 hello world, 덧셈을 수행하는 add()라는 함수를 예로 오버로딩이 필요한 이유를 설명하겠습니다.
12345678910111213//·java·code¬class·Calc{¬····//add1¬····public·int·add1(int·a,·int·b){¬········return·a+b;¬····}¬····/*¬····#·as·python¬¬····def(a,b):¬········return·a+b¬····*/¬}¶
덧셈을 수행하는 add1()함수가 주석 add1에 작성되어 있습니다. 이 함수는 두 수 a와 b의 합을 구한 결과를 반환하고 있습니다.
하지만 두가지 숫자가 아니라 세가지 숫자를 더하고 싶다면, 네가지 숫자를 더하고 싶다면 add2(a, b, c), add3(a, b, c, d)라는 함수를 작성해야할까요?
12345678910111213141516171819//·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....¬}¶
아니죠~ 오버로딩을 사용하면 add()라는 하나의 함수명으로 인자의 개수나 자료형에 따라 다른 동작을 수행하도록 정의할 수 있습니다.
그렇다면 혹시'함수 뒤에 숫자만 안붙혔다 뿐이지 결국 일일이 써줘야 하는것 아니냐? '라는 생각을 하셨나요?
초심자 분들은 와닿지 않으실 수 있지만 오버로딩의 중요한 포인트는 add()라는 하나의 명칭으로 호출할 수 있다는 것 입니다.
오버로딩이고 뭐고 지금부터 가변인수 *를 사용한 예를 보시면 그 생각마저 지워질 것 입니다.
12345678910def·add(*params):¬····result·=·0¬····for·p·in·params:¬········result·+=·p¬····return·result¬¬#·or¬¬def·add2(*params):¬····return·sum(params)¶
자, 느낌이 좀 오시나요? 이제 함수 안에 인자 10개가 있어도, 100개가 있어도 add(1,2,3,4 ...) 이렇게 하나의 함수로 처리할 수 있습니다.
마찬가지로 **kwargs도 DB 접속 정보 등 여러 방면에 사용할 수 있습니다.
어떻게 쓸 수 있는가?
*args와 **kwargs는 함께 사용하는 것도 가능합니다.
12345678910111213141516def·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}¬¶
'파이썬 > 기초' 카테고리의 다른 글
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 |