2012-04-14 9 views
1

[상세 참조] 파이썬 같은 변수 개의 고차 함수로부터 결과 값을 할당하는 것이 가능하며, 그 함수 반환 고차 함수를 사용하는 방법을 예시 준다 :는 <a href="http://pythonprogramming.jottit.com/functional_programming" rel="nofollow">http://pythonprogramming.jottit.com/functional_programming</a>에 가이드가있다

def trace(f): 
    f.indent = 0 
    def g(x): 
     print '| ' * f.indent + '|--', f.__name__, x 
     f.indent += 1 
     value = f(x) 
     print '| ' * f.indent + '|--', 'return', repr(value) 
     f.indent -= 1 
     return value 
    return g 

def memoize(f): 
    cache = {} 
    def g(x): 
     if x not in cache: 
      cache[x] = f(x) 
     return cache[x] 
    return g 

그러나 나는 문에 같은 변수에 두 가지 기능을 할당 할 수있어 어떻게하지 않습니다

fib = trace(fib) 
fib = memoize(fib) 
print fib(4) 

추적 및 메모는 마지막 호출에 영향을주는 것 같습니다. 왜 그런가요?

+1

"추적 모두와 memoize는 마지막 호출에 영향을 갖고있는 것 같다"당신이 별도로 추적 버전과 memoized 버전을 사용하려면

, 당신은 예를 들어, 다른 변수에 결과를 할당해야 둘 다 전화를 했어. 또 다른 질문? –

답변

2

trace()memoize()은 모두 새 기능 개체를 만들고 반환합니다.

각각의 경우 새 함수 개체가 이전 함수 개체를 "래핑"하므로 원래 함수가 손실되지 않습니다.

f(x) # this is your original function 

trace(f(x)) # trace "wraps" it and returns a wrapped object 

memoize(trace(f(x))) # memoize "wraps" it and returns a new wrapped function object 

우리는 이름 fib에 바인딩 함수 객체로 시작 :

여기, 내 놀라운 ASCII 아트 기술을 사용하여 도면이다.

그런 다음 새 함수 객체를 만드는 trace(fib)을 호출합니다. 처음 만들어지면 그 이름은 g이지만 우리는 그 이름을 fib으로 묶습니다. fib.__name__을 인쇄 해보십시오.

그런 다음 새 함수 객체를 만드는 memoize(fib)을 호출합니다. 다시 g이라는 이름으로 처음 생성되었지만 fib이라는 이름으로 바운드되었습니다.

파이썬에서는 모든 것이 객체이며, 객체는 이름이 없거나 하나의 이름 또는 많은 이름이 존재할 수 있음을 기억하십시오. 이 경우 이름을 fib과 같이 계속 사용하지만 다른 함수 객체로 다시 바인딩합니다. 당신이 그렇게 memoize가 추적 버전에 적용됩니다 (다음 fib이며, trace에 대한 호출 이후에 변수 fib 점을 작동하는 변경 때문에 당신이 쓴 무엇

2

그것은 다르지 없습니다 :

a = a + 2 
a = a + 5 
print a 

그냥 a으로 7 증가 할 것이다, fib 두 장식이 적용 한 것입니다.

+0

미안 @Ignacio 위의 유추는 저를위한 질문과 다른 느낌입니다.귀하의 경우에는 새로운 가치에 의해 '덮어 쓰기'됩니다; 나는 더 많은 것을 얻지 못한다. 아마도 나는 데코레이터에 대해 읽어야 만합니다. 두 함수가 새로운 함수를 생성하고 있다고 생각하고 fib가 두 번째 할당에서 덮어 쓰게됩니다. 무대 뒤에서 어떤 일이 일어 났는지 말해 줄 수 있습니까? –

+0

'fib'가 덮어 쓰여지고 있습니다. fib *이 사용하는 객체에 대한 참조가 포함되어 있다는 것은 단지 보풀입니다. –

+0

어떻게 두 작업 (추적, 메모)을 수행합니까? –

3

fib2 = memoize(trace(fib)) 
print fib2(4) 

매우 유사하다 "덮어 쓴").

fib_trace = trace(fib) 
fib_memo = memoize(fib) 
print fib_trace(4), fib_memo(4) 
관련 문제