programing

Python 람다가 유용한 이유는 무엇입니까?

nasanasas 2020. 9. 28. 09:16
반응형

Python 람다가 유용한 이유는 무엇입니까? [닫은]


파이썬 람다를 알아 내려고합니다. 람다는 실생활에서 잊혀져 야하는 "흥미로운"언어 항목 중 하나입니까?

필자는 그것이 필요할 수있는 몇 가지 극단적 인 경우가 있다고 확신하지만, 모호함을 감안할 때 향후 릴리스에서 재정의 될 가능성 (다양한 정의를 기반으로 한 내 가정) 및 감소 된 코딩 명확성-그럴 경우 피할 수 있습니까?

이것은 C 유형의 오버플로 (버퍼 오버플로)를 상기시킵니다. 상위 변수를 가리키고 다른 필드 값을 설정하기위한 오버로딩입니다. 일종의 기술 쇼맨십처럼 느껴지지만 유지 보수 코더는 악몽입니다.


람다 함수 에 대해 이야기하고 있습니까? 처럼

lambda x: x**2 + 2*x - 5

이러한 것들은 실제로 매우 유용합니다. 파이썬은 함수형 프로그래밍이라는 프로그래밍 스타일을 지원합니다. 여기서 함수를 다른 함수에 전달하여 작업을 수행 할 수 있습니다. 예:

mult3 = filter(lambda x: x % 3 == 0, [1, 2, 3, 4, 5, 6, 7, 8, 9])

3의 배수 인 원래 목록의 요소는로 설정 mult3됩니다 [3, 6, 9]. 이것은보다 짧습니다 (그리고 더 명확 할 수 있습니다).

def filterfunc(x):
    return x % 3 == 0
mult3 = filter(filterfunc, [1, 2, 3, 4, 5, 6, 7, 8, 9])

물론이 특별한 경우에는 목록 이해와 동일한 작업을 수행 할 수 있습니다.

mult3 = [x for x in [1, 2, 3, 4, 5, 6, 7, 8, 9] if x % 3 == 0]

(또는으로도 range(3,10,3)) 목록 이해력을 사용할 수없고 람다 함수가 무언가를 작성하는 가장 짧은 방법 일 수있는 더 복잡한 사용 사례가 많이 있습니다.

  • 다른 함수에서 함수 반환

    >>> def transform(n):
    ...     return lambda x: x + n
    ...
    >>> f = transform(3)
    >>> f(4)
    7
    

    이것은 종종 Python의 데코레이터와 같은 함수 래퍼를 만드는 데 사용됩니다.

  • 반복 가능한 시퀀스의 요소를 reduce()

    >>> reduce(lambda a, b: '{}, {}'.format(a, b), [1, 2, 3, 4, 5, 6, 7, 8, 9])
    '1, 2, 3, 4, 5, 6, 7, 8, 9'
    
  • 대체 키로 정렬

    >>> sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(5-x))
    [5, 4, 6, 3, 7, 2, 8, 1, 9]
    

정기적으로 람다 함수를 사용합니다. 익숙해지는 데 시간이 좀 걸렸지 만 결국 언어의 매우 귀중한 부분이라는 것을 알게되었습니다.


lambda그냥 멋진 말입니다 function. 그 이름 외에는 모호하거나 위협적이거나 비밀스러운 것이 없습니다. 다음과 같은 라인을 읽을 때, 교체 lambda에 의해 function당신의 마음에 :

>>> f = lambda x: x + 1
>>> f(3)
4

의 기능을 정의합니다 x. 와 같은 다른 언어는 R명시 적으로 말합니다.

> f = function(x) { x + 1 }
> f(3)
4

봤어? 프로그래밍에서 가장 자연스러운 일 중 하나입니다.


두 줄 요약 :

  1. 폐쇄 : 매우 유용합니다. 배우고, 사용하고, 사랑하세요.
  2. 파이썬의 lambda키워드 : 불필요하고 가끔 유용합니다. 원격으로 복잡한 작업을 수행하는 경우이를 치우고 실제 기능을 정의하십시오.

