2

ifラムダを使用してステートメントを置き換えることができると聞きました。

これはPythonで可能ですか?もしそうなら、どのように?

4

5 に答える 5

6

おそらく、このようなもの(ラムダ計算)について言及していますか?

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"

したがって、それほどきれいでも有用でもありません。しかし、それは機能します。

于 2011-08-16T10:31:04.830 に答える
4

他の人たちと同じように、あなたが何について質問しているのかわかりませんが、推測してみたいと思います。

私は時々、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戻ってきて驚くかもしれませんNone0

于 2011-08-16T10:59:26.310 に答える
3

私は真剣にオフになっているかもしれませんが、これは次のような意味だと思います:

filter(lambda x: x > 0, list_of_values)

list_of_values0 より大きい値を持つ要素を返します。

于 2011-08-16T10:27:09.717 に答える
1

以下は、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"))

更新: 混乱を避け、要点を明確にするために、いくつかの記号を整理します。また、論理演算子のショートカット評価を実装する方法を示すコードを追加しました。

于 2011-08-16T13:30:24.800 に答える
0
if condition:
    do_stuff()
else:
    dont()

(lambda x: do_stuff() if x else dont())(condition)

しかし、あなたが探しているものは明らかではありません。

これはステートメントではないことに注意してください。これは三項演算です。Python では、どちらも という単語を使用するだけです。たとえば、ラムダの「if」ステートメントを参照してください。これは C# で行います。ifif

于 2011-08-16T10:30:50.570 に答える