2012-10-03 2 views
20

일부 람다 함수를 작성했는데이를 이해할 수 없었습니다. 파이썬에서 lambda x: x if (x<3) 같은 것을 가질 수있는 방법이 있습니까? lambda a,b: a if (a > b) else b이 정상적으로 작동합니다. 지금까지 lambda x: x < 3 and x or None가 내가 가장 가까운 것으로 보인다.파이썬 람다 (else가있는 경우)

답변

36

람다는 어떤 함수와 마찬가지로 반환 값을 가져야합니다.

lambda x: x if (x<3)x<3이 아닌 경우 반환 할 내용을 지정하지 않았기 때문에 작동하지 않습니다. 기본적으로 기능 None를 반환, 그래서 당신은

lambda x: x if (x<3) else None 

을 할 수 그러나 아마 당신이 찾고있는 것은 if 조건 지능형리스트입니다. 예 :

In [21]: data = [1, 2, 5, 10, -1] 

In [22]: [x for x in data if x < 3] 
Out[22]: [1, 2, -1] 
+0

@ 우분투 - 고마워. 왜 그것을 지정하지 않고 None을 반환해야한다고 생각하는지 확신 할 수 없습니다. – root

+3

함수는 기본적으로 None을 반환하기 때문에 합리적인 가정입니다. 기억해야 할 중요한 점은'lambda x :'다음에 오는 것은 문장이 아닌 * 표현식 *이어야한다는 것입니다. – unutbu

+3

@root 때로는'lambda'를'def lambda (x, y) : return ...'으로 쓰는 것처럼 생각하는 것이 편리하다고 생각합니다. –

6

lambda x: x if x < 3 else None의 무엇이 잘못 되었나요?

+0

나의 이해는 목록 이해력이 문제는 반복을 언급하지 않는이 시나리오 – zinking

+0

에 더 적합하다, 그래서 나는 당신이 무슨 뜻인지 모르겠어요. 당신은 정교 할 수 있습니까? – user4815162342

+0

u r 맞습니다. 아마 추측 일 것입니다. -_- – zinking

1

당신은 항상 조건 검사에 대한 '필터'를 호출 할 수 있습니다. 근본적으로 map()은 iterables가 발생할 때마다 작동해야하므로 선택할 수는 없습니다. 그러나 필터는 선택 범위를 좁히는 데 도움이 될 수 있습니다. 예를 들어 1에서 19까지의 목록을 만들지 만 의 튜플을 만들려면의 짝수 만 제곱합니다.

x = list(range(1,20)) 

y = tuple(map(lambda n: n**2, filter(lambda n: n%2==0,x))) 

print (y)