람다는 고차 함수를 다루는 매우 중요한 추상화 메커니즘의 일부입니다. 그 가치를 제대로 이해하려면 Abelson과 Sussman의 고품질 교훈을 시청 하고 SICP 책을 읽으십시오.

이는 현대 소프트웨어 비즈니스의 관련 문제이며 점점 더 인기를 얻고 있습니다.


람다가 사라질지 의심 스럽습니다. 마침내 그것을 제거하려는 시도를 포기하는 것에 대한 Guido의 게시물을 참조하십시오 . 또한 충돌의 개요를 참조하십시오 .

Python의 기능적 기능이면에있는 거래에 대한 자세한 내용은이 게시물을 참조 하십시오 . http://python-history.blogspot.com/2009/04/origins-of-pythons-functional-features.html

흥미롭게도 원래 람다 및 기타 기능적 기능의 도입에 동기를 부여한 맵, 필터링 및 축소 기능이 목록 이해 및 생성기 표현식으로 대체되었습니다. 사실, 파이썬 3.0의 내장 함수 목록에서 reduce 함수가 제거되었습니다. (그러나 람다,지도 또는 필터 제거에 대한 불만을 보낼 필요는 없습니다 : 그들은 남아 있습니다. :-)

내 자신의 2 센트 : 명확성에 관한 한 그만한 가치가있는 람다는 드물다. 일반적으로 람다를 포함하지 않는 더 명확한 솔루션이 있습니다.


람다는 GUI 프로그래밍에서 매우 유용합니다. 예를 들어 버튼 그룹을 만들고 버튼 당 고유 한 콜백 대신 매개 변수화 된 단일 콜백을 사용하려고한다고 가정 해 보겠습니다. Lambda를 사용하면이를 쉽게 수행 할 수 있습니다.

for value in ["one","two","three"]:
    b = tk.Button(label=value, command=lambda arg=value: my_callback(arg))
    b.pack()

(참고 :이 질문은에 대해 구체적으로 묻고 있지만 functools.partiallambda사용 하여 동일한 유형의 결과를 얻을 수도 있습니다)

대안은 중복 코드로 이어질 수있는 각 버튼에 대해 별도의 콜백을 만드는 것입니다.


Python에서는 lambda함수를 인라인으로 정의하는 방법 일뿐입니다.

a = lambda x: x + 1
print a(1)

과..

def a(x): return x + 1
print a(1)

하하 - 정확히 같은.

일반 함수로는 할 수없는 람다로 할 수있는 일은 없습니다. 파이썬에서 함수는 다른 것과 같은 객체이고 람다는 단순히 함수를 정의합니다.

>>> a = lambda x: x + 1
>>> type(a)
<type 'function'>

솔직히 lambda파이썬에서 키워드가 중복 된다고 생각합니다. 저는 키워드를 사용할 필요가 없었습니다.

완전히 임의의 예를 들어, "Python의 람다가 깨졌습니다!" 기사에서 :

람다가 파손되는 방법을 확인하려면, 함수 목록 생성하려고 fs=[f0,...,f9]어디 fi(n)=i+n. 첫번째 시도:

>>> fs = [(lambda n: i + n) for i in range(10)]
>>> fs[3](4)
13

나는 그것이 효과가 있더라도, 그것은 끔찍하고 "비 파이썬 적"이라고 주장하고, 동일한 기능이 수많은 다른 방법으로 작성 될 수있다. 예를 들면 :

