Programowanie W Python - Funkcje II
Programowanie W Python - Funkcje II
Funkcje II
mgr inż. Paweł Adamus
Spis treści
Funkcje o zmiennej liczbie argumentów
Zadanie
Zasięg globalny vs zasięg lokalny
Mutable vs immutable - przesyłanie obiektów do funkcji
Mutable
Immutable
Kopiowanie płytkie vs. Głębokie
Płytkie
Głębokie
Funkcje anonimowe
Funkcje o zmiennej liczbie argumentów
Każda funkcja w Pythonie otrzymuje określoną liczbę argumentów, jeśli
została zdefiniowana w znany nam z poprzednich lekcji sposób:
Mimo dodania za pomocą append liczby 465 tylko do listSample2 została ona
dodana do obu list.
Po zapisaniu znaku równości zachodzi przypisanie dokładnego adresu w tle.
Lista jest obiektem typu mutable - co oznacza, z ang. że jest podatna na
zmianę, co oznacza, że możemy zmieniać wartości “oryginału” na nowym
obiekcie.
Immutable
Obiekty immutable, gwarantują nam to, że pod a będzie 4 pomimo
przypisania do b wartości 7.
Gdy stawiamy znak równości = zmieniamy miejsce wskazywania na nowy
adres, na inny obiekt.
Po odwołaniu się do adresów zmiennych poprzez id(k) oraz id(h) wskazują one
ten sam adres, bo 4 i 4 to ten sam obiekt, zachodzi optymalizacja - czyli przy
tych samych wartościach nie są tworzone nowe miejsca w pamięci.
Dopiero gdy zrobimy zmianę tzn. h = 25 to od razu h jest innym obiektem.
Nowa lista b ma więc własny adres pamięci, ale jej elementy już nie.
Dzieje się tak, ponieważ przy płytkim kopiowaniu, zamiast powielania
elementów listy do nowego obiektu, kopiowane są tylko referencje do nich.
Dlatego podczas wprowadzania zmian w oryginalnym obiekcie jest on
odzwierciedlany w kopiowanych obiektach i odwrotnie.
Rodzaje kopii - głębokie
Głębokie kopiowanie - tworzy nowy obiekt złożony, a następnie
rekurencyjnie wstawia do niego kopie obiektów znalezionych w oryginale.
Tworzenie głębokiej kopii jest wolniejsze, ponieważ wykonujesz nowe kopie
dla całej zawartości.
W ten sposób, zamiast powielania adresu złożonych obiektów, tworzymy pełną
kopię wszystkich elementów (prostych i złożonych) oryginalnej listy i
przydzielamy inny adres pamięci dla nowej listy.
Następnie przypisujemy im skopiowane elementy. Aby wykonać głębokie
kopiowanie, musimy zaimportować moduł copy i użyć copy.deepcopy().
Filtr zwraca nam obiekt filtrujący, który możemy zmienić ostatecznie w listę:
Zadanie
Zapoznaj się z funkcjami any() i all().
Do zadań wykorzystaj listy:
lista1 = [1,2,4,6,3]
lista2 = [0,0,0,0,0]
lista3 = [1,1,1,1,1]
Napisz program, który będzie sprawdzał:
Czy dany element jest parzysty
Czy dany element jest nieparzysty
Czy cała lista jest nieparzysta
Czy cała lista jest parzysta