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

Podobne dokumenty