>>> n = 4
>>> [i + n for i in range(10)]
[4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

예, 동일하지는 않지만 목록에서 람다 함수 그룹을 생성 해야하는 원인을 본 적이 없습니다 . 다른 언어에서는 이해할 수 있지만 Python은 Haskell (또는 Lisp 또는 ...)이 아닙니다.

우리는 람다를 사용할 수 있고이 방법으로 원하는 결과를 얻을 수 있습니다.

>>> fs = [(lambda n,i=i: i + n) for i in range(10)]
>>> fs[3](4)
7

편집하다:

람다가 유용한 경우가 몇 가지 있습니다. 예를 들어 다음과 같이 PyQt 애플리케이션에서 신호를 연결할 때 편리합니다.

w = PyQt4.QtGui.QLineEdit()
w.textChanged.connect(lambda event: dothing())

그냥 추가 인수를 사용 w.textChanged.connect(dothing)하여 dothing메서드를 호출하고 event오류가 발생합니다. 람다를 사용하면 래핑 함수를 정의하지 않고도 인수를 깔끔하게 삭제할 수 있습니다.


동일한 기능을 수행하지만 상황이 다른 함수 목록에 람다가 유용하다는 것을 알았습니다. Mozilla 복수 규칙 처럼 .

plural_rules = [
    lambda n: 'all',
    lambda n: 'singular' if n == 1 else 'plural',
    lambda n: 'singular' if 0 <= n <= 1 else 'plural',
    ...
]
# Call plural rule #1 with argument 4 to find out which sentence form to use.
plural_rule[1](4) # returns 'plural'

모든 함수에 대해 함수를 정의해야한다면 끝날 무렵에는 미쳐 버릴 것입니다. 또한 그것은 같은 함수 이름과 좋지 않을까 plural_rule_1, plural_rule_2등 그리고 당신은 필요 거라고 eval()당신이 변수 기능 ID에 따라 때 그것.


당신이 할 수있는 거의 모든 것은 lambda명명 된 함수 나 목록 및 생성기 표현식으로 더 잘 할 수 있습니다.

결과적으로 대부분의 경우 기본적으로 모든 상황 (대화 형 인터프리터로 작성된 스크래치 코드 제외) 중 하나만 사용해야합니다.


저는 몇 년 동안 Python을 사용해 왔으며 람다 필요한 경우를 본 적이 없습니다 . 실제로 튜토리얼에서 언급했듯이 구문상의 설탕에 대한 것입니다.


파이썬의 특정 람다 구현에 대해 말할 수는 없지만 일반적으로 람다 함수는 정말 편리합니다. 함수형 프로그래밍의 핵심 기술 (아마도 THE 기술 일 수도 있음)이며 객체 지향 프로그램에서도 매우 유용합니다. 특정 유형의 문제에 대해서는 최선의 해결책이므로 잊지 말아야합니다!

나는 당신에 읽어 제안 폐쇄지도 기능 이 유용한 이유를 (파이썬 문서에 대한 링크는하지만 지원 기능 구조가 거의 모든 언어로 존재).


Lambda 함수는 함수를 생성하는 비 관료적 인 방법입니다.

그게 다야. 예를 들어, 주 함수가 있고 값을 제곱해야한다고 가정 해 보겠습니다. 이를 수행하는 전통적인 방법과 람다 방법을 살펴 보겠습니다.

전통적인 방법 :

def main():
...
...
y = square(some_number)
...
return something

def square(x):
    return x**2

람다 방식 :

def main():
...
square = lambda x: x**2
y = square(some_number)
return something

차이점이 보이십니까?

Lambda 함수는 목록 이해력 또는지도와 같은 목록과 매우 잘 어울립니다. 사실 목록 이해는 람다를 사용하여 자신을 표현하는 "비단뱀적인"방법입니다. 전의:

>>>a = [1,2,3,4]
>>>[x**2 for x in a]
[1,4,9,16]

구문의 각 요소가 의미하는 바를 살펴 보겠습니다.

[] : "목록을 줘"

x ** 2 : "이 새로운 기능 사용"

for x in a : "into each element in a"

그거 편리 해요? 이와 같은 기능을 생성합니다. 람다를 사용하여 다시 작성해 보겠습니다.

>>> square = lambda x: x**2
>>> [square(s) for x in a]
[1,4,9,16]

이제는 동일하지만 언어 중립적 인 맵을 사용하겠습니다. Maps는 두 가지 인수를 사용합니다.

(i) 하나의 기능

(ii) 반복 가능

그리고 각 요소가 iterable의 각 요소에 적용된 함수 인 목록을 제공합니다.

따라서지도를 사용하면 다음과 같이됩니다.

>>> a = [1,2,3,4]
>>> squared_list = map(lambda x: x**2, a)

람다와 매핑을 마스터하면 데이터를 간결하게 조작 할 수있는 강력한 힘을 갖게됩니다. Lambda 함수는 모호하지도 않고 코드 명확성을 빼앗아 가지도 않습니다. 어려운 것을 새로운 것과 혼동하지 마십시오. 일단 사용하기 시작하면 매우 명확합니다.


그것에 대한 좋은 점 중 하나는 lambda가치가 필요할 때까지 간단한 양식에 대한 평가를 연기하는 방법이라는 것입니다. 설명하겠습니다.

많은 라이브러리 루틴이 구현되어 특정 매개 변수가 호출 가능 (이 중 람다가 하나임)이 될 수 있습니다. 아이디어는 실제 값이 사용될 때 (호출 될 때가 아니라)에만 계산된다는 것입니다. (논의 된) 예가 요점을 설명하는 데 도움이 될 수 있습니다. 주어진 타임 스탬프를 기록 할 루틴이 있다고 가정합니다. 루틴에서 현재 시간에서 30 분을 뺀 값을 사용하려고합니다. 그렇게 부를거야

log_timestamp(datetime.datetime.now() - datetime.timedelta(minutes = 30))

이제 실제 함수가 특정 이벤트가 발생할 때만 호출되고 해당 시간에만 타임 스탬프가 계산되기를 원한다고 가정합니다. 이렇게 할 수 있습니다

log_timestamp(lambda : datetime.datetime.now() - datetime.timedelta(minutes = 30))

log_timestamp이와 같이 콜 러블을 처리 할 수 있다고 가정하면 필요할 때이를 평가하고 그 시간에 타임 스탬프를 얻을 수 있습니다.

물론이를 수행하는 다른 방법 ( operator예 : 모듈 사용 )이 있지만 요점을 전달했으면합니다.

업데이트 : 여기 에 좀 더 구체적인 실제 사례가 있습니다.

업데이트 2 : 나는 이것이 썽크 라고 불리는 것의 예라고 생각합니다 .


위에서 언급했듯이 Python의 람다 연산자는 익명 함수를 정의하고 Python 함수는 클로저입니다. 클로저의 개념을 단순히 구문 론적 메타돈 인 연산자 람다와 혼동하지 않는 것이 중요합니다.

몇 년 전 파이썬으로 시작했을 때 람다를 많이 사용했고, 목록 이해력과 함께 멋지다고 생각했습니다. 그러나 나는 수천 개의 기능 포인트 정도의 Python으로 작성된 큰 웹 사이트를 작성하고 유지해야합니다. 나는 경험을 통해 람다가 프로토 타입을 만들 수는 있지만 몇 개의 키스 토크를 저장하는 것 외에는 인라인 함수 (클로저라고 함)에 대해 아무것도 제공하지 않거나 때로는 제공하지 않는다는 것을 배웠습니다.

기본적으로 이것은 몇 가지 요점으로 요약됩니다.

  • 의미있는 이름을 사용하여 명시 적으로 작성된 소프트웨어를 읽는 것이 더 쉽습니다. 정의에 따른 익명 클로저는 이름이 없으므로 의미있는 이름을 가질 수 없습니다. 이 간결함은 어떤 이유로 람다 매개 변수를 감염시키는 것처럼 보이므로 종종 람다 x : x + 1과 같은 예를 볼 수 있습니다.
  • 명명 된 클로저를 참조 할 이름이있을 때 두 번 이상 이름으로 참조 될 수 있으므로 명명 된 클로저를 재사용하는 것이 더 쉽습니다.
  • 람다 대신 명명 된 클로저를 사용하는 코드를 디버그하는 것이 더 쉽습니다. 이름이 역 추적 및 오류 주변에 나타나기 때문입니다.

이것으로 반올림하여 명명 된 클로저로 변환 할 수 있습니다. 그러나 나는 익명의 폐쇄에 대해 두 가지 다른 원한을 가지고 있습니다.

첫 번째 원한은 단순히 언어를 복잡하게 만드는 또 다른 불필요한 키워드라는 것입니다.

두 번째 원한은 더 깊고 패러다임 수준입니다. 즉, 람다 계산법이 튜링이 아니기 때문에 해당 스타일이 메시지 전달, 객체 지향 또는 절차 적 스타일보다 덜 유연하기 때문에 기능 프로그래밍 스타일을 장려하는 것을 좋아하지 않습니다. 완전합니다 (다행히도 Python에서는 람다 내부에서도 해당 제한을 벗어날 수 있습니다). 람다가이 스타일을 홍보한다고 생각하는 이유는 다음과 같습니다.

  • 암시 적 반환이 있습니다. 즉, 함수가 '되어야하는'것처럼 보입니다.

  • 그것들은 다른 더 명시적이고, 더 읽기 쉽고, 더 재사용 가능하고, 더 일반적인 메커니즘 인 메소드에 대한 대체 상태 숨김 메커니즘입니다.

나는 람다없는 파이썬을 작성하기 위해 열심히 노력하고 눈에 보이는 람다를 제거합니다. 저는 파이썬이 람다가없는 약간 더 나은 언어라고 생각하지만 그것은 제 의견입니다.


Lambda는 실제로 함수형 프로그래밍의 아이디어에서 비롯된 매우 강력한 구조이며, Python의 가까운 장래에 쉽게 수정, 재정의 또는 제거되지 않을 것입니다. 함수를 매개 변수로 전달할 수 있으므로 더 강력한 코드를 작성하는 데 도움이되므로 함수를 일류 시민으로 생각할 수 있습니다.

Lambda는 혼란스러워지는 경향이 있지만 확실하게 이해하면 다음과 같이 깔끔하고 우아한 코드를 작성할 수 있습니다.

squared = map(lambda x: x*x, [1, 2, 3, 4, 5])

위의 코드 줄은 목록에있는 숫자의 제곱 목록을 반환합니다. 물론 다음과 같이 할 수도 있습니다.

def square(x):
    return x*x

squared = map(square, [1, 2, 3, 4, 5])

이전 코드가 더 짧다는 것은 분명하며, 이는 특히 한 곳에서만 map 함수 (또는 함수를 매개 변수로 사용하는 유사한 함수)를 사용하려는 경우에 해당됩니다. 이것은 또한 코드를 더 직관적이고 우아하게 만듭니다.

또한 @David Zaslavsky가 그의 답변에서 언급했듯이 목록 이해는 특히 모호한 수학적 방법에서 값을 가져와야하는 경우 특히 갈 길은 아닙니다.

좀 더 실용적인 관점에서 볼 때 최근 저에게 람다의 가장 큰 장점 중 하나는 GUI와 이벤트 기반 프로그래밍이었습니다. Tkinter에서 콜백을 살펴보면, 콜백을 트리거 한 이벤트 만 인수로 사용합니다.

def define_bindings(widget):
    widget.bind("<Button-1>", do-something-cool)

def do-something-cool(event):
    #Your code to execute on the event trigger

이제 통과해야 할 논쟁이 있다면 어떨까요? 마우스 클릭의 좌표를 저장하기 위해 2 개의 인수를 전달하는 것처럼 간단합니다. 다음과 같이 쉽게 할 수 있습니다.

def main():
    # define widgets and other imp stuff
    x, y = None, None
    widget.bind("<Button-1>", lambda event: do-something-cool(x, y))

def do-something-cool(event, x, y):
    x = event.x
    y = event.y
    #Do other cool stuff

이제 전역 변수를 사용하여이 작업을 수행 할 수 있다고 주장 할 수 있지만, 특히 전역 변수가 특정 위치에서만 사용되는 경우 메모리 관리 및 누출에 대해 걱정하고 싶습니까? 그것은 열악한 프로그래밍 스타일 일 것입니다.

요컨대, 람다는 굉장하며 과소 평가해서는 안됩니다. 파이썬 람다는 LISP 람다와 같지는 않지만 (더 강력합니다), 정말 많은 마법 같은 일을 할 수 있습니다.


Lambda는 일반적으로 함수형 프로그래밍 스타일과 밀접하게 연결되어 있습니다. 일부 데이터에 함수를 적용하고 결과를 병합하여 문제를 해결할 수 있다는 생각은 Google이 대부분의 알고리즘을 구현하는 데 사용하는 것입니다.

함수형 프로그래밍 스타일로 작성된 프로그램은 쉽게 병렬화되므로 최신 멀티 코어 머신에서 점점 더 중요 해지고 있습니다. 간단히 말해서, 당신은 그들을 잊지 말아야합니다.


람다를 알아 낸 첫 번째 축하합니다. 제 생각에 이것은 작동하기에 정말 강력한 구조입니다. 요즘 함수형 프로그래밍 언어에 대한 추세는 분명히 피해서는 안되며 가까운 장래에 재정의되지 않을 것이라는 지표입니다.

조금 다르게 생각하면됩니다. 곧 당신이 그것을 좋아할 것이라고 확신합니다. 그러나 파이썬 만 다루는 경우에는주의하십시오. 람다는 실제 클로저가 아니기 때문에 어떻게 든 "깨진"것입니다. 비단뱀 람다는 깨졌습니다.


코드 중복을 피하기 위해 람다를 사용합니다. 함수를 쉽게 이해할 수 있습니다. 예 :

def a_func()
  ...
  if some_conditon:
     ...
     call_some_big_func(arg1, arg2, arg3, arg4...)
  else
     ...
     call_some_big_func(arg1, arg2, arg3, arg4...)

임시 람다로 대체합니다.

def a_func()
  ...
  call_big_f = lambda args_that_change: call_some_big_func(arg1, arg2, arg3, args_that_change)
  if some_conditon:
     ...
     call_big_f(argX)
  else
     ...
     call_big_f(argY)

나는 방금 Python을 시작하고 먼저 Lambda로 향했습니다.

Note that this isn't a condemnation of anything. Everybody has a different set of things that don't come easily.

Is lambda one of those 'interesting' language items that in real life should be forgotten?

No.

I'm sure there are some edge cases where it might be needed, but given the obscurity of it,

It's not obscure. The past 2 teams I've worked on, everybody used this feature all the time.

the potential of it being redefined in future releases (my assumption based on the various definitions of it)

I've seen no serious proposals to redefine it in Python, beyond fixing the closure semantics a few years ago.

and the reduced coding clarity - should it be avoided?

It's not less clear, if you're using it right. On the contrary, having more language constructs available increases clarity.

This reminds me of overflowing (buffer overflow) of C types - pointing to the top variable and overloading to set the other field values...sort of a techie showmanship but maintenance coder nightmare..

Lambda is like buffer overflow? Wow. I can't imagine how you're using lambda if you think it's a "maintenance nightmare".


I started reading David Mertz's book today 'Text Processing in Python.' While he has a fairly terse description of Lambda's the examples in the first chapter combined with the explanation in Appendix A made them jump off the page for me (finally) and all of a sudden I understood their value. That is not to say his explanation will work for you and I am still at the discovery stage so I will not attempt to add to these responses other than the following: I am new to Python I am new to OOP Lambdas were a struggle for me Now that I read Mertz, I think I get them and I see them as very useful as I think they allow a cleaner approach to programming.

He reproduces the Zen of Python, one line of which is Simple is better than complex. As a non-OOP programmer reading code with lambdas (and until last week list comprehensions) I have thought-This is simple?. I finally realized today that actually these features make the code much more readable, and understandable than the alternative-which is invariably a loop of some sort. I also realized that like financial statements-Python was not designed for the novice user, rather it is designed for the user that wants to get educated. I can't believe how powerful this language is. When it dawned on me (finally) the purpose and value of lambdas I wanted to rip up about 30 programs and start over putting in lambdas where appropriate.


A useful case for using lambdas is to improve the readability of long list comprehensions. In this example loop_dic is short for clarity but imagine loop_dic being very long. If you would just use a plain value that includes i instead of the lambda version of that value you would get a NameError.

>>> lis = [{"name": "Peter"}, {"name": "Josef"}]

>>> loop_dic = lambda i: {"name": i["name"] + " Wallace" }
>>> new_lis = [loop_dic(i) for i in lis]

>>> new_lis
[{'name': 'Peter Wallace'}, {'name': 'Josef Wallace'}]

Instead of

>>> lis = [{"name": "Peter"}, {"name": "Josef"}]

>>> new_lis = [{"name": i["name"] + " Wallace"} for i in lis]

>>> new_lis
[{'name': 'Peter Wallace'}, {'name': 'Josef Wallace'}]

I'm a python beginner, so to getter a clear idea of lambda I compared it with a 'for' loop; in terms of efficiency. Here's the code (python 2.7) -

import time
start = time.time() # Measure the time taken for execution

def first():
    squares = map(lambda x: x**2, range(10))
    # ^ Lambda
    end = time.time()
    elapsed = end - start
    print elapsed + ' seconds'
    return elapsed # gives 0.0 seconds

def second():
    lst = []
    for i in range(10):
        lst.append(i**2)
    # ^ a 'for' loop
    end = time.time()
    elapsed = end - start
    print elapsed + ' seconds'
    return elapsed # gives 0.0019998550415 seconds.

print abs(second() - first()) # Gives 0.0019998550415 seconds!(duh)

I can give you an example where I actually needed lambda serious. I'm making a graphical program, where the use right clicks on a file and assigns it one of three options. It turns out that in Tkinter (the GUI interfacing program I'm writing this in), when someone presses a button, it can't be assigned to a command that takes in arguments. So if I chose one of the options and wanted the result of my choice to be:

