파이썬의 람다에서 "if"를 수행하는 방법이 있습니까


358

에서 파이썬 2.6 , 내가하고 싶은 :

f = lambda x: if x==2 print x else raise Exception()
f(2) #should print "2"
f(3) #should throw an exception

이것은 분명히 구문이 아닙니다. ifin 을 수행 lambda할 수 있습니까? 그렇다면 어떻게 수행합니까?

감사


2
람다로 인쇄하거나 올릴 수 없습니다. 람다는 단지 함수일뿐입니다. 대신 함수를 대신 사용할 수 있습니다.
Lennart Regebro

10
난 너의 의견에 반대해. 위의 기능과 같이 목록 / 사전에 넣을 필요가있는 4 가지의 매우 짧은 기능이 필요하므로 반복하여 각 반복에 사용할 기능을 선택할 수 있습니다. 반복하기 전에 여러 줄의 init 코드 대신에 4 줄의 init 코드로 가져올 수 있습니다. 적은 메리 ..
Guy

5
다른 사람들이 코드를 읽고, 해석하고, 이해하고 유지해야 할 때 4 줄의 코드는 훌륭한 해결책이 아닙니다. 또한, 예에서 "인쇄 / 상승"문제는 이것을 람다에서 수행 할 수없고해서는 안되는 것을 보여준다.
S.Lott

@LennartRegebro 람다는 파이썬의 함수가 아니며 표현식 일뿐이므로 할 수없는 많은 것들이 있습니다.
Aaron McMillin

1
@AaronMcMillin Lambdas는 함수입니다. 구문상의 이유로 표현식으로 제한되지만 함수입니다.
Lennart Regebro

답변:


660

찾고있는 구문 :

lambda x: True if x % 2 == 0 else False

하지만 당신은 사용할 수 없습니다 print또는 raise람다있다.


33
파이썬 3에서는 print
recursive를

11
그러나 문제는 " if람다에서 어떻게 사용 합니까?"였습니다. "숫자가 짝수이면 True를 반환하는 람다를 작성하는 가장 좋은 방법은 무엇입니까?"
Robert Rossney

99
그것은 끔찍한 구문입니다. 쉽게 최악의 파이썬 언어 구조이며, 순서가 잘못된 평가에서 Perl 수준의 부조리에 접근합니다. 그러나 그것은 요청되었습니다. 정답에 대한 답변을 진지하게 투표하고 있습니까?
Glenn Maynard

41
"숫자가 짝수인지 알려주는 람다 함수를 어떻게 작성합니까?"라는 질문에 대한 정답입니다. 그러나 OP가 원래 요청한 질문에 대한 정답은 아닙니다. 그러나 당신이 내가 생각한 예를 좋아하지는 않지만 내 게시물 실제로 OP의 질문에 분명히 대답합니다.
Robert Rossney

10
"x % 2 == 0"을 제안하는 사람 (또는 적어도 7 명 이상을 추천하는 의견을 표명 한 사람)이 원래 질문을 읽지 않았다는 것은 고통 스럽습니다.
Glenn Maynard

40

왜 함수를 정의하지 않습니까?

def f(x):
    if x == 2:
        print(x)
    else:
        raise ValueError

이 경우 람다를 사용하는 것이 정당하지 않습니다.


3
print2.6에서는 아직 기능이 아닙니다. :)
Lukáš Lalinský

7
@ Lukáš Lalinský : 여전히 2.x에서 작동합니다. 중복 괄호로 취급됩니다
newacct

24
그의 실제 사용 사례를 모르므로 람다를 사용할 이유가 없다고 말할 수있는 방법이 없습니다.
Glenn Maynard

6
@ Glenn Maynard : 람다, 마침표를 사용할 이유가 거의 없습니다. 변수에 람다를 독립형으로 할당하는 def것은 일반적으로 매우 나쁜 아이디어 (tm)입니다. 단지 def필사자 프로그래머가 그것을 읽고, 해석하고, 이해하고 유지할 수 있도록 사용 하십시오.
S.Lott

