[python] 파이썬 람다는 왜 유용한가요? [닫은]

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

나는 그것이 필요할지도 모르는 몇 가지 엣지 사례가 있다고 확신하지만, 그 모호함을 감안할 때, 향후 릴리스 (다양한 정의를 기반으로 한 내 가정)에서 재정의 될 가능성과 코딩 선명도가 감소해야합니다. 피하십시오?

이것은 C 유형의 오버플로 (버퍼 오버플로)를 상기시킵니다-최상위 변수를 가리키고 다른 필드 값을 설정하기 위해 오버로드합니다. 마치 일종의 기술자 쇼맨쉽이지만 유지 보수 코더 악몽처럼 느껴집니다.



답변

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

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

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

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

로 설정 mult3합니다 [3, 6, 9]. 원래 목록에서 3의 배수 인 요소는 다음과 같습니다.

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

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

  • 반복 가능한 시퀀스의 요소 결합 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 책을 읽으십시오.

이것은 현대 소프트웨어 비즈니스에서 관련 문제이며 점점 인기를 얻고 있습니다.


답변

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

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

(참고 :이 질문은 특별히 질문하지만 functools.partiallambda사용 하여 동일한 유형의 결과를 얻을 수도 있습니다)

대안은 각 버튼마다 별도의 콜백을 생성하여 코드가 중복 될 수 있습니다.


답변

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

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

흥미롭게도, 람다 및 기타 기능적 특징의 도입에 동기를 부여한 맵, 필터 및 감소 기능은 목록 이해 및 생성기 표현으로 대체되었습니다. 실제로 reduce 함수는 Python 3.0의 내장 함수 목록에서 제거되었습니다. (단, 람다, 맵 또는 필터의 제거에 대한 불만을 제기 할 필요는 없습니다. 🙂

내 자신의 두 센트 : 명확성이 나올 때까지는 그만한 가치가 거의 없습니다. 일반적으로 람다를 포함하지 않는 더 명확한 솔루션이 있습니다.


답변

파이썬에서 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)호출 하면 오류가 발생합니다. 람다를 사용하면 랩핑 함수를 정의하지 않고도 인수를 깔끔하게 삭제할 수 있습니다.dothingevent