print 'hi there'

Then no big deal. But what if I need my choice to have a particular detail. For example, if I choose choice A, it calls a function that takes in some argument that is dependent on the choice A, B or C, TKinter could not support this. Lamda was the only option to get around this actually...


I use it quite often, mainly as a null object or to partially bind parameters to a function.

예를 들면 다음과 같습니다.

null 객체 패턴을 구현하려면 :

{
    DATA_PACKET: self.handle_data_packets
    NET_PACKET: self.handle_hardware_packets
}.get(packet_type, lambda x : None)(payload)

매개 변수 바인딩의 경우 :

다음 API가 있다고 가정하겠습니다.

def dump_hex(file, var)
    # some code
    pass

class X(object):
    #...
    def packet_received(data):
        # some kind of preprocessing
        self.callback(data)
    #...

그런 다음받은 데이터를 파일에 빠르게 덤프하지 않으려면 다음을 수행합니다.

dump_file = file('hex_dump.txt','w')
X.callback = lambda (x): dump_hex(dump_file, x)
...
dump_file.close()

lambda매개 변수를 포함하는 콜백을 만드는 데 사용 합니다. 동일한 기능을 수행하는 메서드를 작성하는 것보다 한 줄에 람다를 작성하는 것이 더 깔끔합니다.

예를 들면 :

import imported.module

def func():
    return lambda: imported.module.method("foo", "bar")

반대로 :

import imported.module

def func():
    def cb():
        return imported.module.method("foo", "bar")
    return cb

Lambda는 프로 시저 생성자입니다. Python의 람다는 그다지 강력하지 않지만 런타임에 프로그램을 합성 할 수 있습니다. 그런 종류의 프로그래밍을 이해하는 사람은 거의 없습니다.

참고 URL : https://stackoverflow.com/questions/890128/why-are-python-lambdas-useful

반응형