0% found this document useful (0 votes)
11 views17 pages

Programowanie W Python - Funkcje II

Uploaded by

wiktorkozik172
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
11 views17 pages

Programowanie W Python - Funkcje II

Uploaded by

wiktorkozik172
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 17

Programowanie w Python –

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:

 Możliwe jest również zdefiniowanie funkcji, która otrzymuje zmienną liczbę


argumentów:

 Zmienna "reszta" jest tablicą zmiennych, która przechowuje wszystkie


argumenty przekazane funkcji foo poza pierwszymi trzema argumentami. Tak
więc wywołanie foo(1,2,3,4,5) wypisze:
Funkcje o zmiennej liczbie argumentów
 Argumenty do funkcji można przesyłać także za pomocą słów-kluczy, dzięki
czemu kolejność w jakiej zostały podane argumenty nie ma znaczenia:

 Funkcja otrzymuje 3 argumenty. Jeśli dodatkowy argument "akcja" jest dany i


każe dodać liczby, to suma zostanie wypisana. Funkcja wie, że ma zwrócić
wartość pierwszego argumentu, jeśli do argumentu "zwroc" podasz
odpowiednią wartość.
Zadanie
 Napisz 2 funkcje o dowolnych nazwach tak, aby mogły otrzymywać zmienną
liczbę argumentów (3 lub więcej).
 Funkcja pierwsza musi zwracać liczbę dodatkowych argumentów jakie
otrzymała.
 Funkcja druga musi zwracać True, jeśli argument przypisany słowu
kluczowemu magiczna_liczba jest równy 7, oraz False w przeciwnym razie.
Zasięg globalny vs zasięg lokalny
 Zmienna lokalna - ma zakres działania w funkcji w której została stworzona.
Każdy parametr jest zmienna lokalną istniejącą w ciele funkcji. Gdy wrócimy
do zasięgu globalnego (wychodząc z ciała funkcji) nasza zmienna lokalna nie
istnieje.

 Zmienna globalna - tworzona jest poza funkcją i jest dostępna wszędzie,


możemy ją nadpisać zmienną lokalną. W przypadku nadpisania zmiennej
globalnej, zmienna lokalna jest wtedy ważniejsza.
Zasięg globalny vs zasięg lokalny
 Gdy chcemy dokonać zmiany wartości globalnej używamy słówka global -
zasięg globalny. Od tej pory będziemy mogli operować na globalnej wartości.
Mutable vs immutable - przesyłanie obiektów
do funkcji
 Immutable – niezmienne
 Mutable – zmienne

 Obiekt to tak naprawdę każda zmienna w Python, która ma więcej


możliwości:
 Można na nim wywoływać „funkcje”
 Może mieć więcej niż jedną wartość
 Przykład, że na zmiennej a możemy sprawdzić jej długość bitów:

 Przyklady obiektow immutable: bool, int, float, tuple, str


Mutable
 Przykład obiektu mutable (zmiennego):

 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.

 Przesyłając mutable zachodzi zmiana na oryginale, natomiast przesyłając


immutable niezmienne np. int, bool - nie zachodzi zmiana w oryginale.
Kopiowanie płytkie vs. głębokie
 Trzeba uważać na „złośliwą” listę, którą przesyłamy do funkcji:

 Domyślnie obiekt listowy jest mutable - podatny na zmianę.


 Aby mieć pewność, że w obiekcie nie dojdzie do jakiejkolwiek zmiany powinniśmy
utworzyć kopię listy.
 Gdy nie zrobimy kopii operujemy na tym samym obiekcie, tylko pod inną nazwą.
 Kopia to gwarancja, że zmiana zostanie zrobiona tylko na kopii (oryginał
będzie bez zmian).
 Korzystamy z niej, gdy zależy nam, aby nie doszło do zmiany na argumentach które
przesyłamy.
Rodzaje kopii - płytkie
 Płytkie kopiowanie - tworzy nowy obiekt złożony, a następnie (w możliwym
zakresie) wstawia do niego referencje do obiektów znalezionych w oryginale.
Mamy trzy różne sposoby na płytkie kopiowanie:

 Wszystkie powyższe listy zawierają tutaj te same wartości, co oryginalna


lista:

 Różnią się jednak między sobą adresem pamięci:


Rodzaje kopii - płytkie
 Oznacza to, że tym razem obiekt każdej listy ma swój własny, niezależny
adres pamięci.
 Teraz przechodzimy do bardziej interesującej części — jeśli oryginalna lista
jest obiektem złożonym (np. listą innych list), to po płytkim kopiowaniu nowe
elementy nadal odwołują się do oryginalnych elementów listy.
 Jeśli więc zmodyfikujesz elementy zmienne (np. listy), zmiany zostaną
odzwierciedlone w oryginalnych elementach. Spójrzmy na poniższy przykład,
aby lepiej to zrozumieć:
Rodzaje kopii - płytkie
 Jak widać w powyższym przykładzie, gdy modyfikujemy wewnętrzne
elementy listy na nowej liście, to są one również aktualizowana na
oryginalnej liście, ponieważ a[0] i b[0] nadal wskazują na ten sam adres
pamięci (oryginalnej listy).

 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().

 Jak widać powyżej, nie ma to wpływu na oryginalną listę.


Funkcje anonimowe
 Funkcje anonimowe - funkcje bez nazwy, mogą przyjmować argumenty.
Używane są najczęściej do jednorazowych i szybkich operacji na kodzie. Aby
stworzyć taką funkcję należy skorzystać ze słówka lambda.
 Stworzyliśmy listę liczb parzystych i nieparzystych. Chcemy przefiltrować
liczby i wybrać te, które są parzyste.
 Najlepiej skorzystać z funkcji o nazwie filtr (z ang. filter) - w której jako
pierwszy argument podajemy funkcję, określamy jakie argumenty będzie
przyjmować nasza funkcja, piszemy warunek jaki ma spełniać funkcja oraz
skąd ma pobrać dane:

 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

You might also like