파이썬의 람다에서 "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.