27 grudnia 2012

List Comprehensions

Nigdy, tego do końca nie rozumiałem, więc przyszła pora, żeby się w to zagłębić. Budowa tego cuda wygląda następująco:
result = [*transform* *iteration* *filter*]
Pierwsze wykonywana jest iteracja (jakaś pętla), jej wyniki podlegają filtrowaniu, to co przejdzie filtrowanie (opcjonalny mechanizm), może zostać jeszcze przetransformowane, a ostateczny wynik trafia jako element listy result.
Prosty przykład:
print [x for x in range(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Do filtra trafiają wyniki iteracji, jest to konstrukcja "if", jeżeli zwróci True, wartość zostanie przekazana do transformowania. W przykładzie powyżej transformacji nie ma, wynik jest umieszczany jako element listy. Tutaj przykład z użyciem filtra.
def ftr(x):
    if x % 2 == 0:
        return True
    return None

print [x for x in range(10) if ftr(x)]
[0, 2, 4, 6, 8]
Wydaje mi się (nie udało mi znaleźć), że do konstrukcji filtra nie można używać "else" albo "elif", ale zastosowanie warunków logicznych wydaje się wystarczające.
print ['zero' if x == 0 else 'six' if x == 6 else str(x) + '?'
       for x in range(10) if x % 2 == 0 or x % 3 == 0]
['zero', '2?', '3?', '4?', 'six', '8?', '9?']
W przypadku transformacji, możemy skorzystać z instrukcji warunkowej "else". Nie można skorzystać z "elif", ale bez tego można sobie poradzić. Poniżej ekwiwalent transformacji, jaka została użyta, w konstrukcji listy.
def tsfm(x):
    if x == 0:
        return 'zero'
    else:
        if x == 6:
            return 'six'
        else:
            return str(x) + '?'

Brak komentarzy:

Prześlij komentarz