2015년 7월 8일 수요일

Python: *args and **kargs 임의의 개수의 변수를 가지는 함수 그리고, argument를 하나의 container로 넘겨주는 방법

*args 는 unlimited number of positional argument values 에 사용한다. (즉 keyword argument 가 아닌 경우)

**kargs 는 unlimited number of keyword argument values 에 사용한다.

예:

def func(x, *args, **kargs):
   print('first argument : '+x)
   for i in args:
     print('next argument :, i)
   for key,value  in kargs.iteritems() :
     print( '%s == %s'%(key,value))

여러개의 argument를 한번에 넘겨주고 싶을 때 다음과 같이
container를 이용하는 방법을 사용할 수 있다.
예를 들어서 다음과 같은 함수에 대해서

def avg3(a,b,c):
...     return (a+b+c)/3.0

(1) positional arguments as tuple:
     avg3( *(4,5,7) )

이 경우 하나의 3-tuple을 분해해서 3개의 argument로 받아들이게 된다.

(2) keyword arguments as dictionary
>>> d={ 'a':5, 'b':6, 'c':9 }
>>> avg3( **d )
6.666666666666667
이 경우 dictionary를 분해해서 3개의 keyword argument로 받아들인다.

(3) mix both
>>> avg3( 2, b=3, **{'c':4} )
3.0


한편, 일반적인 함수를 이용하여 계산하는 subroutine을 만들때, 기본적인 변수 이외의 extra argument를 사용할 수 있도록 하려면 어떻게 할까? 예를 들어 일반적인 f(x)꼴의 함수를 (-1,1)사이에서 적분하는 subroutine을 만들었는데, 함수에 다른 변수 f(x, a=1,b=2) 의 a,b를 바꾸고 
싶을 때는 어떻게 할까?
처음에 적분함수를 정의 할 때, def integration(func,args=()): 로 정의하고
함수 func을  func(x,*args)로 사용하면 된다. 이때, extra arguments는 tuple로 passing.



 

댓글 없음:

댓글 쓰기