Spotkania z Pythonem - Czesc 1 - podstawy
Transkrypt
Spotkania z Pythonem - Czesc 1 - podstawy
Spotkania z Pythonem Cz¦±¢ 1 - podstawy Michaª Alichniewicz Studenckie Koªo Automatyków SKALP Gda«sk 2014 Dzi¦kuj¦ za uwag¦! Na licencji Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License. M. Alichniewicz (SKALP) Python vol. 1 2014 1 / 66 Gdzie si¦ mo»na spotka¢ z Pythonem? Dystrybucja Linuksa Ubuntu - ±rodowisko graczne Unity Oprogramowanie do zarz¡dzania projektami TRAC (wykorzystywane m.in przez NASA) Klient Dropbox'a Serwis Instagram Blender / LibreOce (jako j¦zyk skryptowy / makra) M. Alichniewicz (SKALP) Python vol. 1 2014 2 / 66 Gªówne cechy j¦zyka Dynamiczny j¦zyk ogólnego przeznaczenia Struktura j¦zyka jest ukierunkowana na prostot¦ i czytelno±¢ kodu Multiplatformowo±¢ (wliczaj¡c w to mikrokontrolery) Mo»liwo±¢ ª¡czenia z innymi j¦zykami programowania atwo±¢ instalacji dodatkowych bibliotek (i ich mnogo±¢) Ogromna ilo±¢ zastosowa« - od aplikacji desktopowych, po aplikacje internetowe Umo»liwia prac¦ w trybie wiersza polece«, nie trzeba kompilowa¢ plików przed uruchomieniem Nie wymaga dedykowanego edytora Rozwijane s¡ dwie wersje - 2.x oraz 3.x M. Alichniewicz (SKALP) Python vol. 1 2014 3 / 66 Przykªadowy kod Najwi¦kszy wspólny dzielnik - implementacja w C: /** * Przykladowy program obliczajacy najwiekszy * wspolny dzielnik (algorytm Euklidesa) */ int nwd(int a, int b) { int c; while (b > 0) { c = a % b; a = b; b = c; } return a } M. Alichniewicz (SKALP) Python vol. 1 2014 4 / 66 Przykªadowy kod Najwi¦kszy wspólny dzielnik - implementacja w Pythonie: def nwd(a,b): """ Przykladowy program obliczajacy najwiekszy wspolny dzielnik (algorytm Euklidesa) """ while b > 0: c = a % b a = b b = c return a M. Alichniewicz (SKALP) Python vol. 1 2014 5 / 66 Jakie s¡ podstawowe ró»nice? Brak klamer - bloki s¡ oznaczane przez wci¦cie kodu! Brak ±redników - instrukcje nie musz¡ si¦ ko«czy¢ ±rednikiem! Zmienne deklarujemy w momencie u»ycia - nie ma potrzeby robienia tego wcze±niej, jak np. w C M. Alichniewicz (SKALP) Python vol. 1 2014 6 / 66 Zmienne - podstawowe typy i operacje M. Alichniewicz (SKALP) Python vol. 1 2014 7 / 66 Typy zmiennych - podstawowe Typ liczbowy (krótki) - int: a = 5 # Liczba rowna "5" b = 0x0A # Liczba rowna "10" Typ liczbowy (dªugi) - long: a = -100000000000L # Duza liczba ujemna b = 500000000000000L # Jeszcze wieksza liczba Typ liczbowy (liczba zmiennoprzecinkowa) - oat: a = 1.23 # Mala liczba b = 4.5678e-9 # Jeszcze mniejsza liczba Typ liczbowy (zespolony) - complex: a = -1+0j # Dobry biegun b = 1+2.3e-1j # Zly, niedobry biegun M. Alichniewicz (SKALP) Python vol. 1 2014 8 / 66 Typy zmiennych - podstawowe Typ logiczny - boolean: a = True b = False # wazna jest wielkosc liter! Typ pusty - NoneType: a = None Typ tekstowy (ci¡g znaków) - str: a = 'Studenckie Kolo Automatykow SKALP' b = "Tak tez mozna zdefiniowac tekst" c = """A to jest bardzo dlugi tekst: Lorem ipsum dolor sit amet, consectetur adipiscing elit. """ Uwaga: je»eli w kodzie pojawi si¦ tekst wielolinijkowy, typu: """ Lorem ipsum dupsum bupsum """ nie przypisany do »adnej zmiennej, wtedy jest to konstrukcja komentarza wielolinijkowego. M. Alichniewicz (SKALP) Python vol. 1 2014 9 / 66 Podstawowe operacje na zmiennych Operacje arytmetyczne: Dodawanie a = a + b # Dodaj a do b i zapisz do b a += b # Tak tez mozna a += 1 # Tak wyglada inkrementacja - nie ma czegos # typu "i++" Odejmowanie a = a - b # Odejmij b od a i zapisz do a a -= b # Tak tez mozna a -= 1 # Tak wyglada derementacja - nie ma czegos # typu "i--" Mno»enie a = a * b # Pomnoz a razy b a *= b # To tez zadziala a = a * 2 # Dajmy jakas liczbe zeby literkom # smutno nie bylo M. Alichniewicz (SKALP) Python vol. 1 2014 10 / 66 Podstawowe operacje na zmiennych Dzielenie i reszta z dzielenia a a a b = a / b # Podziel a przez b /= b # To tez zadziala = a % 2 # Reszta z dzielenia przez 2 %= 3 Pot¦gowanie a = a ** b # a do potegi b a **= b # To tez zadziala a = b ** 2 # Do kwadratu! Poszczególne typy liczbowe mo»na ze sob¡ ª¡czy¢, uzyskuj¡c w efekcie liczb¦ typu najwyzszego (o co chodzi: mno»¡c liczb¦ dªug¡ i krótk¡, dostaniemy liczb¦ dªug¡. Dodaj¡c liczb¦ zmiennoprzecinkow¡ do liczby dªugiej, otrzymamy liczb¦ zmiennoprzecinkow¡. Dziel¡c liczb¦ zmiennoprzecinkow¡ przez liczb¦ zespolon¡, otrzymamy liczb¦ zespolon¡ etc.) M. Alichniewicz (SKALP) Python vol. 1 2014 11 / 66 Podstawowe operacje na zmiennych Operacje logiczne (dotyczy liczb caªkowitych): Iloczyn logiczny a = a & b # Iloczyn logiczny a i b a &= b # j.w. a = b & 0xF0 # iloczyn logiczny z liczb Suma logiczna a = a | b # suma logiczna a i b a |= b a = a | 0x3 Alternatywa wykluczaj¡ca (XOR) a = a ^ b # a XOR b a ^= b # To tez zadziala a = a ^ 0xFF M. Alichniewicz (SKALP) Python vol. 1 2014 12 / 66 Podstawowe operacje na zmiennych Przesuni¦cie bitowe a a a b = a >>= = b <<= >> 2 # Odpowiednik dzielenia razy 2 b # wersja skrocona << 4 # Mnozymy 3 # ale w skrocie Negacja bitowa a = ~b # Tu nie ma co skracac... M. Alichniewicz (SKALP) Python vol. 1 2014 13 / 66 Operacje na ci¡gach znaków Dodawanie a = a + b # Polaczenie ciagow a i b w jeden a += 'dadada' # Dodanie ciagu 'dadada' do a Mno»enie przez liczb¦ caªkowit¡ a = 'a' * 5 # Zwielokrotnienie ciagu 'a' # pieciokrotnie a *= 5 # To juz skads znamy Co logiczne - nie mo»emy mno»y¢ tekstu przez tekst, czy go dzieli¢ przez liczb¦, etc. Tak samo jak nie mo»emy mno»y¢ przez liczb¦ uªamkow¡ (jak kto± uzyska dla przykªadu, dwie i póª literki J, to mu pogratuluj¦) M. Alichniewicz (SKALP) Python vol. 1 2014 14 / 66 Typy zmiennych - kolekcje Python, co jest niecz¦sto spotykane w innych j¦zykach, posiada specjalne rodzaje typów, tzw. kolekcje. Zgodnie z nazw¡, skªadaj¡ si¦ z specjalnie uªo»onego zbioru typów prostych (kolekcji tych typów): krotka, ang. tuple - mo»na to okre±li¢ jako staªa tablica (nie mo»emy zmienia¢ warto±ci, elementów, kolejno±ci, dodawa¢ nowych elementów, etc.). Elementy mog¡ by¢ dowolnego typu: a = (1,2,3) b c d e = = = = f = g = # Jakies wartosci, np. zgrupowane # parametry jakiejs funkcji (4,5, 'jakis tekst nie zaszkodzi') (a, (1,2)) a[1] # Odwolanie do elementu b[1:3] # Pobranie elemntow od indeksow # 1 do 3 i zebranie ich w nowa tuple (0,) # Tupla 1-elementowa - trzeba pamietac # o przecinku po elemencie! (1,) * 6 # Tupla z szesciu ``1'' Tuple cz¦sto s¡ wykorzystywane do grupowania warto±ci parametrów, lub zwracania kilku warto±ci z funkcji. M. Alichniewicz (SKALP) Python vol. 1 2014 15 / 66 Typy zmiennych - kolekcje lista, ang. list - w przeciwie«stwie do tupli, mo»emy zmienia¢ elementy, jak i dodawa¢ nowe b¡d¹ usuwa¢ istniej¡ce. Podobnie jak w tuplach, elementy mog¡ by¢ dowolnego typu: a = [1,2,3] b = c = d = e = f = g = # Jakies wartosci, np. zgrupowane # parametry jakiejs funkcji range(1,4) # Da to samo co wyzej [None]*4 # Stworzy liste o 4 elementach pustych, # zamiast None moze byc cokolwiek b[3] b[1:3] # Zachowanie podobne jak w tuplach, ale # tu tworzymy nowe listy [[1,2], [3,4]] # Mozemy zagniezdzac [] # Pusta lista Jest to typowy przykªad tablicy znanej z C. M. Alichniewicz (SKALP) Python vol. 1 2014 16 / 66 Typy zmiennych - kolekcje Listy oraz tuple zachowuj¡ si¦ podobnie jak ci¡gi tekstowe, czyli mo»na poª¡czy¢ kilka mniejszych list: a b c c = = = = [1, [3, a + c + 2] 4] b # W efekcie dostaniemy [1, 2, 3, 4] [] # Dalej zostaje to co wyzej - dodanie # pustej listy nic nie da b¡d¹ krotek (tupli): a = (4, 3) b = (2, 1) c = a + b # W efekcie dostaniemy (4, 3, 2, 1) stworzy jedn¡, wi¦ksz¡ list¦ lub tuple. Kolekcje musz¡ by¢ tego samego typu, tj. do listy nie mo»na doda¢ tupli. M. Alichniewicz (SKALP) Python vol. 1 2014 17 / 66 Typy zmiennych - kolekcje zbiór , ang. set - dosªownie uporz¡dkowany zbiór elementów podobne do listy, ale elementy nie mog¡ si¦ powtarza¢ i s¡ automatycznie sortowane: a = {1,2,3} zbiór staªy , ang. frozenset - podobnie jak zwykªy zbiór, ale nie mo»na go modykowa¢: a = frozenset([1,2,3]) S¡ to typowo matematyczne typu danych, wi¦c mo»na na nich robi¢ wszystkie znane z matematyki operacje na zbiorach - iloczyn, suma, etc: c c c c = = = = a a a a & | ^ - b b b b # # # # M. Alichniewicz (SKALP) Iloczyn zbiorow a i b Suma zbiorow a i b Elementy ``skrajne'' (a | b ) - (a & b) Roznica zbiorow Python vol. 1 2014 18 / 66 Typy zmiennych - kolekcje sªownik , ang. dictionary. Jest to rodzaj tablicy, w której za indeks mog¡ robi¢ praktycznie dowolnie wybrane warto±ci, zdeniowane przez nas: a = { 'indeks1': 'wartosc_1', 42: 'Ultimate Question of Life, ' 'the Universe, and Everything', (1,2): ('Tak tez mozna', 3.14) } Odowªujemy si¦ do takiego sªownika w prosty sposób: a['indeks1'] + a[42] # Da nam w wyniku 'wartosc_1Ultimate Question...' Sªownik jest odpowiednikem tablicy asocjacyjnej znanej m.in. z j¦zyka PHP. Jest to konstrukcja stosunkowo rzadko spotykana w innych j¦zykach. M. Alichniewicz (SKALP) Python vol. 1 2014 19 / 66 Typy zmiennych - kolekcje Z kolekcji do których elementów mo»emy odwoªywa¢ si¦ wg. klucza (listy oraz sªowniki) mo»emy w prosty sposób usuwa¢ elementy (sªowo kluczowe del). Nie dotyczy to tupli, która z denicji jest staªa. a = [1,2,3] del a[1] print repr(a) # Wyswietli [1,3] b = {'1': 1, '2': 2, '3': 'blabla'} del b['2'] print repr(b) # Wyswietli {'1': 1, '3': 'blabla'} Ilo±¢ elementów w kolekcji (dowolnej) mo»emy sprawdzi¢ funkcj¡ len: a = (1,2,3) b = len(a) # b wynosi 3 c = len((1,2,(1,2))) # c rowniez wynosi 3 # na poziomie ``glownym'' # sa 3 elementy M. Alichniewicz (SKALP) Python vol. 1 2014 20 / 66 Pisanie po ekranie M. Alichniewicz (SKALP) Python vol. 1 2014 21 / 66 Pisanie po ekranie Podstawowe pisanie po ekranie jest wykonywane przez funkcj¦ - nomen omen - print: print 'Hello world!' Z C/C++ znamy te» funkcj¦ printf : printf("Wyswietl: a = %d, b = 0x%X", 10, 20); W Pythonie oczywi±cie te» wyst¦puje odpowiednik takiej funkcji: print 'Wyswietl: a = %d, b = 0x%X' % (10, 20) Nale»y zwóci¢ tutaj uwag¦ na podwójne zastosowanie operatora %. W przypadku liczb, dziaªa jako dzielenie modulo. Z kolei przy ci¡gach tekstowych sªu»y do formatowania. W przypadku, je»eli w ci¡gu który formatujemy jest tylko jedna zmienna, po operatorze % nie musi si¦ pojawi¢ tupla, wystarczy pojedyncza warto±¢ / zmienna. M. Alichniewicz (SKALP) Python vol. 1 2014 22 / 66 Pisanie po ekranie W ramach tzw. debuggowania przez wy±wietlanie (czyli wstawianie w ±rodek kodu instrukcji wy±wietlania, »eby si¦ mniej wi¦cej zorientowa¢ gdzie si¦ program sypie), przydatne jest kilka funkcji: Funkcja repr - zwraca u»yteczn¡ dla czªowieka reprezentacj¦ danej zmiennej/typu/warto±ci. Czyli, np. drukuje list¦. a = repr # Przypisz do zmiennej a funkcje repr. # Tak, to jest poprawna konstrukcja. print repr(a) # Powinno wyswietlic cos w stylu # ``<built-in function repr>'' Funckja id - drukuje unikalny identykator obiektu (zmiennej, wartosci, etc.). Czasami ta warto±¢ si¦ pojawia w ci¡gu zwróconym przez repr: print id(repr) M. Alichniewicz (SKALP) # Wyswietli jakas liczbe, # u kazdego inna Python vol. 1 2014 23 / 66 Pisanie po ekranie - przekazywanie zmiennych Znaj¡c funkcj¦ która zwraca unikalne ID ka»dego elementu (zmiennej), mo»emy wprost zaobserwowa¢ jedn¡ z wªasno±ci Pythona. W Pythonie wszystko jest przekazywane przez referencj¦. Oznacza to, »e domy±lnie istnieje jeden unikalny obiekt danego typu, a ka»de przypisanie go do kolejnej zmiennej powoduje jedynie przekazanie referencji. Mo»na to zaobserwowa¢ na przykªadzie: a = 123 print id(a) b = a print id(b) M. Alichniewicz (SKALP) # Wyswietli jakas liczbe, # np. 19316032 # Wyswietli TO SAMO co # instrukcja wyzej Python vol. 1 2014 24 / 66 Pisanie po ekranie - przekazywanie zmiennych Bardziej obrazowy przykªad tej wªasno±ci to np. przekazanie referencji do podlisty: a = [1,2,3,[4,5]] b = a[3] print repr(b) # Wyswietli [4,5] b[0] = 123 print repr(a) M. Alichniewicz (SKALP) # Wyswietli [1,2,3,[123,5]] ! Python vol. 1 2014 25 / 66 Bloki kontrolne M. Alichniewicz (SKALP) Python vol. 1 2014 26 / 66 Bloki kontrolne Poniewa» Python jest j¦zykiem który stawia na prostot¦ i przejrzysto±¢ kodu, ilo±¢ instrukcji blokowych jest ograniczona. J¦zyk ten posiada tylko 1 konstrukcj¦ warunkow¡ - if . . . else . . . . Nie posiada z kolei znanej m.in. z C instrukcji switch. Liczba p¦tli równie» jest ograniczona - wyst¦puj¡ tylko p¦tle for i while, brak jest znanej z innych j¦zyków p¦tli do . . . while. Brak te» instrukcji skoku typu label . . . goto. W przeciwie«stwie do wi¦kszo±ci znanych j¦zyków (które maj¡ wspólnego przodka, j¦zyk ALGOL), w Pythonie nie stosuje si¦ klamer do oznaczania bloków! Bloki oznaczamy przez wci¦cia - zmiana ci¡gªo±ci wci¦cia oznacza otworzenie / zako«czenie bloku (jednocze±nie wymuszaj¡c na u»ytkowniku przejrzysto±¢ kodu). Python akceptuje wci¦cie zªo»one z 2 spacji, 4 spacji b¡d¹ tabulatora (zalecane s¡ 4 spacje). Korzystaj¡c z wiersza polece« (konsoli) pythona (polecenie python) blok ko«czymy pust¡ lini¡. M. Alichniewicz (SKALP) Python vol. 1 2014 27 / 66 Bloki kontrolne - instrukcja warunkowa - wersja C Znana z C konstrukcja warunkowa wygl¡da mniej wi¦cej tak: if ( warunek ) { // Jakis tam kod } else if ( warunek_2 ) { // Jeszcze inny kod } else { // Nic nie wyszlo } M. Alichniewicz (SKALP) Python vol. 1 2014 28 / 66 Bloki kontrolne - instrukcja warunkowa - wersja Python Z kolei w Pythonie to wyglada tak: if warunek: # Jakis tam kod elif warunek_2: # Jeszcze inny kod else: # Nic nie wyszlo Jak wida¢, w Pythonie wyst¦puje sªowo kluczowe elif, co jest odpowiednikiem else if z C (gdzie tak na prawd¦, mamy 2 zagnie»d»one warunki - w Pythonie caªy czas to jeden warunek). Instrukcj¦ switch znan¡ z C zbudujemy za pomoc¡ odpowiedniej ilo±ci if . . . elif . . . else. M. Alichniewicz (SKALP) Python vol. 1 2014 29 / 66 Bloki kontrolne - instrukcja warunkowa - warunki Par¦ sªów na temat tworzenia warunków. Wi¦kszo±¢ operatorów warunkowych jest identyczna jak w pozostaªych j¦zykach programowania: ==, >, <, >=, <=, !=. Jest te» jeden niewyst¦puj¡cy: Dokªadna równo±¢. Z racji tego, »e zmienne w Pythonie nie maj¡ odgórnie przypisanego typu, funkcja mo»e - dla przykªadu zwróci¢ warto±¢ liczbow¡, albo False w przypadku niepowodzenia. Jak odró»ni¢ 0 matematyczne od 0 logicznego? Do tego sªu»y sªowo kluczowe is, które sprawdza równie» typ: 1 == True 1 is True # Zwroci ``True'' - 1 to 1 # Zwroci ``False'' - bo matematyczne # ``1'' to nie logiczna prawda. Podobny operator wyst¦puje w j¦zyku PHP - ===. M. Alichniewicz (SKALP) Python vol. 1 2014 30 / 66 Bloki kontrolne - instrukcja warunkowa - warunki W Pythonie istnieje jeszcze jeden przydatny operator - sªowo kluczowe in. Pozwala ono sprawdzi¢, czy w kolekcji znajduje si¦ element o danej warto±ci: a = [1,2,3] 2 in a # Da ``True'' - bo 2 jest elementem listy 5 in a # Da ``False'' - nie ma takiego elementu W przypadku sªowników, sprawdza czy dany element jest kluczem: a = {'1': 1, '2': 2} '1' in a # Da ``True'' - bo '1' jest kluczem 1 in a # Da ``False'' - nie ma takiego klucza M. Alichniewicz (SKALP) Python vol. 1 2014 31 / 66 Bloki kontrolne - instrukcja warunkowa - warunki ¡czenie warunków jest nieco odmienne od tego w C. W wi¦kszo±ci j¦zyków programowania, do tego sªu»¡ podwojone operatory do operacji logicznych na bitach - czyli && jako i oraz || jako lub. Python stawia na czytelno±¢ - a wi¦c, zamiast maªo zrozumiaªych krzaków, mamy form¦ tekstow¡: and oraz or. Podobnie jest z negacj¡: zamiast symbolu !, stosujemy sªowo kluczowe not: if warunek1 and warunek2: # Zrob cos elif not warunek1 and not warunek2: # Zrob cos innego elif warunek1 or warunek2: # Jeszcze cos innego?! else: # To cos jeszcze zostalo? Oczywi±cie, warunki mo»emy zagnie»d»a¢ (zarówno instrukcj¦ if, jak i sam¡ tre±¢ warunku). M. Alichniewicz (SKALP) Python vol. 1 2014 32 / 66 Bloki kontrolne - instrukcja warunkowa - warunki Kilka uwag do tworzenia warunków: Je»eli chcemy sprawdzi¢ warto±¢ logiczn¡, nie musimy jej porównywa¢ do prawdy czy faªszu, wystarczy konstrukcja typu if zmienna_logiczna: # Zrob cos lub if not zmienna_logiczna_2: # Zrob cos innego 0 w ka»dej postaci liczbowej oznacza faªsz, wszystkie inne liczby to prawda warto±¢ None to faªsz pusta kolekcja (pusta tupla, lista, etc) a tak»e pusty ci¡g znaków to faªsz, wszystko inne - prawda M. Alichniewicz (SKALP) Python vol. 1 2014 33 / 66 Bloki kontrolne - p¦tla while Znana z C p¦tla while: while (warunek) { // Zrob cos } w Pythonie przybiera posta¢: while warunek: # Zrob cos Tworzenie warunków jest identyczne jak w instrukcji warunkowej. Nie licz¡c warunku, kod wewn¡trz p¦tli mo»e zosta¢ przerwany, a p¦tla zako«czona dzi¦ki instrukcji break, albo przerwany a nast¦pnie wznowiony od pocz¡tku (kolejna iteracja) dzi¦ki instrukcji continue (tu podobnie jak w C) M. Alichniewicz (SKALP) Python vol. 1 2014 34 / 66 Bloki kontrolne - p¦tla for Znana z C p¦tla for wygl¡da tak (przyklad): for (i=0; i<wartosc_koncowa; i++) { // Zrob cos } Pythonowy odpowiednik tej p¦tli to for i in range(0,wartosc_koncowa): # Zrob cos Funkcja range ju» si¦ nam przewin¦ªa w momencie omawiania list. Sk¡d si¦ tu wi¦c wzi¦ªa? M. Alichniewicz (SKALP) Python vol. 1 2014 35 / 66 Bloki kontrolne - p¦tla for Otó» - algorytm dziaªania p¦tli for w j¦zyku C (i pochodnych) wygl¡da mniej wi¦cej tak: 1 Zainicjuj zmienne licznika (i = 0) 2 Sprawd¹ warunek (i < wartosc_koncowa) 3 Je»eli warunek prawdziwy, wykonaj kod p¦tli; w przeciwnym wypadku, zako«cz p¦tl¦. 4 Wykonaj aktualizacj¦ warto±ci zmiennych licznika (i++) 5 Wró¢ do punktu 2. M. Alichniewicz (SKALP) Python vol. 1 2014 36 / 66 Bloki kontrolne - p¦tla for A jak to wygl¡da w Pythonie? 1 We¹ kolejn¡ warto±¢ z sekwencji (kolejna warto±¢ z listy - przykªadowo - zwróconej przez range(0,wartosc_koncowa)) 2 Je»eli si¦ to udaªo (to nie jest koniec listy), wykonaj kod p¦tli; w przeciwnym wypadku, zako«cz p¦tl¦. 3 Wró¢ do punktu 1. Jak widzicie, algorytm p¦tli for w Pythonie znacznie si¦ ró»ni od tego w C. Ró»nica wynika z tego, »e p¦tla nazwana for w Pythonie jest dosªownie interpretowana jako dla ka»dego elementu z sekwencji, wykonaj. Jako sekwencj¦ mo»emy poda¢ dowoln¡ kolekcj¦ (tuple, list¦, zbiór, a tak»e ci¡g tekstowy). Wniosek jest jeden: p¦tla for w Pythonie mo»e dziaªa¢ jak jej odpowiednik w C, ale to nie jest klasycza p¦tla FOR. M. Alichniewicz (SKALP) Python vol. 1 2014 37 / 66 Bloki kontrolne - p¦tla for Przykªady? skladniki = ['jablko', 'banan', 'gruszka', 'pomarancza'] print 'Skladniki salatki owocowej to:' for owoc in skladniki: print owoc, ciag = 'SKALP' print 'Kolejne znaki w ciagu %s' % ciag for znak in ciag: print 'Znak: %c' % znak print 'Klasyczne for:' for i in range(0,10): print 'i wynosi: %d' % i M. Alichniewicz (SKALP) Python vol. 1 2014 38 / 66 Funkcje M. Alichniewicz (SKALP) Python vol. 1 2014 39 / 66 Tworzenie funkcji - wersja C Przykªadowy kod funkcji w C wygl¡da tak: /** * Jakis komentarz / opis do funkcji, niewymagane, * ale zalecane ze wzgledu na czytelnosc */ typ_zwracany nazwa_funkcji(typ1 zmienna1, typ2 zmienna2, typ_etc zmienna_etc) { // Jakis tam kod funkcji } return wartosc_zwracana; // Cos zwracamy M. Alichniewicz (SKALP) Python vol. 1 2014 40 / 66 Tworzenie funkcji - wersja Python Z kolei w Pythonie, szkielet wygl¡da tak: def nazwa_funkcji(zmienna1, zmienna2, zmienna_etc) """ Jakis komentarz / opis do funkcji, niewymagane, ale zalecane ze wzgledu na czytelnosc """ # Jakis tam kod funkcji return wartosc_zwracana; # Cos zwracamy Jak widzimy, funcj¦ deklarujemy sªowem kluczowym def i nie podajemy »adnych typów (mo»emy te» nic nie zwraca¢, odpowiednik funkcji void z C). Pami¦tajmy te», »e jak wszystko w Pythonie, argumenty s¡ przekazywane przez referencj¦! M. Alichniewicz (SKALP) Python vol. 1 2014 41 / 66 Tworzenie funkcji - wersja Python Python, jako j¦zyk skryptowy, daje nam jeszcze jedn¡ mo»liwo±¢ - podanie domy±lnych warto±ci argumentów def nazwa_funkcji(zmienna1 = 1, zmienna2 = 2, zmienna_etc = 'etc') """ Jakis komentarz / opis do funkcji, niewymagane, ale zalecane ze wzgledu na czytelnosc """ # Jakis tam kod funkcji return wartosc_zwracana; # Cos zwracamy M. Alichniewicz (SKALP) Python vol. 1 2014 42 / 66 Tworzenie funkcji - wersja Python Jaka z tego korzy±¢? Otó» jedn¡ z cech odró»niaj¡cych Pythona od innych j¦zyków, jest to, »e owszem - argumenty do funkcji mo»emy podawa¢ wg. kolejno±ci denicji, ale tak»e mo»emy przypisywa¢ warto±ci do konkretnych argumentów: # Wywolanie klasyczne nazwa_funkcji(1, 2, 3) # Trzeci argument pozostaje domyslny nazwa_funkcji(1, 2) # Pierwsze dwa zostaja domyslne nazwa_funkcji(zmienna_etc = 'nowe etc') # Same domyslne nazwa_funkcji() M. Alichniewicz (SKALP) Python vol. 1 2014 43 / 66 Tworzenie funkcji - wersja C, zmienna liczna argumentów W Pythonie - tym razem podobnie jak w innych j¦zykach - jest te» mo»liwe zdeniowanie funkcji przyjmuj¡cej kilka argumentów. W C, jest to troch¦ skomplikowane: #include <stdarg.h> void vargs(int first, ...) { va_list arg; // Tablica z argumentami va_start(arg, first); // Ustaw wskaznik int foo; char bar; foo = va_arg(arg, int); // Wez pierwszy (typ int) bar = va_arg(arg, char); // Wez drugi (typ char) // Zrob z tym cos } va_end(arg); // Poinformuj gdzie koniec M. Alichniewicz (SKALP) Python vol. 1 2014 44 / 66 Tworzenie funkcji - wersja Python, zmienna liczna argumentów Jak widzimy, w C musimy te argumentu zdejmowa¢ po kolei z listy, co nie zawsze jest wygodne tudzie» mo»liwe. Python, jak wiemy, stawia na prostot¦ i czytelno±¢ kodu. W zwi¡zu z tym, zamiast takiego potworka mamy kod: def vargs(first, *args, **kwargs): """ Zmienna liczba argumentow. ``args'' to lista na ktorej sa argumenty, dla ktorych nie podalismy nazwy - czyli wywolanie funkcja typu vargs(1, 2, 3, 4). ``kwargs'' to slownik w ktorym sa argumenty przekazane z nazwy, czyli wywolanie typu vargs(dwa = 2, piec = 5) """ pass # Nic nie rob M. Alichniewicz (SKALP) Python vol. 1 2014 45 / 66 Tworzenie funkcji - wersja Python, zmienna liczna argumentów Jak to dziaªa mo»emy sprawdzi¢ w prosty sposób, wykorzystuj¡c poznan¡ wcze±niej funkcj¦ repr def vargs(*args, **kwargs): """ Wyswietl argumenty """ print repr(args) print repr(kwargs) a nast¦pnie spróbowa¢ wywoªa¢ funkcj¦ na ró»ne sposoby z ró»nymi argumentami: vargs(1, 2, 3) # Slownik kwargs bedzie pusty vargs(jeden = 1, dwa = 2) # List args bedzie pusta vargs(1, dwa = 2) # Dane beda w args i w kwargs vargs() # Lista args i slownik kwargs puste Wa»ne jest, »eby argumenty nienazwane byªy podawane PRZED tymi z konkretn¡ nazw¡. M. Alichniewicz (SKALP) Python vol. 1 2014 46 / 66 Wywoªywanie funkcji - rozpakowywanie list i sªowników Czasami sie zdarza, »e mamy kod który tworzy sªownik - tudzie» list¦/tupl¦ - z argumentami dla funkcji, które wszystkie przekazujemy. Mo»emy to zrobi¢ tradycyjnie: lista = (1,2) slownik = {'trzy': 3} vargs(lista[0], lista[1], trzy=slownik['trzy']) Mo»emy to te» przyspieszy¢, stosuj¡c rozpakowanie sekwencji: lista = (1,2) slownik = {'trzy': 3} vargs(*lista, **slownik) Jak zobaczycie, dziaªa tak samo. M. Alichniewicz (SKALP) Python vol. 1 2014 47 / 66 Wyj¡tki M. Alichniewicz (SKALP) Python vol. 1 2014 48 / 66 Czym s¡ wyj¡tki? W trakcie tworzenia funcji, czasami mo»e si¦ okaza¢ »e dla danych argumentów nie jest mo»liwe wykonanie takiej funkcji. Oczywi±cie, na fakt »e nie zostaªo to wykonane, trzeba jako± zareagowa¢. Jednym ze sposób, znany z C jest zwracanie np. ujemnych warto±ci, albo kodu bª¦du. W Pythonie mo»na te» zwróci¢ np. warto±¢ False. Ale jak zidentykowa¢, co poszªo nie tak? Zaªó»my prost¡ funkcj¦, która otwiera port szeregowy i wysyªa po nim jakie± dane. W tej funkcji mo»e wiele rzeczy pój±¢ nie tak: Bª¦dna nazwa portu Port zaj¦ty Brak uprawnie« etc. Oczywi±cie na ka»dy z bª¦dów trzeba zareagowa¢ inaczej. Mo»na zwraca¢ ró»ne warto±ci jako wynik funkcji. M. Alichniewicz (SKALP) Python vol. 1 2014 49 / 66 Czym s¡ wyj¡tki? Jak to zrobi¢ inaczej? Zaªó»my, »e funkcja mo»e zaraportowa¢ wyst¡pienie bª¦du i zako«czy¢ swoje dziaªanie. Zaªó»my te», »e takie zgªoszenie mo»na przechwyci¢ i wykona¢ odpowiednie operacje naprawcze - te zaªo»enia mo»na rozwin¡¢ jako system wyj¡tków (ang. exceptions). Brak tego mechanizmu w C, pojawiª si¦ od C++, jest wykorzystywany m.in. w Javie i w PHP. M. Alichniewicz (SKALP) Python vol. 1 2014 50 / 66 Wyj¡tki w Pythonie Najprostszym przykªadem operacji która mo»e pój±¢ nie tak, jest dzielenie. Dzielenie przez 0 nie nale»y do cz¦stych, i musimy si¦ przed nim zabezpieczy¢. Jak? Mo»na sprawdzi¢, czy nie chcemy dzieli¢ przez 0, je»eli tak, to ko«czymy nasz¡ funkcj¦ / piszemy komunikat o bª¦dzie / etc: # Obliczamy c = a / b if b == 0: print "Nie mozna dzielic przez 0!" else: print "Wynik z dzielenia: %d" % (a / b) Co si¦ stanie, je»eli jednak podzielimy? M. Alichniewicz (SKALP) Python vol. 1 2014 51 / 66 Wyj¡tki w Pythonie Sprawd¹my: a / b # Zwroci: # Traceback (most recent call last): # File "<stdin>", line 1, in <module> # ZeroDivisionError: integer division or modulo by zero Na ekranie widzimy bª¡d, a w zasadzie wªa±nie wyj¡tek zgªoszony (rzucony) przez Pythona. Tak samo, wyj¡tek zostanie zgªoszony jak b¦dziemy chcieli odwoªa¢ si¦ do nieistniej¡cego elementu listy: a = [1,2,3] a[4] # Zwroci: # Traceback (most recent call last): # File "<stdin>", line 1, in <module> # IndexError: list index out of range M. Alichniewicz (SKALP) Python vol. 1 2014 52 / 66 Wyj¡tki w Pythonie Zgodnie z ide¡ wyj¡tków, powinni±my móc wyªapa¢ ten bª¡d. Skªadnia bloków obsªugi wyj¡tków jest stosunkowo intuicyjna. Najprostsza jej forma to: try: # Sprobuj wykonac jakis kod ktory moze nie wyjsc # np wspomniane dzielenie przez 0 except TypWyjatku as e: # Kod, ktory zostanie wykonany jezeli wyjatek # zostanie rzucony. W ``e'' moga znajdowac sie # dodatkowe informacje na temat wyjatku except TypWyjatku2: # Mozna reagowac na kilka typow wyjatkow, # mozna tez nie odczytywac konkretnych # informacji o bledzie (tylko fakt, ze wystapil) except: # Mozemy tez nie znac typu M. Alichniewicz (SKALP) Python vol. 1 2014 53 / 66 Wyj¡tki w Pythonie Zwykªa instrukcja typu try . . . except pozwala nam reagowa¢ na wyj¡tek, którego czasami si¦ wr¦cz spodziewamy. A je»eli chcemy wykona¢ jak¡± akcj¦ jak wyj¡tek NIE wyst¡pi? Teoretycznie, mo»emy umie±ci¢ ten kod wewn¡trz bloku try - wtedy, je»eli wyj¡tek nie wyst¡pi, kod si¦ powinien wykona¢. Tracimy jednak na czytelno±ci kodu! Dlatego te», Python przychodzi z pomoc¡ nieco bardziej rozbudowan¡ instrukcj¡: try . . . except . . . else: try: # Proba wykonania kodu except TypWyjatku as e: # Proba sie nie powiodla else: # Proba sie powiodla, zrobmy cos dodatkowego M. Alichniewicz (SKALP) Python vol. 1 2014 54 / 66 Wyj¡tki w Pythonie Czasami zdarza si¦, »e w bloku try alokujemy jakie± zasoby - klasycznym, wr¦cz akademickim przykªadem jest tutaj otwarcie pliku. Niezale»nie od tego, czy wyj¡tek wyst¡piª, czy nie, plik musimy zamkn¡¢. Mo»emy takie zamykanie pliku umie±ci¢ albo w bloku try ORAZ w bloku except, mo»emy te» umie±ci¢ zamykanie pliku w bloku except ORAZ w bloku else. Mo»emy te» skorzysta¢ z dedykowanego bloku zaprojektowanego m.in. wªasnie do zwalniania zasobów - try . . . except . . . nally try: # Jakis kod w ktorym alokujemy zasoby except TypWyjatku as e: # Proba sie nie powiodla finally: # Czy sie udalo, czy nie, zwalniamy zasoby M. Alichniewicz (SKALP) Python vol. 1 2014 55 / 66 Wyj¡tki w Pythonie Oczywi±cie, instrukcje else oraz nally mo»emy ze sob¡ ª¡czy¢, co daje nam ko«cow¡, peªn¡ form¦ bloków do obsªugi wyj¡tków: try: # Jakis kod w ktorym alokujemy zasoby except TypWyjatku as e: # Proba sie nie powiodla else: # Proba sie jednak udala finally: # Czy sie udalo, czy nie, zwalniamy zasoby M. Alichniewicz (SKALP) Python vol. 1 2014 56 / 66 Wyj¡tki w Pythonie - programowanie wyj¡tkami Dosy¢ cz¦st¡ praktyk¡ w±ród programistów, jest podej±cie upewnij si¦ trzy razy, zanim co± wykonasz - »eby nie byªo bª¦dów. Przykªadem takiej praktyki jest m.in. wspomniane wcze±niej sprawdzanie, czy mo»emy dzieli¢ przez dan¡ liczb¦. Python z kolei, promuje podej±cie totalnie odmienne: spróbuj co± zrobi¢, co najwy»ej Ci nie wyjdzie - wtedy zrób co± innego - czyli rób i ªap wyj¡tki. Takie podej±cie skutkuje m.in. tym, »e Python rzuca wyj¡tkami na przysªowiowe prawo i lewo - i czasami nie da si¦ zastosowa¢ pierwszego podej±cia. Przykªadowo - jak sprawdzi¢, czy w danym sªowniku jest element o danym indeksie/kluczu (jak by wygl¡daªa taka funkcja?) M. Alichniewicz (SKALP) Python vol. 1 2014 57 / 66 Wyj¡tki w Pythonie - programowanie wyj¡tkami Mniej wi¦cej tak: def haskey(dict, name): """ Sprawdza, czy w slowniku `dict` istnieje klucz `name` """ try: _ = dict[name] # Pobierz wartosc # do jakiejs zmiennej except KeyError: return False # Wyjatek - a wiec klucza # nie ma else: return True # Udalo sie - wiec klucz # istnieje To podej±cie jest zastosowane nawet wewn¡trz wbudowanych w Pythona funkcji! M. Alichniewicz (SKALP) Python vol. 1 2014 58 / 66 Zadania do wykonania M. Alichniewicz (SKALP) Python vol. 1 2014 59 / 66 Zadanie 1 Napisz 2 funkcje realizuj¡ce silni¦ na 2 sposoby: rekurencyjnie oraz iteracyjnie. M. Alichniewicz (SKALP) Python vol. 1 2014 60 / 66 Zadanie 2 Napisz funkcj¦, która sprawdzi czy w podanej przez u»ytkownika kolekcji (lista, tupla, sªownik, tekst) istnieje element o podanym przez u»ytkownika kluczu. Funkcja powinna zwraca¢ warto±¢ logiczn¡ True je»eli dany klucz istnieje, oraz logiczne False w przeciwnym wypadku. M. Alichniewicz (SKALP) Python vol. 1 2014 61 / 66 Zadanie 3 Napisz funkcj¦, która stworzy list¦ b¦d¡c¡ sum¡ dwóch list a i b tak¡, »e lista wynikowa b¦dzie miaªa tylko unikalne warto±ci z obu list (mo»esz zaªo»y¢, »e warto±ci listy a jak i b s¡ unikalne wewn¡trz tych list). Obrazowo: a = suma_list([1,2,3,4], [3,4,5,6]) # a powinno wynosic [1,2,3,4,5,6] M. Alichniewicz (SKALP) Python vol. 1 2014 62 / 66 Zadanie 4 Zaimplementuj algorytm sita Erastotenesa (wyszukiwanie liczb pierwszych z zadanego zakresu - patrz http://pl.wikipedia.org/wiki/Sito_Eratostenesa - w inny sposób ni» podany - bez usuwania elementów listy, a tworz¡c now¡) M. Alichniewicz (SKALP) Python vol. 1 2014 63 / 66 Materiaªy M. Alichniewicz (SKALP) Python vol. 1 2014 64 / 66 Materiaªy Dokumentacja j¦zyka Python https://docs.python.org/2/ Forum StackOverow http://stackoverflow.com/ Python Enchancement Proposals https://www.python.org/dev/peps/ M. Alichniewicz (SKALP) Python vol. 1 2014 65 / 66 Spotkania z Pythonem Cz¦±¢ 1 - podstawy Michaª Alichniewicz Studenckie Koªo Automatyków SKALP Gda«sk 2014 Dzi¦kuj¦ za uwag¦! Na licencji Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License. M. Alichniewicz (SKALP) Python vol. 1 2014 66 / 66