Python에서 람다를 이해하고이를 사용하여 여러 인수 전달


91

람다에서 찾을 수있는 모든 것을 읽은 후에도 내가 원하는대로하는 방법을 이해하지 못합니다.

모두가 예제를 사용합니다.

lambda x, y : x + y

왜 상태로 둘 필요합니까 xy전과 :? 또한 여러 인수를 반환하는 방법은 무엇입니까?

예를 들면 :

self.buttonAdd_1 = Button(self, text='+', command=lambda : self.calculate(self.buttonOut_1.grid_info(), 1))

이것은 잘 작동합니다. 그러나 다음 코드는 그렇지 않습니다.

self.entry_1.bind("<Return>", lambda : self.calculate(self.buttonOut_1.grid_info(), 1))

오류가 발생합니다.

TypeError : () 인수 없음 (1 개 제공)

답변:


137

왜 ':'앞에 'x'와 'y'를 모두 표시해야합니까?

람다는 (개념적으로) 함수와 동일하기 때문에 인라인으로 작성되었습니다. 귀하의 예는

def f(x, y) : return x + y

같은 이름에 바인딩하지 않고 f.

또한 여러 인수를 반환하는 방법은 무엇입니까?

함수와 같은 방식입니다. 바람직하게는 튜플을 반환합니다.

lambda x, y: (x+y, x-y)

아니면 목록이나 수업 등.

문제는 self.entry_1.bindDemosthenex에서 답변해야합니다.


2
최소한의 정보를 얻으려면 함수형 프로그래밍을 시도해 볼 수 있습니다.이 프로그래밍을 이해하기 시작하면 멋진 경험이 될 수 있으며 아마도 더 나은 프로그래머가 될 것입니다. </ propaganda>
phipsgabler

3
당신은 나의 신이고 당신의 선전은 나의 일용 할 양식입니다. 그러나 튜플에 적용하려고 시도했지만 (train["pred_idx_cos"],train["target"]).apply(lambda x,y: get_result(x, y))작동하지 않는 것 같습니다. 절차 적 프로그래밍의 안개에서 내 영혼을 구해주세요
Monica를위한 Revolucion

@RevolucionforMonica 약간 늦게 답장을했지만 수행 방법에 대한 Python 3 REPL 코드 예제가 있습니다. repl.it/@foobar123/ScarceWhimsicalMainframe
Mass Dot Net

11

bind는 항상 이벤트 매개 변수를 보내려고합니다. 시험:

self.entry_1.bind("<Return>", lambda event: self.calculate(self.buttonOut_1.grid_info(), 1))

매개 변수를 승인하고 사용하지 않습니다.


Omg, 나는 그 일을 너무 오랫동안 해왔고 1 분 만에 작업 답을 얻었습니다. Btw, 왜 일이 콜론 앞에서 진행되는지 아십니까?
Talisin

2
기능 매개 변수 이기 때문 입니다.
phipsgabler

3
"event = None"을 사용하여 기본값을 지정할 수도 있습니다. 그러면 함수를 bind 및 단추에 사용할 수 있습니다.
Demosthenex

5

왜 상태로 둘 필요합니까 xy전과 :?

그것은 함수 정의이고 함수가 어떤 매개 변수를 어떤 순서로 받아들이는지 알아야하기 때문입니다. 표현식을보고 변수 이름을 사용할 수는 없습니다. 그 이름 중 일부는 기존 로컬 또는 전역 변수 값을 사용하고 싶을 수도 있고 그렇게하더라도 순서를 알 수 없기 때문입니다. 그들을 얻을 것으로 예상해야합니다.

오류 메시지는 Tk가 하나의 인수로 람다를 호출하는 반면 람다는 인수를 허용하지 않도록 작성되었음을 의미합니다. 인수가 필요하지 않으면 인수를 받아들이고 사용하지 마십시오. ( Demosthenex에는 코드 가 있습니다. 게시했을 수 있지만 맞았습니다.)


설명 해주셔서 감사합니다. 드디어이 문제에 대해 고심하고있는 것 같습니다.
Talisin

3

왜 ':'앞에 'x'와 'y'를 모두 표시해야합니까?

실제로 어떤 상황에서는 (하나의 인수 만있는 경우) ":"앞에 x와 y를 넣지 마십시오.

>>> flist = []
>>> for i in range(3):
...     flist.append(lambda : i)

하지만 람다의 i는 이름으로 묶일 것입니다.

>>> flist[0]()
2
>>> flist[2]()
2
>>>

당신이 원하는 것과는 다릅니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.