2016-03-28 14 views
1

Hala piton yeniyim ve tek astar yakın bir hale bu fonksiyonu basitleştirmek için bir yol olup olmadığını merak ediyorum:İşlevlerin bir listesini uygulamak için piyonik bir yol?

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 

filtreler liste dönüş boolelerde içinde işlevlerini varsayalım. Temel olarak all(apply input to each filter) gibi bir şey yapabileceğim bir yol var mı?

+5

basar, '[lambda x: is_big (x), lambda x: is_wide (x), lambda x: is_gray (x)] 'eşdeğerdir [is_big, is_wide, is_gray]. –

+0

@StevenRumbalski Right! Evet bunu biliyordum ama dürüst olalım, aslında bunu bilmiyordum. – Dzhao

cevap

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

Çok ilginç. Filtrelerdeki func için func (input) 'un bu kısa el göstergesinde okuyabileceğim herhangi bir belge var mı? – Dzhao

+2

Kısa devre hakkında daha fazla bilgi verir misiniz? İlk False'den sonra False'yi geri döndürmez mi? – Bahrom

+0

@BAH bununla ilgili bazı bilgiler ekledi. – alecxe

5

Evet, all() kullanabilirsiniz:

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

Ayrıca, filtrenin yerleşik kullanabilirsiniz:

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

Ama "başarısız", ilk başarısızlıktan sonra çalışmayı durdurmuyor mu? Demek istediğim için düzenlenmiş cevabımı görün. – Bahrom

+0

@BAH haklı, bu yüzden bir jeneratör ifadesi yerine liste kavramasını kullanmalısınız. – zondo

1

sizin girişten çıkış filtrelenmiş almak için bir liste anlama var
complete_filter = lambda x: all(f(x) for f in filters) 
filtered = filter(complete_filter, input) 

O n yan not (başkalarının ne anlama geldiğinden emin değil (all kısa devre değildir). Aşağıda:

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

*** *** 's işlevi yürütmedi. Aksi halde, çıktıda "h" olarak görürdünüz. Burada bir şey mi eksik? Burada gerçekten bariz bir şey görmediğim sürece, '' '' '' '' '' '' '' false'' döndürerek devredildi. – Bahrom

İlgili konular