programing

리스트 통합의 람다 함수

bestcode 2022. 10. 27. 21:59
반응형

리스트 통합의 람다 함수

두 은 왜 다릅니까?flambda능은은동?동 일??

f = lambda x: x*x
[f(x) for x in range(10)]

그리고.

[lambda x: x*x for x in range(10)]

, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아type(f) ★★★★★★★★★★★★★★★★★」type(lambda x: x*x)같은 타입을 반환한다.

첫 번째 함수는 단일 람다 함수를 생성하여 10번 호출합니다.

두 번째는 함수를 호출하지 않습니다.10가지 람다 함수를 생성합니다.이 모든 것이 리스트에 포함됩니다.필요한 첫 번째와 동등하게 하려면:

[(lambda x: x*x)(x) for x in range(10)]

또는 더 나은 방법:

[x*x for x in range(10)]

이 질문은 "유명한" Python 구문과 "명백한" Python 구문의 매우 불쾌한 부분, 즉 무엇이 우선인지, lambda인지, 또는 목록 이해의 for인지를 다루고 있습니다.

OP의 목적은 0에서 9까지의 제곱 리스트를 생성하는 것이었다고 생각하지 않습니다.그렇다면 더 많은 솔루션을 제공할 수 있습니다.

squares = []
for x in range(10): squares.append(x*x)
  • 이것이 명령어 구문의 좋은 방법입니다.

하지만 그게 중요한게 아니야.포인트는 W(hy)입니다.TF는 이 애매한 표현이 그렇게 직관에 어긋나나요?그리고 마지막으로 당신에게 바보 같은 사건이 있으니, 제 대답을 너무 일찍 무시하지 마세요(취업 면접에서 봤어요.

OP가 파악한 결과 람다 목록이 반환되었습니다.

[(lambda x: x*x) for x in range(10)]

이는 물론 제곱 함수의 10개 복사본에 불과합니다. 다음을 참조하십시오.

>>> [lambda x: x*x for _ in range(3)]
[<function <lambda> at 0x00000000023AD438>, <function <lambda> at 0x00000000023AD4A8>, <function <lambda> at 0x00000000023AD3C8>]

람다의 메모리 주소는 모두 다릅니다!

물론 이 표현식의 "최적"(haha) 버전을 사용할 수 있습니다.

>>> [lambda x: x*x] * 3
[<function <lambda> at 0x00000000023AD2E8>, <function <lambda> at 0x00000000023AD2E8>, <function <lambda> at 0x00000000023AD2E8>]

봤지? 같은 람다 세 번이야

로 저는 _for★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★x lambda을 사용법

왜 구문 우선순위가 아닌지에 대한 논의는 생략하겠습니다.그것은 모두 다음과 같은 의미를 가지고 있습니다.

[lambda x: (x*x for x in range(10))]

될 수 .[[0, 1, 4, ..., 81]] , 「」[(0, 1, 4, ..., 81)]또는 가장 논리적인 것으로 생각되는 것은, 이것은list - 1 소 - - agenerator값을 반환합니다.그렇지 않을 뿐이지, 언어는 이런 식으로 돌아가지 않는다.

하지만 만약...

이 그림자를 될까요?for변수, 그리고 이 변수를 사용하여lambda

그럼 똥이 터지겠지이것 좀 봐.

[lambda x: x * i for i in range(4)]

물론 다음과 같습니다.

[(lambda x: x * i) for i in range(4)]

단, 다음을 의미하는 것은 아닙니다.

[(lambda x: x * 0), (lambda x: x * 1), ... (lambda x: x * 3)]

이건 미친 짓이야!

목록 이해의 람다는 이 이해의 범위에 대한 종결이다.어휘적 종결자, 그래서 그들은 '그것'을i평가했을 때의 가치가 아니라 참조를 통해서!

이 표현은 다음과 같습니다.

[(lambda x: x * i) for i in range(4)]

대략 다음과 같습니다.

[(lambda x: x * 3), (lambda x: x * 3), ... (lambda x: x * 3)]

디컴파일러 python 디컴파일러)를 하면 더 을 볼 수 있을 disPython-VM은 Python-VM을 사용합니다.이치노

그럼 이번에는 어떻게 요?list말말?????????????.i을 다른 lambda리스트 이해식 내에서 호출됩니다.

이전:

>>> a = [(lambda x: x * i) for i in (1, 2)]
>>> a[1](1)
2
>>> a[0](1)
2

그 후:

>>> a = [(lambda y: (lambda x: y * x))(i) for i in (1, 2)]
>>> a[1](1)
2
>>> a[0](1)
1

=(외측 람다 변수)가 . =i이 더 i i 、 、 、 、 , 、 , 、 , 、 , 。y그러면 어느 마녀가 어느 마녀인지 모두 알 수 있습니다.)

2019-08-30 편집:

