람다 함수를 사용하는 이유는 무엇입니까?
람다 함수가 무엇인지, 구문이 작동하는 방식과 그렇지 않은 방식을 보여주는 많은 자료를 찾을 수 있습니다. 그러나 "멋진 요소"(중간에 다른 함수를 호출 할 수있는 함수를 깔끔하게 만들 수 있습니다!) 외에는 제가 왜 그것들을 정말로 필요로하고 / 사용하고 싶은지에 대해 너무나도 설득력있는 것을 보지 못했습니다.
내가 본 대부분의 예에서 문체 또는 구조적 선택에 가깝습니다. 그리고 파이썬 규칙에서 "무언가를하는 유일한 올바른 방법"을 깨뜨립니다. 내 프로그램을 더 정확하고, 더 신뢰할 수 있고, 더 빠르고, 더 쉽게 이해할 수있는 방법은 무엇입니까? (내가 본 대부분의 코딩 표준은 한 줄에 지나치게 복잡한 명령문을 사용하지 말라고하는 경향이 있습니다. 읽기가 더 쉬워지면 분리합니다.)
다음은 좋은 예입니다.
def key(x):
return x[1]
a = [(1, 2), (3, 1), (5, 10), (11, -3)]
a.sort(key=key)
대
a = [(1, 2), (3, 1), (5, 10), (11, -3)]
a.sort(key=lambda x: x[1])
다른 각도에서 : 람다 식은 "익명 함수"라고도하며 특정 프로그래밍 패러다임, 특히 람다 계산법이 영감을 준 함수 프로그래밍에서 매우 유용합니다.
http://en.wikipedia.org/wiki/Lambda_calculus
구문은 대부분 map
et al을 다룰 때 특정 상황에서 더 간결 합니다.
map(lambda x: x * 2, [1,2,3,4])
나에게 더 나은 것 같습니다.
def double(x):
return x * 2
map(double, [1,2,3,4])
나는 람다가 그것을 사용 def double
하는 map
것과 거의 분리되어 보이기 때문에이 상황에서 더 나은 선택이라고 생각합니다 . 또한 작업이 끝나면 기능이 버려지는 추가 이점이 있다고 생각합니다.
Python에서 유용성을 제한하는 한 가지 단점이 있습니다. 람다는 하나의 표현식 만 가질 수 있습니다 (즉, 여러 줄을 가질 수 없음). 공백을 강제하는 언어에서는 작동하지 않습니다.
또한 람다를 사용할 때마다 기분이 좋습니다.
Lambda 함수는 콜백 함수와 같은 것 또는 일회용 함수가 필요한 장소에서 가장 유용합니다. JAB의 예는 완벽합니다-키워드 argument와 함께 사용하는 것이 더 key
좋지만 여전히 유용한 정보를 제공합니다.
언제
def key(x):
return x[1]
300 줄 떨어진 곳에 나타남
[(1,2), (3,1), (5,10), (11,-3)].sort(key)
키는 무엇을합니까? 정말 아무런 징후가 없습니다. 특히 함수에 익숙하다면 어떤 종류의 추측을 할 수 있지만 일반적으로 되돌아 가야합니다. OTOH,
[(1,2), (3,1), (5,10), (11,-3)].sort(lambda x: x[1])
더 많은 것을 알려줍니다.
- Sort는 함수를 인수로 사용합니다.
- 이 함수는 1 개의 매개 변수를 취하고 결과를 "반환"합니다.
- 이 목록을 목록의 각 요소의 두 번째 값으로 정렬하려고합니다.
- (목록이 변수이므로 값을 볼 수없는 경우)이 논리는 목록에 최소 2 개의 요소가있을 것으로 예상합니다.
더 많은 정보가있을 수 있지만 이름이 지정된 함수 대신 익명의 람다 함수를 사용하는 것만으로도 얻을 수있는 엄청난 양입니다.
또한 네임 스페이스를 오염시키지 않습니다.)
나에게 그것은 코드의 표현력의 문제입니다. 사람들이 지원해야하는 코드를 작성할 때 해당 코드는 가능한 한 간결하고 이해하기 쉬운 방식으로 스토리를 전달해야합니다. 때로는 람다식이 더 복잡 할 때도 있고, 어떤 경우에는 해당 줄 또는 코드 블록이 수행하는 작업을 더 직접적으로 알려줍니다. 글을 쓸 때 판단을 사용하십시오.
문장을 구성하는 것처럼 생각하십시오. 중요한 부분은 무엇이며 (명사 및 동사 대 객체 및 메서드 등) 직관적으로 수행하는 작업을 전달하기 위해 해당 줄 또는 코드 블록에 대해 순서를 지정해야합니다.
네, 당신 말이 맞습니다. 이것은 구조적인 선택입니다. 람다 식을 사용하는 것만으로는 프로그램이 더 정확하지 않을 수 있습니다. 또한 더 안정적으로 만들 수 없으며 속도와는 관련이 없습니다.
유연성과 표현력에 관한 것입니다. 목록 이해력과 같습니다. 명명 된 함수를 정의하는 대부분을 수행 할 수 있습니다 (이름 공간을 오염시킬 수 있지만 이는 순전히 스타일 문제입니다).
별도의 명명 된 함수를 정의 할 필요가없고 다른 사람이 해당 인수에서 blah () 메서드를 호출하는 것임을 다른 사람이 찾아 읽고 이해해야한다는 사실을 통해 가독성을 높일 수 있습니다.
다른 함수를 만들고 반환하는 함수를 작성하는 데 사용할 때 훨씬 더 흥미로울 수 있습니다. 정확히 해당 함수가 수행하는 작업은 인수에 따라 다릅니다. 이것은 코드 동작을 매개 변수화하는 매우 간결하고 읽기 쉬운 방법 일 수 있습니다. 더 흥미로운 아이디어를 표현할 수 있습니다.
그러나 그것은 여전히 구조적인 선택입니다. 그렇지 않으면 할 수 있습니다. 그러나 객체 지향 프로그래밍도 마찬가지입니다.)
우리가 말하는 익명 함수 라는 세부 사항은 잠시 무시하십시오 . 익명 함수를 포함한 함수는 Python에서 할당 가능한 수량 (실제로 값은 아니지만 거의)입니다. 같은 표현
map(lambda y: y * -1, range(0, 10))
-1, 0, 10 및 람다 연산자의 결과와 map
호출 의 암시 적 결과의 네 가지 익명 수량을 명시 적으로 언급합니다 . 일부 언어로 익명 유형의 값 을 생성 할 수 있습니다. 따라서 함수와 숫자의 피상적 인 차이를 무시하십시오. 명명 된 함수와 반대로 익명 함수를 사용할 때의 질문은 코드에 네이 키드 숫자 리터럴을 넣을 때와 TIMES_I_WISHED_I_HAD_A_PONY
또는 BUFFER_SIZE
미리 선언 할 때에 대한 질문과 유사 합니다. (숫자, 문자열 또는 함수) 리터럴을 사용하는 것이 적절할 때가 있고 그러한 것을 이름을 지정하고 이름을 통해 참조하는 것이 더 적절할 때가 있습니다.
예를 참조하십시오. Allen Holub의 Design Patterns in Java에 대한 도발적이고 사고 또는 분노를 유발하는 책; 그는 익명의 클래스를 꽤 많이 사용합니다.
Lambda는 특정 상황에서 유용하지만 남용 될 가능성이 큽니다. 람다는 거의 항상 코드를 읽기 어렵게 만듭니다. 그리고 모든 코드를 한 줄에 맞추는 것이 만족 스러울 수 있지만 코드를 읽어야하는 다음 사람에게는 짜증이 날 것입니다.
PEP8에서 직접
"Guido의 핵심 통찰력 중 하나는 코드가 작성된 것보다 훨씬 더 자주 읽는다는 것입니다."
내가 배운 람다 함수의 한 가지 사용은 다른 좋은 대안이 아니거나 적어도 나를 가장 잘 찾는 곳은 다음과 같은 함수 매개 변수의 기본 작업입니다.
parameter=lambda x: x
이렇게하면 값이 변경되지 않고 반환되지만 선택적으로 하나의 함수를 제공하여 변환 또는 작업을 수행 할 수 있습니다 (예 : 반환뿐만 아니라 대답 인쇄).
또한 종종 정렬에 키로 사용하는 것이 유용합니다.
key=lambda x: x[field]
The effect is to sort by fieldth (zero based remember) element of each item in sequence. For reversing you do not need lambda as it is clearer to use
reverse=True
Often it is almost as easy to do new real function and use that instead of lambda. If people has studied much Lisp or other functional programming, they also have natural tendency to use lambda function as in Lisp the function definitions are handled by lambda calculus.
Lambdas are objects, not methods, and they cannot be invoked in the same way that methods are. for e.g
succ = ->(x){ x+1 }
succ mow holds a Proc object, which we can use like any other:
succ.call(2)
gives us an output = 3
I want to point out one situation other than list-processing where the lambda functions seems the best choice:
from tkinter import *
from tkinter import ttk
def callback(arg):
print(arg)
pass
root = Tk()
ttk.Button(root, text = 'Button1', command = lambda: callback('Button 1 clicked')).pack()
root.mainloop()
And if we drop lambda function here, the callback may only execute the callback once.
ttk.Button(root, text = 'Button1', command = callback('Button1 clicked')).pack()
Another point is that python does not have switch statements. Combining lambdas with dicts can be an effective alternative. e.g.:
switch = {
'1': lambda x: x+1,
'2': lambda x: x+2,
'3': lambda x: x+3
}
x = starting_val
ans = expression
new_ans = switch[ans](x)
Lambdas are anonymous functions (function with no name) that can be assigned to a variable or that can be passed as an argument to another function. The usefulness of lambda will be realized when you need a small piece of function that will be run one in a while or just once. Instead of writing the function in global scope or including it as part of your main program you can toss around few lines of code when needed to a variable or another function. Also when you pass the function as an argument to another function during the function call you can change the argument (the anonymous function) making the function itself dynamic. Suppose if the anonymous function uses variables outside its scope it is called closure. This is useful in callback functions.
In some cases it is much more clear to express something simple as a lambda. Consider regular sorting vs. reverse sorting for example:
some_list = [2, 1, 3]
print sorted(some_list)
print sorted(some_list, lambda a, b: -cmp(a, b))
For the latter case writing a separate full-fledged function just to return a -cmp(a, b)
would create more misunderstanding then a lambda.
It is definitely true that abusing lambda functions often leads to bad and hard-to-read code. On the other hand, when used accurately, it does the opposite. There are already great answers in this thread, but one example I have come across is:
def power(n):
return lambda x: x**n
square = power(2)
cubic = power(3)
quadruple = power(4)
print(square(10)) # 100
print(cubic(10)) # 1000
print(quadruple(10)) # 10000
This simplified case could be rewritten in many other ways without the use of lambda. Still, one can infer how lambda functions can increase readability and code reuse in perhaps more complex cases and functions with this example.
Lambdas allow you to create functions on the fly. Most of the examples I've seen don't do much more than create a function with parameters passed at the time of creation rather than execution. Or they simplify the code by not requiring a formal declaration of the function ahead of use.
A more interesting use would be to dynamically construct a python function to evaluate a mathematical expression that isn't known until run time (user input). Once created, that function can be called repeatedly with different arguments to evaluate the expression (say you wanted to plot it). That may even be a poor example given eval(). This type of use is where the "real" power is - in dynamically creating more complex code, rather than the simple examples you often see which are not much more than nice (source) code size reductions.
참고URL : https://stackoverflow.com/questions/3259322/why-use-lambda-functions
'developer tip' 카테고리의 다른 글
디버그 모드에없는 릴리스 버전의 버그에 대한 일반적인 이유 (0) | 2020.11.21 |
---|---|
스칼라 식별 기능이 있습니까? (0) | 2020.11.21 |
CFLAGS, CCFLAGS, CXXFLAGS-이 변수가 정확히 무엇을 제어합니까? (0) | 2020.11.21 |
스콜 렘은 무엇입니까? (0) | 2020.11.21 |
하나의 채널에서 청취하는 여러 고 루틴 (0) | 2020.11.21 |