[Python] Poprawiona funkcja filter

Programowanie funkcyjne w Pythonie sprawia sporo radości😀.Istnieje wbudowana funkcja filter
przyjmująca dwa parametry : predykat i listę która zwraca listę składającą się z tych elementów, dla których predykat jest prawdziwy. Za pomocą wyrażeń listowych (ang. list comprehension) jej działanie można opisać następująco

filter(f,seq)  := [ x for x in seq if f(x) ]
 

Np.


>> l = filter ( lambda x: x < 10, xrange(100))
>> print l
>> [0,1,2,3,4,5,6,7,8,9]

Trudno jednak używać tej funkcji z bardziej złożonymi warunkami wyboru elementów. Na szczęście rozwiązanie jest proste

import __builtin__
try: 
    all 
except NameError: 
    def all(iterable):
        for element in iterable: 
            if not element:
                return False;
        return True
    __builtin__.all = all 
    all = all

def is_iterable(obj):
    '''@return True if obj is iterable, False otherwise'''
    return hasattr(obj,'__iter__')

def Filter(fncs,seq):
    if not is_iterable(fncs):
        fncs = (fncs,)
    if not is_iterable(seq):
        seq = (seq, )
    return [ x for x in seq if all(f(x) for f in fncs)]

Mały przykład

def is_lt(n): return lambda x : x < n 
def is_gt(n): return lambda x : x > n
def is_le(n): return lambda x : x <= n
def is_ge(n): return lambda x : x >= n

def is_odd(n): return n % 2
def is_even(n): return not is_odd(n)

l = Filter( ( is_gt(10), is_le(20), is_even ) ,xrange(100 ))
print l 
[12, 14, 16, 18, 20]

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s