Python/파이선과 친해지기

[Python] - Python과 매우 친해지기-파라미터 args, kwargs

오랜만에 Python과 매우 친해지기 글을 포스팅한다. 사실 지난 Decorator로 어지간한 Python사용법은 거의 포스팅했다고 생각했는데, 몇 가지 빼먹은 게 있더라, 차츰차츰 올리는 걸로 하고, 이번에는 다시 올리는 Python과 매우 친해지기 파라미터 편이다.


파라미터의 사용

 

파라미터는 어디에 사용될까? 아래의 예시를 보자

##코드
class my_class :

    def __init__(self, name) :
        self.my_name = name

    def print_name(self) :
        print(self.my_name)
    
if __name__=="__main__" :
    chulsu = my_class("철수")		## my_class에 파라미터로 "철수" str 전달
    chulsu.print_name()
    
    
    
## 출력결과
철수

 

 

위와같이 클래스(def__init__에) 나 함수 블록에 전달하는 "인자"를 우리는 파라미터라고 부른다.

이런 파라미터들은 함수나 클래스에 정의된 대로 넘겨줄 수 있다. 다음의 예시를 보자

## 코드
def salute(name,job) :
    print("my name is "+name+" and my job is "+job)


if __name__=="__main__":
    salute("chulsu","java programmer")
   
   
   
## 출력결과
my name is chulsu and my job is java programmer

파라미터에 여러가지값을 넘길 수 있는 방안이 있을까?? 가령 학생이 10명 있는 반의 학생관리 프로그램에서 학생정보를 출력하는 함수를 정의한다고 생각하자. 기본값으로 ""를 주어 여러 학생을 받는다는 형식으로 본다면 다음과 같이 길고 더럽고 추잡한 코드가 나올 것이다.

## 코드
def print_student(stu1="", stu2="", stu3="", stu4="", stu5="", stu6="",
                      stu7="",stu8="",stu9="",stu10="") :
    print("stu1 : "+stu1)
    print("stu2 : "+stu2)
    print("stu3 : "+stu3)
    print("stu4 : "+stu4)
    print("stu5 : "+stu5)
    print("stu6 : "+stu6)
    print("stu7 : "+stu7)
    print("stu8 : "+stu8)
    print("stu9 : "+stu9)
    print("stu10 : "+stu10)

if __name__=="__main__":
    print_student("chulsu","yonghee","minsu","jinsu","binsu","osu",stu9="pengsu")
    
    
    
## 출력결과
stu1 : chulsu
stu2 : yonghee
stu3 : minsu
stu4 : jinsu
stu5 : binsu
stu6 : osu
stu7 : 
stu8 : 
stu9 : pengsu
stu10 :

 

이렇게 된다. 10명이라면 다행이지만, 100명 200명이면 어떻할까?(리스트로 받으면 된다고? 엄만 갈 거야 리스트는 여기 있어 그럼) 이와 같은 문제를 멋지게 해결할 수 있는 방법이 가변 파라미터이다.


args, kwargs

args의 약어는 arguments, kwargs의 약어는 Keyword Arguments이다. 각각 튜플과 딕셔너리형태로 다수의 파라미터를 제한 없이 받아들일 수 있는 특징이 있다. 마치 java의...이나 Kotlin의 vararg 같은 특성을 가진다. args의 앞에는 *, kwargs앞에는 **로 이 파라미터들이 가변이라는 것을 표현하는데, 다음의 예시를 보자 

### args의 예시, 코드
def print_student(*stu) :
    
    print(type(stu))        ## 가변인자 stu의 자료구조는 tuple
    
    index = 0
    for s in stu :
        print("stu"+str(index)+" : "+s)
        index += 1
    

if __name__=="__main__":
    print_student("chulsu","yonghee","minsu","jinsu","binsu","osu")
    
    
### args의 예시, 출력결과
<class 'tuple'>
stu0 : chulsu
stu1 : yonghee
stu2 : minsu
stu3 : jinsu
stu4 : binsu
stu5 : osu

출력 결과

다음은 kwargs의 예시이다.

### kargs의 예시, 코드
def print_student(**stu) :
    
    print(type(stu))        ## 가변인자 stu의 자료구조는 dictionary
    
    for k,v in stu.items() :
        print(k + " : " + v)
    

if __name__=="__main__":
    print_student(stu1 = "chulsu",stu2 = "yonghee",stu3 = "minsu")
    
    
## kargs의 예시, 출력결과
<class 'dict'>
stu1 : chulsu
stu2 : yonghee
stu3 : minsu

 

 

흔히 사용하는 우리의 python내장함수 print도 가변인자로 구성되어 있다. print는 다음과 같이 정의되어있다.

 

  ★ print(*objects, sep=' ', end='\n,  file=sys.stdout, flush=False)

 

맨앞 *objests가 가변인자 *args로 지정되어 있는 것을 알 수 있다.