web-dev-qa-db-ja.com

Pythonのラムダで "if"を実行する方法はありますか

python 2.6では、やりたいことがあります。

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

これは明らかに構文ではありません。 if内でlambdaを実行することは可能ですか?可能ならばどうするのですか?

ありがとう

299
Guy

あなたが探している構文:

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

しかし、ラムダでprintraiseを使うことはできません。

569
Robert Rossney

なぜ関数を定義しただけなのでしょうか。

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

この場合、ラムダを使用することは正当化されません。

37
SilentGhost

おそらく私がこれまでに書いた最悪のpython行:

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

X == 2の場合は、

x!= 2の場合、あなたはレイズします。

21
jimifiki

それがあなたが本当にやりたいことであれば、あなたはラムダで簡単に例外を上げることができます。

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

これは良い考えですか?私の本能は一般に、エラー報告をラムダから除外することです。値がNoneになり、呼び出し側でエラーが発生するようにします。私はこれが本質的に悪だとは思いませんが、「y if x else z」という構文自体はもっと悪いと考えます。

19
Glenn Maynard

Pythonのラムダは、あなたが使うことが許されているものに関してかなり制限があります。具体的には、本文にキーワードを含めることはできません(andnotorなどの演算子を除く)。

ですから、例にラムダを使用することはできません(raiseを使用することはできないので)が、それを認めても構わないのであれば…

f = lambda x: x == 2 and x or None
14
David Wolever

あなたはいくつかのelse ... ifステートメントをあなたのラムダ定義の中で使うことができることに注意してください:

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

このスニペットは役に立ちます:

x = lambda age: 'Older' if age > 30 else 'Younger'

print(x(40))
2

あなたはまだ印刷したい場合は、将来のモジュールをインポートすることができます

from __future__ import print_function

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

あなたが正確に必要なのは

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

今すぐあなたが必要とする方法で関数を呼び出します

f(2)
f(3)

論理演算子を使用して、条件付き演算子のようなものを使用することもできます。

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

あなたはここで論理演算子 についてもっと見ることができます

1
Victor Lucas

それを試してみてください:

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

でる:

True
False
0
Benyamin Jafari

次のサンプルコードは私のために働きます。それがこの質問に直接関連しているかどうかわからないが、それが他の場合に役立つことを願っています。

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