본문 바로가기
language/Python

[Python] *args, **kwargs은 어떤 거고, return된 객체의 type은 어떻게 나오는지 정리

by 스파이디웹 2022. 1. 27.
728x90

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으로 형식을 변환하여 출력할 수 있다.

 

결론:

여러개의 리턴값이 있는 경우 튜플에 해당 리턴 값들이 담기게 되고, 튜플의 인덱싱을 통해 각 리턴값에 접근 할 수 있다.

 

참조:

https://wikidocs.net/22801

728x90

댓글