@coller @colidp @coleridp @coler @coler pid @ 。목록 이해 "루프 변수" 값은 오브젝트 안에 "포함"될 수 있습니다.이 값은 오브젝트에 적절한 타이밍에 액세스 하는 것이 중요합니다.의 '부분에서는 '이후'를 '이후'로 합니다.lambda합니다.i 방법WAT'은 'WAT'의 값을 i a partial오리지널.lambdapartial콜 시 오브젝트). ,, 다, 이, 하다.

2 이후:

>>> from functools import partial
>>> a = [partial(lambda y, x: y * x, i) for i in (1, 2)]
>>> a[0](2), a[1](2)
(2, 4)

좋아요, 하지만 아직 약간의 반전이 있어요!리더를 로) partial)의 이름을 변경합니다.

2.5 이후:

>>> a = [partial(lambda coef, x: coef * x, coef=i) for i in (1, 2)]
>>> a[0](1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: <lambda>() got multiple values for argument 'coef'

와트?

>>> a[0]()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: <lambda>() missing 1 required positional argument: 'x'

잠깐... 논쟁의 수를 1로 바꾸고 '너무 많다'에서 '너무 적다'로 바꾸는 거야?

진짜 WAT가 아니라서 우리가 합격하면coef로.partial이렇게 하면 키워드 인수가 되기 때문에 위치 뒤에 와야 합니다.x다음과 같은 인수:

3 이후:

>>> a = [partial(lambda x, coef: coef * x, coef=i) for i in (1, 2)]
>>> a[0](2), a[1](2)
(2, 4)

네스트 람다보다 마지막 버전을 더 좋아하지만 각자 자기들만의...

2020-08-18 편집:

코멘터 dasWesen 덕분에 이 내용은 Python 문서에서 다루어지고 있다는 것을 알게 되었습니다.https://docs.python.org/3.4/faq/programming.html#why-do-lambdas-defined-in-a-loop-with-different-values-all-return-the-same-result - 목록 통합 대신 루프를 다루지만 아이디어는 같습니다. - 글로벌 변수 액세스 또는 로컬 변수 이외의 액세스입니다.e 람다 함수.디폴트 인수 값(모든 함수에서처럼)을 사용하는 해결책도 있습니다.

>>> a = [lambda x, coef=i: coef * x for i in (1, 2)]
>>> a[0](2), a[1](2)
(2, 4)

이 방법으로 coef 값은 함수 정의 시 i 값에 결합됩니다(James Powell의 "Top To Down, Left To Right" 참조). 이 또한 가변 기본값을 피하는 이유를 설명합니다.

큰 차이는 첫 번째 예가 실제로 람다를 호출한다는 것입니다.f(x)단, 두 번째 예에서는 그렇지 않습니다.

첫 번째 예는 다음과 같습니다.[(lambda x: x*x)(x) for x in range(10)]두 번째 예시는 다음과 같습니다.[f for x in range(10)].

첫 번째 거

f = lambda x: x*x
[f(x) for x in range(10)]

실행하다f()범위내의 각 값에 대해서, 그렇게 합니다.f(x)각 값에 대해

두 번째 것

[lambda x: x*x for x in range(10)]

목록의 각 값에 대해 람다를 실행하므로 이러한 모든 함수를 생성합니다.

사람들은 좋은 대답을 했지만 내 의견에서 가장 중요한 부분을 언급하는 것을 잊었다.두 번째 예에서는X이 리스트의 이해도가Xlambda이 기능들은 전혀 관련이 없습니다.두 번째 예는 실제로 다음과 같습니다.

[Lambda X: X*X for I in range(10)]

의 내부 반복range(10)목록에 유사한 람다 함수를 10개만 생성합니다(10개의 개별 함수이지만 완전히 유사함 - 각 입력의 거듭제곱 2를 반환함).

한편, 첫 번째 예는 완전히 다르게 동작합니다. 왜냐하면 반복 DO의 X가 결과와 상호 작용하기 때문입니다. 각 반복에 대해 값은 다음과 같습니다.X*X그래서 그 결과는[0,1,4,9,16,25, 36, 49, 64 ,81]

다른 답변은 맞지만 나중에 실행할 있는 각각 다른 파라미터를 가진 함수 목록을 작성하려고 하면 다음 코드가 이를 수행합니다.

import functools
a = [functools.partial(lambda x: x*x, x) for x in range(10)]

b = []
for i in a:
    b.append(i())

In [26]: b
Out[26]: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

예를 들어, 각 기능의 리스트가 필요한 경우, 예를 들면, 다른 것을 인쇄하는 것이 편리하다는 것을 알았습니다.

import functools
a = [functools.partial(lambda x: print(x), x) for x in range(10)]

for i in a:
    i()

언급URL : https://stackoverflow.com/questions/6076270/lambda-function-in-list-comprehensions

반응형