[ Pobierz całość w formacie PDF ]
z listy wejściowej, dla których wywołanie funkcja(element)zwróci wartość prawdziwą. Oto przykład obliczania
liczb pierwszych:
>>> def f(x): return x % 2 != 0 and x % 3 != 0
...
>>> filter(f, range(2, 25))
[5, 7, 11, 13, 17, 19, 23]
map(funkcja, sekwencja) wywołuje funkcja(element)dla każdego elementu listy wejściowej i zwraca listę
wartości zwróconych przez funkcja. Na przykład, aby obliczyć sześcian dla każdego elementu z ciągu liczb:
>>> def sześcian(x): return x*x*x
...
>>> map(szescian, range(1, 11))
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
Przekazana może zostać więcej, niż jedna sekwencja funkcja funkcja musi mieć wtedy tyle argumentów, ile
zostało podanych sekwencji i jest wywoływana z poszczególnym elementem z każdej sekwencji wejściowej (lub
z None jeśli któraś z nich jest krótsza od innej). Jeżeli None został przekazany zamiast pierwszego argumentu
map, funkcja zwracająca swoje argumenty jest zastępowana.1
Składając te dwa przypadki zauważmy, iż map(None, lista1, lista2) jest wygodnym sposobem przeksz-
tałcenia pary list w listę par. Na przykład:
>>> sekw = range(8)
>>> def kwadrat(x): return x*x
...
>>> map(None, sekw, map(kwadrat, sekw))
[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25), (6, 36), (7, 49)]
reduce(funkcja, sekwencja) zwraca pojedynczą wartość, która powstała w wyniku: wywołania dwu-
parametrowej funkcji funkcja dla dwóch pierwszych elementów sekwencji, potem dla wyniku tego działania i
następnego elementu sekwencji itd. Na przykład, aby obliczyć sumę liczb od 1 do 10:
>>> def dodaj(x,y): return x+y
...
>>> reduce(dodaj, range(1, 11))
55
Jeśli istnieje tylko jeden element w sekwencji, zwracana jest jego wartość. Jeżeli sekwencja jest pusta, zgłaszany
jest wyjątek.
Można przekazać początkową wartość jako trzeci argument wywołania. W tym przypadku wartość ta jest
zwracana, gdy sekwencja jest pusta. Funkcja jest stosowana dla wartości początkowej i pierwszego elementu
sekwencji, a następnie wynik tej operacji stanowi argument wejściowy wraz z następnym elementem itd. Oto
przykład:
1
Nic z tego nie rozumiem. Taki ze mnie tłumacz. . . (przyp. tłum.)
5.1. Więcej o listach 31
>>> def suma(sekw):
... def dodaj(x,y): return x+y
... return reduce(dodaj, sekw, 0)
...
>>> suma(range(1, 11))
55
>>> suma([])
5.1.4 Rozszerzenia składni list
Są one spójnym sposobem na tworzenie list bez odwoływania się domap(),filter()i/lublambda. Przed-
stawione poniżej definicje list często są bardziej przejrzyste niż listy tworzone za pomocą w.w. konstrukcji.
Każda z rozszerzonych konstrukcji składa się z wyrażenia, po którym następuje klauzula for, potem zero lub
więcej klauzuli for lub if. W rezultacie otrzymujemy listę powstałą w wyniku wyliczenia wyrażenia w kon-
tekście klauzulforiif, które po nim występują. Jeśli wyrażenie ma typ krotki, musi zostać objęte nawiasami
okrągłymi.
>>> owoce = [ banan , jerzyna , owoc pasji ]
>>> [uzbrojenie.strip() for bron in owoce]
[ banan , jerzyna , owoc pasji ]
>>> wek = [2, 4, 6]
>>> [3*x for x in wek]
[6, 12, 18]
>>> [3*x for x in wek if x > 3]
[12, 18]
>>> [3*x for x in wek if x
[]
>>> [{x: x**2} for x in wek]
[{2: 4}, {4: 16}, {6: 36}]
>>> [[x,x**2] for x in wek]
[[2, 4], [4, 16], [6, 36]]
>>> [x, x**2 for x in wek] # błąd - dla krotek wymaga się nawiasów okrągłych
File "", line 1
[x, x**2 for x in wek]
^
SyntaxError: invalid syntax
>>> [(x, x**2) for x in wek]
[(2, 4), (4, 16), (6, 36)]
>>> wek1 = [2, 4, 6]
>>> wek2 = [4, 3, -9]
>>> [x*y for x in wek1 for y in wek2]
[8, 6, -18, 16, 12, -36, 24, 18, -54]
>>> [x+y for x in wek1 for y in wek2]
[6, 5, -7, 8, 7, -5, 10, 9, -3]
(SyntaxError: zła składnia)
5.2 Instrukcjadel
Jednym ze sposobów usunięcia elementu z listy za pomocą podania jego indeksu zamiast jego wartości jest in-
strukcja del. Można ją również użyć do usunięcia wielu elementów poprzez usunięcie wycinka (robiliśmy to
wcześniej poprzez przypisanie pustej listy do wycinka). Na przykład:
32 Rozdział 5. Struktury danych
>>> a
[-1, 1, 66.6, 333, 333, 1234.5]
>>> del a[0]
>>> a
[1, 66.6, 333, 333, 1234.5]
>>> del a[2:4]
>>> a
[1, 66.6, 1234.5]
delmoże zostać użyte do usuwania zmiennych:
>>> del a
Próba użycia zmiennejapo takiej operacji, powoduje zgłoszenie błędu (chyba, że będzie to instrukcja przypisania
wartości do tej zmiennej). Inne zastosowaniadelzostaną przedstawione pózniej.
5.3 Listy niemutowalne i sekwencje
Przekonaliśmy się już, że listy i napisy mają wiele wspólnych właściwości, np. indeksacja o operacje wycinania.
Są to dwa przykłady typów sekwencyjnych. Ze względu na to, że Python jest językiem rozszerzalnym2, można
dodawać inne typy danych. Istnieje jeszcze jeden typ danych sekwencyjnych: krotka3.
Taka lista składa się z pewnej liczby elementów oddzielonych przecinkami, np.:
>>> t = 12345, 54321, hello!
>>> t[0]
12345
>>> t
(12345, 54321, hello! )
>>> # Krotki można zagnieżdżać:
... u = t, (1, 2, 3, 4, 5)
>>> u
((12345, 54321, hello! ), (1, 2, 3, 4, 5))
[ Pobierz całość w formacie PDF ]