어떤 함수는 호출하는 쪽에선 몇 개의 인수를 넘겨줄지 모르는 경우가 있다. 이럴 경우에 사용되는 것이 가변 개수 인자 기능으로써 함수는 넘어온 인자들을 묶어서 단일 튜플로 받는다.


 예를 들어 입력 인자들 중 짝수의 개수를 구하는 함수를 작성해야 하는데 몇 개의 입력이 들어올 지는 모른다고 가정하자. 인자들을 묶어서 한 개의 리스트를 받는 방식을 먼저 생각해 볼 수 있겠다.


def count_even(lst):
   cnt = 0
   for v in lst:
       if v%2==0:
           cnt +=1
   return cnt

>>> count_even([1,2,3,4,5,6,7])
3
>>> count_even([11,22,33])
1


이런 식으로 하나의 입력 인수를 받되 리스트 요소의 개수는 그때 그때 변할 수 있겠다.


 하지만 이런 경우에 있어서 좀 더 일반적인 해법은 가변 개수 인수를 받는 것이다. 가변 개수 인자를 지정할 때 함수의 정의부에서 변수 앞에 별표(*)를 붙인다.


>>> def count_even(*n):
   cnt = 0
   for v in n:
       if v%2==0:
           cnt +=1
   return cnt

>>> count_even(11,22,33)
1
>>> count_even(1,2,3,4,5,6,7)
3


앞의 경우와 다르게 함수를 호출할 때 콤마로 구분된 입력 인자를 몇 개라도 입력할 수 있다는 것이다. 함수 내부에서는 이들 인자들을 요소로 갖는 튜플이 변수 n에 넘어오게 된다. 즉 type(n)은 tuple 이다.


 한 가지 주의할 점은 일반 인자와 가변 인자가 동시에 오는 경우 반드시 가변 인자는 일반 인자 뒤에 와야 한다는 점이다. 또한 가변 인자는 단 하나만 사용할 수 있다는 것도 유의해야 한다.


>>> def  f1(a, *b): # 정상
>>> def  f2(a, *b, c): # 오류 - 가변 인자 뒤에 일반 인자가 올 수 없다.
>>> def  f3(*a, *b): #오류 - 가변 인자는 하나만 사용 가능
>>> def  f4(a, b, *c) # 정상


이러한 사항에 주의해서 함수를 작성해야 한다.




Posted by 살레시오
,