2013-07-24 3 views
-1

글쎄, 람다 함수에 대해 읽으려고했지만 그 흐름과 파이썬 해석기가 처리하는 방식에 대한 몇 가지 질문을 설명하는 링크를 찾지 못했거나 올바르게 이해하지 못했을 수 있습니다. 나는 약간의 질문이있다, 누군가 나를 위해 그들을 분명히 할 수있다. 여기 코드입니다 :람다 함수 이해하기

def f1(n): 
    print 'in f1, value is : ', n 
    return lambda x: x+n 

if __name__ == '__main__': 
    f= f1(100) 
    print f(1) 
    print f(3) 
    print f1(10) 
    print f(5) 
    print type(f1) 

출력 존재 :

in f1, value is : 100 
101 
103 
in f1, value is : 10 
<function <lambda> at 0x019C66B0> 
105 
<type 'function'> 

내 질문은 :

f(1)f(3)를 들어
  • print 문이 호출되지 않은 이유와 우리라는 f1(100) 왜 람다 문이 컴파일되지 않았는가.
  • xn 사이의 관계는 f1입니다.
  • 내가, 내가, lambda x: 여기에 무엇을 의미하는지 인이 블록의 X의 이름을 알려 주시기 바랍니다
  • 는 또한 print f1(10)
  • 을 설명해주십시오 f(5) 것 15 (10 + 5)를 생각? 설명 해주십시오.

감사합니다.

+0

질문을하기 전에 먼저 검색하십시오. 이 링크를 참조하십시오. http://stackoverflow.com/questions/1085875/what-is-this-lambda-everyone-keeps-speaking-of/1086347#1086347 –

+0

@tailor_raj : 링크를 사용해 주셔서 감사합니다.하지만 읽은 후에도 여전히 물어볼 것입니다. 내 특정 질문 (파이썬 기반) 특정 설명을 찾고 또한 내가이 질문을 게시하기 전에 검색했기 때문에 질문! 나는 당신이 확실히 나의 질문의 무결성에 대해 큰 소리로 말할 것 같은 요소를 기대했다. 거의 모든 질문에 항상 하나가있다 !!! 그래서 저는 사람들이 질문을하지 못하도록 막지 말 것입니다. – ramd

+0

낙담 한 사람들에 관한 것이 아닙니다. 왜냐하면 당신이 검색한다면, 당신이 묻는 것은 무엇이든간에 당신은 더 많은 것을 얻게 될 것이기 때문입니다. –

답변

2

먼저 파이썬의 모든 것이 객체라는 것을 알아야합니다. 그리고 기능은 다 들어 있습니다.

함수 f1()에서 실제로는 lambda 함수에 대한 참조를 반환합니다. 어떤 변수에서 할당 할 수 있습니다. 예컨대 들어

:

이제
>>> f = lambda x: x # Assign reference to lambda function to f. 
# Now you can call lambda function using `f` 
>>> f(1) 
1 

, 이제 귀하의 예제와 함께 앞으로 이동하자.

f = f1(100) 

이 할당하는 것과 같습니다 :

print f(1) # returns `1 + 100` = 101 (Replace `x` with `1`. 
print f(3) # returns `3 + 100` = 103 

그래서, 지금 당신이 얻을 :

f = lambda x: x + 100 # Replace `n` with `100` in return statment in `f1`. 

그래서, 다음 두 호출이 꽤 straighforward입니다 if은 내부에 첫 번째 문이다 xn 사이의 관계 'x'는 f의 인수로 바뀌고 'n'은 f1의 인수로 바뀝니다.

인쇄 F1 (10)

f1() 람다 함수에 대한 참조를 반환 설명 바랍니다. 그것이 인쇄됩니다. F1 만 람다 함수를 반환하기 때문에, 그 func 제외

>>> def func(): 
     return 5 

>>> func 
<function func at 0x021F0F30> 

lambda로 대체되어 출력은 아래의 코드에서 얻을 것과 유사하다.

나는, 당신은 그 출력을 가지고 것이다 F (5) 것입니다 15 (10 + 5)

생각 이전 성명에서 ff1의 반환 값을 할당 다시했다. 그러나 방금 f(10) 값을 인쇄 했으므로 f은 여전히 ​​- lambda x: x + 100에 바인드됩니다. 따라서 105이됩니다.

print type(f1) 
+0

위대한 설명. 나는이 대답을 정확히 찾고 있었다. 이제는 람다 함수에 많은 명확성을 가져다줍니다. 다시 한번 감사드립니다. 그냥 빠른 하나, 내 람다 바디 내에서, n은 커버링 함수 (이 경우 f1)에 의해 람다 함수에 전달 된 변수와 같습니다. – ramd

+1

@ramd. 그래, 그렇게 말할 수있어. –

1

lambda은 거의 다른 기능입니다. 그것을 사용하려면, 당신도 전화해야합니다.

f1 전체 함수가 아닌 실제 람다를 f으로 반환합니다. 이와 함께 람다는 반환 할 때 호출되지 않습니다. 그렇기 때문에 f(1)f(3)을 호출하면 실제로는 f1이 아니고 람다 만 실행됩니다.

람다가 함수와 어떻게 다른지 기억하십시오. 음 x은 인수이고, nf1에 정의한 로컬 변수 n입니다.

f(5) != 15 실제로 어디서나 f1(10)을 사용하지 않았기 때문에. 너는 단지 그것을 인쇄했다. f = f(10)을 수행 한 경우 15이됩니다.

print f1(10)은 람다 함수를 반환합니다 (반환되는 내용이기 때문에). 그것은 그것을 부르지 않고 그냥 인쇄합니다.

1

람다는 한 줄에 함수를 작성하는 단지 방법입니다

그리고는 당신은 단지 기능입니다 f1의 유형을 인쇄 할 수 있습니다.

처음에는 포인트가 표시되지 않지만 약간 다른 기능을 많이 생성하거나 한 번만 사용할 수있는 기능을 지정하거나 다른 모든 다양한 인스턴스에 유용 할 수 있습니다. 시도하고 좀 더 잘 이해하기 위해

가, 다음 코드 상상 - 당신의 자신의 약간 다른를 :

def f2(n): 

    def g2(x): 
     return x + n 

    return g2 

이 매우 자신의 코드가 무엇을 수행하지만, 첫 번째 함수 내에서 함수를 정의하고 그 다음 그것을 돌려 준다. 이것은 기본적으로 코드와 동일한 기능을 수행합니다.