리스트 통합의 람다 함수
두 은 왜 다릅니까?f
및lambda
능은은동?동 일??
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 디컴파일러)를 하면 더 을 볼 수 있을 dis
Python-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
오리지널.lambda
partial
콜 시 오브젝트). ,, 다, 이, 하다.
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
이 리스트의 이해도가X
의lambda
이 기능들은 전혀 관련이 없습니다.두 번째 예는 실제로 다음과 같습니다.
[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
'programing' 카테고리의 다른 글
메서드 선언은 PHP의 상위 메서드와 호환되어야 합니다. (0) | 2022.11.06 |
---|---|
JavaScript에서 변수가 숫자인지 문자열인지 확인합니다. (0) | 2022.10.27 |
Android에서 AMP(apache mysql ph) 실행 (0) | 2022.10.27 |
Mysql 두 날짜 필드 비교 (0) | 2022.10.27 |
생성된 소스 폴더와 함께 Intelij를 사용할 수 없습니다. (0) | 2022.10.27 |