2016-03-28 10 views
1

私はまだのpythonに新たなんだとワンライナーに近いものにこの機能を簡素化する方法があった場合、私は思っていた:機能のリストを適用するPythonic方法?

filters = [lambda x: is_big(x), lambda x: is_wide(x), lambda x: is_gray(x)] 
def filter(input): 
    for func in filters: 
     if(not func(input)): 
      return False 
     else: 
      continue 
    return True 

は、フィルタリストの戻りブール値の関数を想定します。基本的に私はall(apply input to each filter)のような何かをすることができますか?

+5

を出力し、λX:is_big(x)は、ラムダX:is_wide(x)は、ラムダX:is_gray(X)]が 'と等価です'[is_big、is_wide、is_gray]'です。 –

+0

@StevenRumbalski Right!ええ、私はそれを知っていましたが、正直に言えば、私はそれを実際には知りませんでした。 – Dzhao

答えて

6
all(func(input) for func in filters) 
+0

ああ、面白いです。この 'func(input)for func'の短い手書きの表記で、私が読むことができるドキュメンテーションはありますか? – Dzhao

+2

短絡についてもっと詳しく教えてください。最初のFalseの後に 'all'はFalseを返しませんか? – Bahrom

+0

@ BAHはそれに関するいくつかの情報を追加しました。 – alecxe

5

はい、あなたはall()を使用することができます。

result = all(f(input) for f in filters) 
+1

しかし、最初の失敗後に 'all'はすでに実行を停止していないのですか?私の意味は私の編集された答えを見てください。 – Bahrom

+0

@ BAHが正しいので、ジェネレータ式の代わりにリストの理解度を使用する必要があります。 – zondo

1

は、ここにあなたの入力からフィルタリングされた出力を得るために、リストの内包表記です:

filtered = [x for x in input if all(f(x) for f in filters)] 

ます。また、フィルターに内蔵され使用することができます

complete_filter = lambda x: all(f(x) for f in filters) 
filtered = filter(complete_filter, input) 

Oサイドノート(allが短絡していないことを他の人が何を意味しているのかわからない)。下記参照:

def f(): 
    print "in f" 
    return True 

def g(): 
    print "in g" 
    return False 

def h(): 
    print "in h" 
    return True 

filters = [f, g, h] 
print all(fn() for fn in filters) 

これは `、FYI

in f 
in g 
False 
>>> 
+2

*** ***は機能 'h'を実行しませんでした。さもなければ、出力の中で '' h ''で見たでしょう。私はここに何かを逃していますかここで本当に明白なことがない限り、 'g'は' False'を返して短絡しました。 – Bahrom

関連する問題