17
람다는 합법적으로 많이 사용됩니다. 당신이 아무것도 생각할 수 없다면, 그것은 람다의 잘못이 아닙니다. (물론 나는 문법 자체의 팬이 아니다. 파이썬의 잘 못된 들여 쓰기 구문이 일반 언어와 같은 인라인 함수를 처리 할 수 ​​없다는 사실에 대한 어설픈 해결책이다.)
Glenn Maynard

25

아마 내가 지금까지 쓴 최악의 파이썬 줄 :

f = lambda x: sys.stdout.write(["2\n",][2*(x==2)-2])

x == 2를 인쇄하면

x! = 2이면 당신은 올립니다.


칭찬은,이 사실이 질문에 대한 대답하는 페이지의 유일한 해답이라고 생각
theEpsilon

22

실제로 원하는 경우 람다에서 예외를 쉽게 제기 할 수 있습니다.

def Raise(exception):
    raise exception
x = lambda y: 1 if y < 2 else Raise(ValueError("invalid value"))

이것이 좋은 생각입니까? 내 본능은 일반적으로 오류보고를 람다에서 제외하는 것입니다. None 값을 지정하고 호출자에게 오류를 발생시킵니다. 나는 이것이 본질적으로 악하다고 생각하지는 않는다. 나는 "y if x else z"문법 자체가 더 나쁘다고 생각한다.


1
당신이 나에게 요청하면 발신자에게 그것을 제기하는 것이 아마도 더 예쁜 방법 일 것입니다.
Dominic Bou-Samra 08

아마도 특정 사례에 따라 크게 다를 수 있습니다. 물론 람다를 만든 후 장식 할 수도 있습니다. x = RaiseValueErrorOnNone(x), 경우에 따라 다시.
Glenn Maynard

15

파이썬의 람다는 사용이 허용되는 것과 관련하여 상당히 제한적입니다. 특히, 사업자 등을 제외하고 (키워드를 가질 수 없습니다 and, not,or 자신의 몸, 등).

따라서 예제를 위해 람다를 사용할 수있는 방법은 없지만 (사용할 수 없기 때문에 raise) 기꺼이 인정한다면 ...

f = lambda x: x == 2 and x or None

16
람다의 특정 제한은 문장을 사용할 수 없으며 표현식 만 사용할 수 있다는 것입니다.
Daniel Werner

13

람다 정의에서 else ... if 문을 여러 개 사용할 수 있습니다 .

f = lambda x: 1 if x>0 else 0 if x ==0 else -1

2

여전히 인쇄하려면 다음 모듈을 가져올 수 있습니다

from __future__ import print_function

f = lambda x: print(x) if x%2 == 0 else False

2

논리 연산자를 사용하여 조건부와 같은 것을 가질 수도 있습니다.

func = lambda element: (expression and DoSomething) or DoSomethingIfExpressionIsFalse

논리 연산자에 대한 자세한 내용은 여기를 참조 하십시오.


명확성의 관점에서 파이썬의 철학과는 관련이 없습니다. 논리적으로 동일하지만 if구문은 항상 이것보다 선호됩니다. 조건을 확인 하는 명백한 방법.
0xc0de

감사합니다! 나는 교수가 내가 사용하는 수 없다는 것을 말한다 사람 부과했다고 때문에 제한으로 대학에서 함수형 언어의 작업에서는이 사용 if나는이 발견, 그래서 문을 분명하지 방법을.
빅터 루카스

2

정확히 필요한 것은

def fun():
    raise Exception()
f = lambda x:print x if x==2 else fun()

이제 필요한 방식으로 함수를 호출하십시오.

f(2)
f(3)


0

다음 샘플 코드는 저에게 효과적입니다. 이 질문과 직접 ​​관련이 있는지 확실하지 않지만 다른 경우에는 도움이되기를 바랍니다.

a = ''.join(map(lambda x: str(x*2) if x%2==0 else "", range(10)))

0

시도 해봐:

is_even = lambda x: True if x % 2 == 0 else False
print(is_even(10))
print(is_even(11))

밖:

True
False

0

람다에서 if를 수행하는 쉬운 방법은 목록 이해를 사용하는 것입니다.

람다에서는 예외를 제기 할 수 없지만 Python 3.x에서는 예제와 비슷한 것을 수행하는 방법입니다.

f = lambda x: print(x) if x==2 else print("exception")

또 다른 예:

M이 아니면 0이면 1을 반환

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