2016-03-28 85 views
1

我還是新的蟒蛇,我想知道是否有簡化這個功能變成了接近一個班輪方式:應用函數列表的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

FYI,'[拉姆達X:is_big(X),λ-X:is_wide(X),λ-X:is_gray(X)]'相當於'[is_big,is_wide,is_gray]''。 –

+0

@StevenRumbalski對!是的,我知道,但說實話,我其實並不知道。 – Dzhao

回答

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

哦有趣。是否有任何文檔可以用這種簡短的'func(input)for func in filter'的符號來讀取? – Dzhao

+2

你能詳細解說一下短路嗎?第一個False之後不會全部返回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 n附註(不確定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) 

這將打印

in f 
in g 
False 
>>> 
+2

***沒有執行'h'功能。否則,你會在輸出中看到'「in h」'。我在這裏錯過了什麼嗎?除非我在這裏沒有看到真正明顯的東西,否則'g'返回'False'會短路。 – Bahrom

相關問題