if
ラムダを使用してステートメントを置き換えることができると聞きました。
これはPythonで可能ですか?もしそうなら、どのように?
if
ラムダを使用してステートメントを置き換えることができると聞きました。
これはPythonで可能ですか?もしそうなら、どのように?
おそらく、このようなもの(ラムダ計算)について言及していますか?
If = lambda test, x, y: test(x, y)
True = lambda x, y: x
False = lambda x, y: y
次のように使用できます...
# I guess you have to convert them sometimes... oh well
C = lambda b: [False, True][b]
x = If(C(2 > 3), "Greater", "Less")
print(x)
# "Less"
しかし今、物事は崩壊し始めています...
If(C(2 > 3), print("Greater"), print("Less"))
# Invalid syntax unless you use
# from __future__ import print_function
# And if you do, it prints both!
# (Because python has eager evaluation)
# So we could do
True = lambda x, y: x()
False = lambda x, y: y()
# And then
If(C(2 > 3), lambda:print("Greater"), lambda:print("Less"))
# "Less"
したがって、それほどきれいでも有用でもありません。しかし、それは機能します。
他の人たちと同じように、あなたが何について質問しているのかわかりませんが、推測してみたいと思います。
私は時々、API 呼び出しの結果を処理するちょっとハックな方法でラムダを使用します。
たとえば、API 呼び出し結果の要素は、整数として必要な数値文字列である必要がありますが、場合によっては別の値を返すとします。
文字列が数字で構成されている場合、文字列を整数に変換するラムダを定義できます。
lambda x: x and x.isdigit() and int(x) or None
if
これはステートメントを回避していますが、 のせいではなくlambda
、関数と同じことができます:
def f(x):
return x and x.isdigit() and int(x) or None
アップデート
Paul McGuire の厚意によるバグの少ないハック:
lambda x: int(x) if x and x.isdigit() else None
つまり、ラムダint('0')
と同等の戻り値として、必要なときにFalse
戻ってきて驚くかもしれませんNone
0
私は真剣にオフになっているかもしれませんが、これは次のような意味だと思います:
filter(lambda x: x > 0, list_of_values)
list_of_values
0 より大きい値を持つ要素を返します。
以下は、if ステートメントも三項演算子も使用せず、条件付き実行メカニズムとして機能する、Smalltalk 言語コアに着想を得たちょっとしたトリックです。:-)
#!/usr/bin/env python
class ATrue:
def ifThen(self,iftrue): iftrue()
def ifThenElse(self,iftrue,iffalse): return iftrue()
def andThen(self,other): return other()
def orElse(self,other): return self
class AFalse:
def ifThen(self,iftrue): pass
def ifThenElse(self,iftrue,iffalse): return iffalse()
def andThen(self,other): return self
def orElse(self,other): return other()
def echo(x): print x
if __name__=='__main__':
T = ATrue()
F = AFalse()
x = T # True
y = T.andThen(lambda: F) # True and False
z = T.orElse(lambda: F) # True or False
x.ifThenElse( lambda: echo("x is True"), lambda: echo("x if False"))
y.ifThenElse( lambda: echo("y is True"), lambda: echo("y if False"))
z.ifThenElse( lambda: echo("z is True"), lambda: echo("z if False"))
更新: 混乱を避け、要点を明確にするために、いくつかの記号を整理します。また、論理演算子のショートカット評価を実装する方法を示すコードを追加しました。
if condition:
do_stuff()
else:
dont()
は
(lambda x: do_stuff() if x else dont())(condition)
しかし、あなたが探しているものは明らかではありません。
これはステートメントではないことに注意してください。これは三項演算です。Python では、どちらも という単語を使用するだけです。たとえば、ラムダの「if」ステートメントを参照してください。これは C# で行います。if
if