2016-08-23 9 views
1

私は意味を成し得ない1つのPythonコードに苦労しています。 それは次のようになり、ネストされたラムダ関数についてです:ラムダ関数の翻訳

lambda l: lambda x: x[0] in [None if not i.object else i.object.key for i in l] 

が、私はそれを翻訳しようとしていると私はこの思い付いたしかし、私はこれが正しいとは思わない

def f1(l): 
    def f2(x): 
      for i in l: 
       if not i.object: 
        return None 
       else 
        return x[0] 
+0

翻訳は非常に簡単です。 'lambda :'をお持ちの場合は、 'def name('に置き換える必要があります。 'body'が他の' lambda'の場合は 'return def name ... 'を実行できないので、' def name2 ...;に変更するだけです。 return name2'を返します。 – Bakuriu

答えて

2

ステップ1:

def f1(l): 
    def f2(x): 
     xs = [None if not i.object else i.object.key for i in l] 
     return x[0] in xs 
    return f2 

ステップ2:

def f1(l): 
    def f2(x): 
     xs = [] 
     for i in l: 
      if not i.object: 
       xs.append(None) 
      else: 
       xs.append(i.object.key) 
     return x[0] in xs 
    return f2 
+0

これは間違っています。 'lambda'はボディの値を返します。この場合、外側のラムダは内側のラムダを返しますが、これらの関数は関数を返しません... 'f1'の定義の最後に' f2'を返すべきです。 – Bakuriu

+0

@Bakuriu編集しました、ありがとうございます。 – citaret

1

@citaretから受け入れ答えは結構ですが、これの一の態様は、これまで明らかにされておらず、それがある - それは我々が関数内の機能を持っている理由、理由だけではなくf1(l, x)がありますか?

答えは、関数が正確に1つの引数をとる別の関数への入力として使用される可能性が高いため、関数内でリストlを '取得'したいので、関数を呼び出すときにはxこれは「閉鎖」と呼ばれる)。

したがって、たとえば、私たちは、入力としてリストlを取り、xを受け入れ、xlである場合にTrueを返しl以上の新機能(クロージャ)を返す関数f作成することができます。

f = lambda l: lambda x: x in l 

を私たちは、リストの上に閉鎖される機能f2を作成することができます。

f2 = f([1, 2, 3]) 

今、私たちはをマッピングすることができます別のリストへ:

print map(f2, [2, 3, 4]) 

が生成されます

[True, True, False] 

Pythonのfunctoolsモジュールはこれを助け、おそらく明確インナーラムダの意図を作るためにpartial機能を提供し、すなわち、私たちのようにf3を定義することができます。

f3 = functools.partial(lambda l, x: x in l, [1, 2, 3]) 
print map(f3, [2, 3, 4]) 

クロージャの詳細については、thisを参照してください。