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


358

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

これは明らかに構文ではありません。ifin を実行することは可能ですか、実行するlambda場合はどうすればよいですか?

ありがとう


2
ラムダで印刷したりレイズしたりすることはできません。ラムダは単なる関数です。代わりに常に関数を使用できます。
Lennart Regebro、2009年

10
私はあなたに同意しません。上記のような4つの異なる非常に短い関数がリスト/辞書に配置される必要があるので、それらを繰り返し、各反復で使用する関数を選択できます。initコードだけの多くの行の代わりに、反復の前に、それ自体を4行のinitコードにまで下げることができます。より少ない楽しみ..

5
4行のコードは、他の人がコードを読み、解釈し、理解し、維持しなければならない場合、賞賛に値する解決策ではありません。さらに、この例の「印刷/レイズ」の問題は、ラムダでは実行できないこと、および実行すべきでないことを示しています。
S.Lott、2009年

@LennartRegebroラムダはpythonの関数ではなく、単なる式です。そのため、それらを使用して実行できないことがたくさんあります。
アーロンマクミリン

1
@AaronMcMillin Lambdasは関数です。構文上の理由から式に制限されていますが、それらは関数です。
Lennart Regebro

回答:


660

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

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

しかし、あなたが使用することはできませんprintraiseラムダインチ


33
python 3では、printを使用できます
再帰的

11
もちろん、問題は「ifラムダでどのように使用するのか?」「数値が偶数の場合にTrueを返すラムダを記述する最良の方法は何ですか?」ではありません。
Robert Rossney、2009年

99
それは恐ろしい構文です-簡単に最悪のPython言語構造であり、順不同の評価でPerlの不条理レベルに近づいています-しかし、それは求められたものです。正解を真剣に投票していますか?
Glenn Maynard、

41
これは、「数値が偶数かどうかを通知するラムダ関数をどのように書くのですか?」という質問に対する正しい答えです。ただし、OPが最初に求めた質問に対する正しい答えではありません。私が考案した例がどれほど嫌いでも、私の投稿実際にOPの質問に明確に答えています。
Robert Rossney、2009年

10
「x%2 == 0」を提案する人、またはそれを推奨するコメントに投票して少なくとも7人が投票する人が、元の質問すら読んでいないことは明らかです。
Glenn Maynard、

40

なぜ関数を定義しないのですか?

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

この場合、ラムダを使用する正当な理由はありません。


3
print2.6ではまだ機能していません。:)
ルーカス・ラリンズキー

7
@LukášLalinský:2.xでも動作します。これは、冗長な括弧のペアとして扱われる
newacct

24
あなたは彼の実際のユースケースを知らないので、ラムダを使用する理由がないと言うことはできません。
Glenn Maynard、

6
@Glenn Maynard:ラムダピリオドを使う理由はほとんどありません。ラムダを変数に代入することは、代用として、def一般的に非常に悪い考え(tm)です。ただのdef死すべきプログラマーがそれを読み、解釈し、理解し、維持できるようにするだけです。
S.Lott、2009年

17
ラムダの正当な使用法はたくさんあります。何も考えられない場合は、ラムダのせいではありません。(もちろん、私は構文自体のファンではありません。Pythonの概念が不十分なインデント構文は、通常の言語のようなインライン関数を処理できないという事実に対する不器用な回避策です。)
Glenn Maynard

25

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

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、

おそらく、それは特定のケースに大きく依存します。もちろん、ラムダを作成した後で装飾することもできます。 x = RaiseValueErrorOnNone(x)、場合によっては、再び。
Glenn Maynard、

15

Pythonのラムダは、何を使用できるかに関してかなり制限があります。具体的には、(のような事業者以外の任意のキーワードを持つことができないandnotor自分の体で、など)。

したがって、ラムダを例に使用する方法はありません(使用できないためraise)が、それを認めてもかまわない場合…次のように使用できます。

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

16
lambdaの特定の制限は、ステートメントの使用は許可されておらず、式のみが許可されていることです。
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

論理演算子の詳細については、こちらをご覧ください


明快さという点では、Pythonの哲学とは一致しません。論理的には同等ですが、if構文は常にこれよりも優先されます。条件をチェックする明白な方法。
0xc0de 2018

ありがとうございました!大学の関数型言語の仕事でこれを使用したのは、教授が課した制限のため、私はifステートメントを使用できないと言ったので、これは明白な方法ではないことがわかりました。
ビクタールーカス



0

次のサンプルコードは私にとってはうまくいきます。それがこの質問に直接関連しているかどうかはわかりませんが、他のいくつかのケースで役立つことを願っています。

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


0

ラムダでifを実行する簡単な方法は、リスト内包表記を使用することです。

ラムダで例外を発生させることはできませんが、これはPython 3.xで例に近いことを行う方法です。

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

もう一つの例:

Mの場合は1を、それ以外の場合は0を返します。

f = lambda x: 1 if x=="M" else 0
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.