30

これまでに尋ねられている場合は申し訳ありませんが、どこにも表示されませんでした。Pythonの1行のラムダ関数の条件文?

私は、ラムダ関数の中でif文を使用する必要があるシナリオを本質的に見つけました。私はそれがこのように見える必要があるしかし

T = 250 

if (T > 200): 
    rate = 200*exp(-T) 
else: 
    rate = 400*exp(-T) 

return (rate) 

:どのようなことを困難にすることは

通常、私はこのことを書くでしょう(?ザッツでも可能であれば)、理想的には1行のコードである必要があります:

rate = lambda(T) : if (T>200): return(200*exp(-T)); else: return(400*exp(-T)) 

私はラムダ関数の意思決定の外側を取るためになりませんし、各ケースに個別のラムダ関数を持っているより簡単なことを実現するが、ここではその本当に適していません。ラムダ関数は配列に格納され、必要に応じてアクセスされます。各配列要素は特定の「レート」に対応しているため、同じ「レート」の2つの別々の行が混乱します。どんな助けでも大いに感謝されるでしょうし、そうでない場合、他の人からの何らかの確認はうまくいくでしょう:)

+6

私は、私はあなたが1行の機能が必要であることを疑うので、あなたが、1行のラムダ関数を必要とすることを二乗疑う、と私はという名前の関数とは対照的に、あなたはラムダ関数が必要であることを疑います。あなたの関数に 'rate'という名前をつけようとするなら、' lambda'を使う点は何ですか? – DSM

+0

DSMを1回しか+1できないのは残念ですが、わかりやすいように、「ラムダ関数の外で意思決定をするのではなく、最初に正規関数として定義するだけです。通常の関数を配列に格納できます。ラムダには特別なものは何もありません。彼らはもっと機能が限定されていますが、それ以上の機能はありません。 – abarnert

+0

さて私はあなたが名前の関数で行うことができるとは思わなかった1行に収まるように必要な機能、?また、これらの関数は文字列として格納され、通常の関数の処理方法がわからない "eval"を使って評価されます。 –

答えて

54

exp1 if cond else exp2構文を使用してください。

rate = lambda T: 200*exp(-T) if T>200 else 400*exp(-T) 

ラムダ式ではreturnを使用しないでください。

6

はい、ifステートメントの省略形の構文を使用できます。

rate = lambda(t): (200 * exp(-t)) if t > 200 else (400 * exp(-t)) 

あなたはどちらかlambda秒で明示的returnステートメントを使用しないでください。

+2

さらに短くする: 'rate = lambda(t):(200ならば200、それ以外なら400)* exp(-t)' – shahkalpesh

+1

@shahkalpesh質問に答えて説明するのは間違いありません。 –

+2

「ラムダ」の後の括弧も余分です。 – georg

17

これを行うための正しい方法は単純です:

def rate(T): 
    if (T > 200): 
     return 200*exp(-T) 
    else: 
     return 400*exp(-T) 

ここlambdaを使用への利点は絶対にありません。 lambdaは、匿名関数を作成して(式とは対照的に)式で使用することを可能にする唯一のものです。変数にlambdaをすぐに割り当てると、それはもはや匿名ではなく、ステートメント内で使用されるので、コードを読みにくくするだけです。

このように定義されたrate関数は、ラムダ関数とまったく同じ方法で配列に格納したり、渡したり、呼び出したりすることができます。まったく同じになります(デバッグやイントロスペクションなどが簡単にできることを除けば)。


コメントから:私はあなたが名前の関数で行うことができるとは思わなかった1行に収まるように必要な機能、まあ

私は、関数が1行に収まる必要がある理由を想像することはできません。しかし、確かに、あなたは名前付き関数でそれを行うことができます。あなたのインタプリタでこれを試してみてください:

>>> def foo(x): return x + 1 

また、これらの機能は、その後、私は通常の機能に関係するかどうかは確認されませんでした「のeval」を使用して評価された文字列として保存されます。再び

それはなぜあなたがこれをやっている理由として任意の手掛かりなしで100%確認するのは難しいですが、私はあなたが何の理由またはこれに悪い理由がないことを、少なくとも99%確信しています。あなたはあなたがそれらを使用することができ、文字列として周りのPython関数を渡すとevalを呼びたいと思いますほぼすべての時間は、あなたが実際には機能として周りのPython関数を渡し、関数としてそれらを使用したいです。

これは実際にあなたが必要とするオフチャンスです:evalの代わりにexecを使用してください。

あなたが使っているのPythonのバージョンは言及しませんでした。 3.xでは、exec機能はeval機能とまったく同じシグネチャを持っている:2.7で

exec(my_function_string, my_globals, my_locals) 

を、execは声明でない機能がありますが、まだ3と同じ構文でそれを書くことができます.x(あなたが何かに戻り値を割り当てようとしない限り)、それは動作します。以前の2.xの(?2.6の前に、私は思う)あなたの代わりにこのようにそれをしなければならないで

exec my_function_string in my_globals, my_locals 
3

あなたはラムダのポイントを破り、ちょうどべきできたrate = lambda whatever...言う時までは、関数を定義する。しかし、あなたがラムダをしたい場合は、使用「と」可能と「または」

lambda(T): (T>200) and (200*exp(-T)) or (400*exp(-T)) 
1

私はラムダに「IF-THEN」ステートメントを使用することができました。例えば:

eval_op = { 
    '|' : lambda x,y: eval(y) if (eval(x)==0) else eval(x), 
    '&' : lambda x,y: 0 if (eval(x)==0) else eval(y), 
    '<' : lambda x,y: 1 if (eval(x)<eval(y)) else 0, 
    '>' : lambda x,y: 1 if (eval(x)>eval(y)) else 0, 
}