Kategorie
Python

Operatory porównania: „is” kontra „==”


Czytniki e-book - sprawdź na Ceneo


Jaka jest różnica pomiędzy == oraz is. Zróbmy mały teścik.

Wynik powyższego snippetu nie jest zaskakujący.

b i a wskazują na ten sam obiekt w pamięci, zatem każda zmiana w a lub b dokonywana jest na tym samym obiekcie. Dlatego też a is b oraz a == b zwracają True.

Lista c jest nowym obiektem stworzonym z kopii a. Wskazuje na inny obszar pamięci zatem a is c zwraca False. Ponieważ a i c mają taka samą zawartość a == c zwraca True. Podsumowując kolokwialnie można stwierdzić, że operator == sprawdza czy obiekty sa takie same, natomiast operator is czy obiekty są identyczne(lub czy obiekt jest tym samym obiektem).


Czytniki e-book - sprawdź na Ceneo


Kategorie
Python

Parametry opcjonalne: *args, **kwargs


 


Funkcje napisane w języku Python mają możliwość akceptowania opcjonalnych parametrów. Przyjrzyjmy się poniższemu snippetowi.

Jeżeli wywołamy tę funkcję w następujący sposób:

Otrzymamy następujący wynik:

Argumenty pozycyjne zostały skumulowane w tuplu *args, a argumenty nazwane w słowniku **kwargs. Co się stanie gdy wywołamy tę funkcję bez argumentów:

Nic się nie wydarzyło, błędu też nie ma. Więc argumenty *args i **kwargs nie są wymagane. Dodajmy dodatkowy argument arg_1 i wywołajmy tę funkcję z poprzednimi argumentami.

Z tupla *args znikneła nam 1. Wypiszmy brakujący arg_1 i wywołajmy funkcję jeszcze raz.

Co się stanie jak wywołamy funkcję bez argumentów?

No tak arg_1 jest wymagany. Potestujmy tę funkcję i zobaczmy do jakich dojdziemy wniosków.

A więc w Pythonie istotna jest kolejność argumentów pierwszy od lewej przypisany jest do arg_1 kolejne pozycyjne są umieszczane w tuplu *args a argumenty nazwane są kumulowane w słowniku **kwargs. Jeżeli odwrócimy w jakiś sposób kolejność argumentów zostanie zwrócony SyntaxError. Warto wspomnieć, że nazwy *args oraz **kwargs to tylko przyjęta konwencja równie dobrze możesz użyć *positional_arguments, **named_arguments. Ważne aby zapamiętać, że prefix * oznacza tuple a prefix ** słownik.

 


Podzespoły na Ceneo.pl


Kategorie
Python

Lambda : Anonimowe funkcje w Pythonie


 


W języku Python lambda jest słowem kluczowym dzięki któremu możemy deklarować funkcje anonimowe. W poprzednich wpisach wykorzystałem domknięcia i callable do obliczania potęgi, w przypadku lambdy może to wyglądać tak

Lambdy można domknąć

Lambda możne również zwrócić lambdę. Jest to karkołomna konstrukcja ale jak najbardziej prawidłowo działająca

Kiedy stosować lambdę? Np. w metodach map, filter, reduce i innych przyjmujących funkcję lub wtedy gdy tą funkcję wykonujemy tylko raz.


Podzespoły na Ceneo.pl


Kategorie
Python

Callable: Obiekt który zachowuje się jak funkcja


 

 


W języku Python wszystkie funkcje są obiektami, ale na odwrót już nie. Jednak Python oferuje nam możliwość traktowania obiektów jak funkcję. Aby instancja klasy stała się takim obiektem wystarczy stworzyć metodę __call__. W poprzednim wpisie pokazałem jak wykorzystać domknięcie do obliczenia potęgi danej liczby. Tym razem, do tego samego celu użyjemy obiektu callable.

A teraz stworzymy kilka obiektów i wywołamy je jako funkcje.

Elegancko ! Mamy teraz obiekt który możemy wywoływać jak funkcję. Zapraszam Cię do porównania dzisiejszego postu z poprzednim wpisem


Podzespoły na Ceneo.pl


Kategorie
Python

Closures: domknięcia leksykalne


 

 


Przyjrzyjmy się poniższemu snieppetowi. Funkcja power_of zwraca nam wewnętrzną funkcję power

Zagnieżdżona funkcja power nie posiada parametru base zdefiniowanego przez funkcję nadrzędną. Jednak w jakiś sposób ma do tego argumentu dostęp. Wywołajmy tą funkcję i zobaczmy co się stanie

MAGIC!!. W jakiś sposób funkcja power pamięta wartość argumentu przekazanego do funkcji nadrzędnej. Odpowiada za to tzw. domknięcie (ang. lexical closures). W chwili gdy funkcje power_of… były deklarowane, domknięcie zapamietało środowisko leksykalne w jakim były one tworzone.
Odpowiednikiem powyższych domknięć mogą być następujące funkcje:

Jak widzisz dzięki domknięciom możemy pre-konfigurować zachowanie funkcji, oszczędzić czas i ilość kodu, a im mniej kodu tym mniej błedów 🙂


Podzespoły na Ceneo.pl


Kategorie
Python

Sortowanie listy słowników po kluczu który może nie istnieć.


 


Przypuśćmy, że chcielibyśmy posortować listę słowników wg klucza. Jeżeli mamy szczęście i dany klucz występuje we wszystkich słownikach zadanie jest proste.

W rezultacie otrzymujemy

Niestety powyższy snippet nie działa gdy w naszym słowniku nie ma danego klucza. jak zapewne wiesz w takim wypadku interpreter podniesie wyjątek KeyError

Wynik

Najprostrzym rozwiązaniem tego problemu jest użycie metody get(). W przypadku braku klucza nie podniesie wyjątku tylko zwróci None

Boom coś poszło nie tak 🙁

No tak, próbujemy użyć operatora porównania dla typu None i int: None < int

Z pomocą przyjdzie nam mała magia. Wystarczy, że nasza lambda zwróci tuple z dwoma wartościami

Pierwszy element to boolean a drugi wartość pod danym kluczem lub None w przypadku braku klucza.

Ponieważ False(0) jest przed True(1) dlatego użyte zostało „not in”

Zadanie wykonane. Słowniki są posortowane wg klucza który w innych słownikach nie istnieje.

Po usunięciu operatora NOT (w Pythonie True > False)

Otrzymamy


Podzespoły na Ceneo.pl