2012-11-29 4 views
5

Czy istnieje sposób na przetestowanie zwrotu funkcji w zrozumieniu listy (lub dyktowania)? Chciałbym uniknąć napisania tego:Zrozumienie listy w języku Python: funkcja testowa return

lst = [] 
for x in range(10): 
    bar = foo(x) 
    if bar: 
    lst.append(bar) 

i zamiast tego wykorzystuję zrozumienie list. Oczywiście, nie chcę pisać:

[foo(x) for x in range(10) if foo(x)] 

, więc?

[foo(x) for x in range(10) if ??? ] 
+1

Dlaczego nie chcesz używać pierwszy sposób? To odpowiedni sposób. –

+0

@Rohit Jain - w zależności od 'foo' może to być kosztowna operacja, której nie chcesz robić dwa razy. – mgilson

+1

@mgilson: I w pierwszym przykładzie robi to tylko raz. –

Odpowiedz

10

Jak o

filter(None, map(foo, range(10))) 

Jeśli nie chcesz zachować listę pośrednią, wymienić map() z itertools.imap(). I z itertools.ifilter(), całość mogła zostać przekształcona w generator.

itertools.ifilter(None, itertools.imap(foo, range(10))) 
+1

Zawsze czułem, że 'filtr' powinien zająć także 1 formularz argumentu ... – mgilson

+1

Lub raczej niż 'imap', możesz użyć funkcji genexp:' filter (None, (foo (x) dla x w zakresie (10))) ' – mgilson

+0

Rzeczywiście niezłe rozwiązanie. – Adrien