2015년 12월 24일 목요일

Keyword arguments passing, Unpacking arguments

Python의 scipy 와 같은 library를 사용하다보면,
라이브러리의 함수에 자신이 만든 함수를 지정하고,
args=() 로 Extra arguments to pass to function. 넘겨주어야 할 때가 있다.
아마도, scipy에서 함수를 정의할 때
*args와 **kwargs를 이용해서 unlimited number of argument를
넘겨 받도록 함수를 정의하였을 것이다.

그러나 만약 extra argument가 keyword argument라면?
def myfunc(x,y,a=1,b=2):  # y,a,b are optional arguments
    if y > 1.0:
         c = (1.0+b)**a
    else:
         c = (1.0+a)**b
    return c*x
(1) 모든 argument를 positional argument로 넘기기.
     위 함수를 libary에서 사용할때 다음과 같이 extra argument y,a,b를
     positional parameter로 넘겨준다.

     libfunc( myfunc, x, args=(y,a,b))

(2) 다음과 같이 wrapper를 만들어서 넘겨주는 방법이 있다.
(또는 global variable로 정의해서 넘겨주거나.)

def mywrapper(*args, **kwargs):  # args for y, kwargs for a, b
    def func(x):
        return myfunc(x, *args, **kwargs)
    return func

myfunc_with_args = mywrapper(2.5, a=4.0, b=5.0)
integral = integrate.romberg(myfunc_with_args, 1, 10)

(3) 그러나 이 경우에는 언제나 wrapper를 한번 불러 주어야 한다는 불편함이 있다.
keyword argument를 한번에 args=() 로 넘겨주는 방법은 없을까?....?
==> Scipy 함수의 argument는 positional argument에만 적용되고 keyword argument로는
쓸 수 없다. 따라서 (1)번이나 (2)번 방법만 가능하다.


2015년 12월 13일 일요일

[퍼옴] Hollow Mask 착시 효과

리차드 도킨스의 책에 언급된, 착시 효과를 인터넷에서 찾아보았다.
마스크의 움푹 들어간 뒤편에 색칠을 한 것을 보면, 음각임에도 불구하고,
양각으로 느껴진다. 이것을 도킨스는 인간의 뇌가 어느 곳에서나
얼굴의 패턴을 인식하려고 하는 경향 때문이라고 설명하고, 인간의 인식이
있는 자연을 그대로가 아니라 뇌의 시뮬레이션을  거쳐서 이루어지는 증거라고
한다.