2014-11-11 5 views
0

나는 lambda_expr :: = "lambda"[parameter_list] : 표현식, 파이썬 람다에 대한 호출은 무엇입니까?

이 있으며 이름에 할당하지 않고이를 수행 할 수 있어야합니다. 그래서 무엇이 람다 함수에 대한 호출을 구성합니다. 즉, 이것을 인라인 함수로 사용하려면 무엇을해야 할 일을합니까?

+0

나는이 질문을 이해하지 못한다. 람다에 대한 호출을 구성하는 것은 다른 함수에 대한 호출을 구성하는 것과 같습니다. 당신이 원하는 것에 대한 예를 보여줄 수 있습니까? – BrenBarn

+0

람다에게 이름을주지 않고 전화하고 싶습니까 ??? – Hackaholic

답변

6

람다 식은 function 개체를 반환하므로 다른 함수와 동일하게 호출합니다 (()). 함수 객체가 아니라 직접보다, 이름으로 참조를 제외하고

>>> (lambda x : x + 3)(5) 
8 

더 "정상"-looking 함수 호출

는 같은 방식으로 작동합니다. 다음은 같은 것을 수행하는 세 가지 다른 방법을 보여줍니다. 인수의 값에 3을 더한 함수를 호출합니다.

def foo_by_statement(x): 
    return x + 3 

foo_by_expression = lambda x: x + 3 

print foo_by_statement(2) 
print foo_by_expression(2) 
print (lambda x: x + 3)(2) 

첫 번째는 def 문을 사용하여, 이름에 함수 객체를 바인딩의 전통적인 방법입니다. 두 번째는 동등한 바인딩이며 직접 할당을 사용하여 이름을 lambda 표현식의 결과에 바인딩합니다. 세 번째는 다시 lambda 표현식의 반환 값을 직접 이름에 바인딩하지 않고 직접 호출하는 것입니다.

일반적으로 실제로는 이와 같은 코드를 작성하지 않습니다. lambda 표현식은 고차 함수에 대한 인수로 필요한 함수 객체를 생성하는 데 가장 유용합니다. 함수를 정의하고 다시 사용하지 않을 이름으로 바인드하는 대신, 값을 작성하여 즉시 인수로 전달하십시오. 예를 들면 다음과 같습니다.

+1

람다 튜토리얼은 항상'foo_by_expression = lambda x : x + 3'와 같은 예제를 갖고있는 것처럼 보입니다. 이름을 지정함으로써, 람다의 목적은 거의 사라졌습니다. 나는 그 대답에 대해 정말로 불평하지는 않지만 그와 같은 람다를 실제로하지 않는다는 것을 강조하기를 바라고 있습니다. – tdelaney

+0

@tdelaney : 동의 함; 저는 그러한 예를 싫어합니다. (사람들이 그러한 예들로부터 얻는 그릇된 생각들과 그들이 이끌어가는 의문들 ...); 'lambda'가 실제로 유용 할 때의 설명을 보는 것이 좋습니다. (이 경우에는 'plus_three = ([1, 2, 3]에서 x에 대해 x + 3)'이 더 좋을 수 있으며, 예는 적극적으로 잘못 인도되지 않습니다.) – abarnert

+0

동의; 'def' 문과'lambda'식이 동일한 객체를 생성한다는 사실을 강조하는 것입니다. 함수 객체가 이름에 바인딩되면 이름의 바인딩 방법을 알 수 없으며 (또한 신경 쓰지 않아도됩니다.) – chepner

2

함수를 정의하면 python은 함수 객체를 만들어 이름에 할당합니다. 람다를 정의 할 때, 파이썬은 함수 객체를 생성하지만 그것을 이름에 할당하지 않습니다. 이 기능은 여러 상황에서 유용하지만 일반적으로 사용되는 경우는 작은 변환을 원하지만 일반 함수 작성에 신경을 쓰지 않고 이름을 정해야합니다.

>>> for num in map(lambda i,j: i**j, range(10), range(10)): 
...  print num 
... 
1 
1 
4 
27 
256 
3125 
46656 
823543 
16777216 
387420489 

여기에서 map은 함수를 취하여 일련의 매개 변수로 호출합니다.

+0

이해력이 좋지 않을 수있는 좋은 예입니다 (왜냐하면'zip'이 필요하기 때문입니다). 'tkinter.Button' 콜백이나'threading.Thread' 타겟처럼'map'을 처음 사용하지 않는 예제는 더 간단 할 수도 있습니다. 그러나 일부에서는 지식이 필요없는 것을 생각하기가 어렵습니다 초보자가 가질 수없는 영역. (또한 대부분의 경우에 대한 일반적인 예제는'partial'으로 작성하는 것이 가장 좋습니다 ...) – abarnert

관련 문제