일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- OrientDB
- Judge
- 배열
- 오픈한글
- 이클립스
- 백준
- online
- 프레임워크
- 토네이도
- Framework
- Tornado
- r
- 자바스크립트
- 설치
- spring
- 알고리즘
- 연결
- 파이썬
- API
- BAEKJOON
- mariadb
- Python
- AWS
- 저지
- 자료형
- MongoDB
- r script
- ubuntu
- 연동
- Java
- Today
- Total
맛동산
파이썬 *args **kwargs 본문
파이썬 *args **kwargs는 무엇인가?
파이썬 함수를 보면 종종 *args나 **kwargs가 인자로 사용되는 것을 볼 수 있습니다. C를 배우신 분들은 *을 보면 포인터를 먼저 떠올리시겠지만 사실 이것은 포인터가 아니라 가변인수라고 합니다.
가변인수란 어떤 함수를 호출할 때 입력받을 인자가 일정하지 않을 때 사용됩니다.
우선 핵심부터 말씀드리면 *args는 인자들을 tuple형태로 받고, **kwargs는 인자들을 dict(key : value) 형태로 받아옵니다.
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'}
언제 쓸 수 있는가?
자바를 배워보신 분이라면 '오버로딩'을 들어보신 적 있으실겁니다. 오버로딩을 간략하게 설명드리자면, 인자의 개수, 자료형을 다르게 정의하면 동일한 이름으로 여러개의 함수를 정의할 수 있는 것 입니다.
함수계의 hello world, 덧셈을 수행하는 add()라는 함수를 예로 오버로딩이 필요한 이유를 설명하겠습니다.
// 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)라는 함수를 작성해야할까요?
// 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()라는 하나의 명칭으로 호출할 수 있다는 것 입니다.
오버로딩이고 뭐고 지금부터 가변인수 *를 사용한 예를 보시면 그 생각마저 지워질 것 입니다.
def 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는 함께 사용하는 것도 가능합니다.
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}
'파이썬 > 기초' 카테고리의 다른 글
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 |