[Python] *args, **kwargs은 어떤 거고, return된 객체의 type은 어떻게 나오는지 정리
1. *args란?
arguments의 줄인말로 가변 인자를 위한 변수
def add(*args):
result = 0
for i in args:
result += i
print(result)
위와 같은 매개변수로 *args가 들어가 있는 함수를 본 적이 있을 것이다.
- 해당 args는 통상적으로 가변 인자를 위한 변수의 이름이지 *whateveryouwant, *spidyweb 과 같은 변수명을 채택해도 됨(앞의 *가 중요)
- 앞에 *를 붙이면 가변 인자를 위한 변수로 인식 되어 여러개의 매개 변수를 입력 할 수 있게 됨
- 물론, 입력하지 않아도 됨
- *args에 값을 집어 넣으면 args 변수는 튜플 형태가되고 그 안에 값이 담기게 됨
1,2,3을 전달 인자로 입력
아무것도 전달 인자로 입력하지 않음
그렇다면 매개변수가아닌 인자 앞에 *가 붙은 것은 어떤 것 일까?
매개변수의 앞의 *는 packing(여러개의 객체를 하나의 객체로 합치는 기능)
인자 앞의 *는 unpacking(하나의 객체를 여러개의 객체로 풀어주는 기능)이라고 한다.
def sum(a, b, c):
return a + b + c
numbers = [1, 2, 3]
sum(numbers) # error
print(sum(*numbers)) # 출력 : 6
unpacking은 매개변수와 인자의 갯수가 맞아야하며, iterable한 container객체라면 다 가능합니다.(str, list, dictionary, set)
2. **kwargs 란?
key word arguments의 줄인말로 가변 인자를 위한 변수
- kwargs또한 통상적으로 가변 인자를 위한 변수의 이름이지 **whateveryouwant, **spidyweb 과 같은 변수명을 채택해도 됨(앞의 **가 중요)
- 앞에 **를 붙이면 가변 인자를 위한 변수로 인식 되어 여러개의 매개 변수를 입력 할 수 있게 됨
- 물론, 입력하지 않아도 됨
- **kwargs에 값을 집어 넣으면 위 사진과 같이 key:value 값이 담기게 되고, dictionary 형태로 출력됨
*args vs **kwargs
*args | **kwargs | |
변수명 | 다른 걸로 해도 상관없음 | 다른 걸로 해도 상관없음 |
리턴 값 | 변수가 튜플로 리턴됨 | 변수가 딕셔너리로 리턴됨 |
전달인수 개수 | 0개이상(전달 안해도됨) | 0개이상(전달 안해도됨) |
변수 앞에 별표 | 1개 | 2개 |
3. 여러 개의 return 값이 있는 함수
일반적으로 한 개의 리턴값을 주는 함수는 아래의 사진과 같이 객체의 타입으로 리턴을 해준다.
아래의 사진과 같은 함수가 있을 때, return 하는 객체가 3개로 나와 있다.
객체 3개를 리턴해주는 함수는 튜플 타입이라는 것을 알 수 있다.
더 자세히 봐서 어떤 형태로 튜플에 객체가 담기는지 확인 해 보면,
tuple내에 dataframe객체가 담기고, datetime객체가 각각 담기게 된다.
이렇다는 것은, 이 객체들을 활용하려면 튜플을 사용하듯이 인덱싱을 하여 활용하면 된다.
튜플의 첫 번째 요소는 dataframe 처럼 .show()를 사용할 수 있고,
튜플의 두 번째 요소는 datetime객체이므로 strftime으로 형식을 변환하여 출력할 수 있고,
마찬가지로 튜플의 세 번째 요소도 datetime객체이므로 strftime으로 형식을 변환하여 출력할 수 있다.
결론:
여러개의 리턴값이 있는 경우 튜플에 해당 리턴 값들이 담기게 되고, 튜플의 인덱싱을 통해 각 리턴값에 접근 할 수 있다.
참조: