Python w dydaktyce informatyki – podstawy jezyka

Transkrypt

Python w dydaktyce informatyki – podstawy jezyka
Python w dydaktyce informatyki – podstawy jezyka
˛
Tomasz Łukaszuk
Katedra Oprogramowania
Wydział Informatyki
Politechnika Białostocka
[email protected]
04-10-2014
Tomasz Łukaszuk (WI PB)
Python
04-10-2014
1 / 31
Wprowadzenie
Historia
Opracowany w późnych latach
1980 przez Guido Van
Rossum pracujacego
˛
w
Centrum Wiskunde &
Informatica w Holandii. Nazwa
wywodzi sie˛ od ’Monty
Python’s Flying Circus’.
16-10-2000: Python wersja 2.0
3-12-2008: Python wersja 3.0. Niekompatybilna wstecz z wersja˛
2.0, ale wiele cech wersji 3.0 wprowadzono w wersji 2.6
wersje 2.x i 3.x sa˛ aktualnie rozwijane jednocześnie
04-10-2014: Python wersja 2.7.8 i 3.4.1
Tomasz Łukaszuk (WI PB)
Python
04-10-2014
2 / 31
Wprowadzenie
Filozofia programowania - The Zen of Python I
1
Ładne jest lepsze niż brzydkie.
2
Jawne jest lepsze niż niejawne.
3
Proste jest lepsze niż złożone.
4
Złożone jest lepsze niż skomplikowane.
5
Płaskie jest lepsze niż zagnieżdżone.
6
Rzadkie jest lepsze niż geste.
˛
7
Liczy sie˛ czytelność.
8
Szczególne przypadki nie sa˛ na tyle specjalne żeby łamać zasady.
9
Chociaż praktyczność jest ważniejsza od czystości.
Tomasz Łukaszuk (WI PB)
Python
04-10-2014
3 / 31
Wprowadzenie
Filozofia programowania - The Zen of Python II
10
Błedy
˛ nie powinny być przekazywane w milczeniu.
11
O ile jawnie nie zostana˛ wyciszone.
12
W obliczu dwuznaczności, odrzucić pokuse˛ zgadywania.
13
Powinien być jeden - i najlepiej tylko jeden - oczywisty sposób aby
coś zrobić.
14
Chociaż ten sposób może nie być od razu oczywisty, chyba że
jesteś Holendrem.
15
Teraz jest lepsze niż nigdy.
16
Chociaż nigdy jest cz˛esto lepsze niż "right" teraz.
17
Jeśli implementacja jest trudna do wytłumaczenia, jest to zły
pomysł.
18
Jeśli implementacja jest łatwa do wyjaśnienia, to może być dobry
pomysł.
Tomasz Łukaszuk (WI PB)
Python
04-10-2014
4 / 31
Wprowadzenie
Dlaczego używać Pythona? I
Zmniejsza czas tworzenia programów
Bardzo jasna, czytelna składnia
Bardzo łatwy do nauczenia sie˛
Dość szybki!
Bardzo dużo standardowych bibliotek i rozszerzajacych
˛
modułów
do wykonywania praktycznie każdego zadania
Pracuje wsz˛edzie (Windows, Linux/Unix, Mac, Amiga)
Otwarty i darmowy!
Tomasz Łukaszuk (WI PB)
Python
04-10-2014
5 / 31
Python
Cechy jezyka
˛
Python I
Interpretowalny
Używa kodu bajtowego (pliki *.pyc i *.pyo)
WSZYSTKO JEST OBIEKTEM
Bardzo jasna, czytelna składnia
Moduły, klasy, funkcje
Pełna modułowość, wspieranie hierarchii pakietów
Multi-paradigm: programowanie obiektowe i strukturalne + wiele
innych właściwości: programowanie funkcyjne, programowanie
aspect-oriented
Dynamiczne i silne typowanie, polimorfizm, garbage collector,
późne wiazania
˛
Tomasz Łukaszuk (WI PB)
Python
04-10-2014
6 / 31
Python
Cechy jezyka
˛
Python II
Duck typing: ’when I see a bird that walks like a duck and swims
like a duck and quacks like a duck, I call that bird a duck.’ - James
Whitcomb Riley
Przeciażanie
˛
operatorów
Wciecia
˛
do określenia struktury bloków kodu
Silne zdolności introspekcji
Rozszerzenia i moduły pisane w C, C++ (lub Java z Jython, lub
.NET dla IronPython)
Tomasz Łukaszuk (WI PB)
Python
04-10-2014
7 / 31
Python
Typy danych
Liczbowe: int, long, float, complex
String: niezmienialny
Podstawowe kontenery: listy, słowniki, zbiory (zmienialny), krotki
(niezmienialny)
Inne typy, np. binarne dane, wyrażenia regularne, introspekcja
Moduły rozszerzajace
˛ moga˛ definiować własne typy danych
Tomasz Łukaszuk (WI PB)
Python
04-10-2014
8 / 31
Kodowanie w pythonie
Wejście-wyjście
Operacje wejścia/wyjścia
Pobieranie danych od użytkownika:
1
2
3
4
5
6
7
8
9
x = raw_input("Podaj liczbe: ")
-> Podaj liczbe: 6
x
-> ’6’
x = int(x)
x
-> 6
Wypisywanie wartości na ekranie:
1
2
3
4
5
6
7
8
print "Hello world"
-> Hello world
print "Hello world " + str(7)
-> Hello world 7
print "Hello world %d %s" % (7, "xyz")
-> Hello world 7 xyz
Tomasz Łukaszuk (WI PB)
Python
04-10-2014
9 / 31
Kodowanie w pythonie
Wejście-wyjście
Deklarowanie zmiennych
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
>>> x
Traceback (innermost last):
File "<interactive input>", line 1, in ?
NameError: There is no variable named ’x’
>>> x = 1
>>> x
1
>>>
[0,
>>>
>>>
0
>>>
1
>>>
6
range(7)
1, 2, 3, 4, 5, 6]
(MO, TUE, WED, THU, FRI, SAT, SUN) = range(7)
MO
TUE
SUN
Nie można deklarować zmiennej bez przypisania jej wartości
Moża przypisać wiele wartości na raz
Tomasz Łukaszuk (WI PB)
Python
04-10-2014
10 / 31
Kodowanie w pythonie
Wejście-wyjście
Formatowanie napisów (strings) I
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
>>> k = "id"
>>> v = "XYZ"
>>> "%s=%s" % (k, v)
’id=XYZ’
>>> id = "XYZ"
>>> pwd = "secret"
>>> print pwd + " is not a good password for " + id
secret is not a good password for XYZ
>>> print "%s is not a good password for %s" % (pwd, uid)
secret is not a good password for XYZ
>>> userCount = 6
>>> print "Users connected: %d" % (userCount, )
Users connected: 6
>>> print "Users connected: " + userCount
Traceback (innermost last):
File "<interactive input>", line 1, in ?
TypeError: cannot concatenate ’str’ and ’int’ objects
Silne typowanie: nie można dodawać integer’a do a string’a!
Tomasz Łukaszuk (WI PB)
Python
04-10-2014
11 / 31
Kodowanie w pythonie
Wejście-wyjście
Formatowanie napisów (strings) II
1
2
3
>>> d = { ’pwd’ : ’secret’, ’id’ : ’XYZ’ }
>>> "%(id)s=%(pwd)s # user id: %(id)s, password: %(pwd)s" % d
’XYZ=secret # user id: XYZ, password: secret’
Można formatować strings używajac
˛ słowników (nazwanych
argumentów)
Moża użyć każdego argumentu wielokrotnie (albo wcale)
1
2
3
4
5
6
>>> params = {"server":"zeus", "database":"master", "id":"XYZ", "pwd":"secret"}
>>> ["%s=%s" % (k, v) for k, v in params.items()]
[’server=zeus’, ’id=XYZ’, ’database=master’, ’pwd=secret’]
>>> ";".join(["%s=%s" % (k, v) for k, v in params.items()])
’server=zeus;id=XYZ;database=master;pwd=secret’
Strings sa˛ obiektami - tak jak wszystko inne!
Tomasz Łukaszuk (WI PB)
Python
04-10-2014
12 / 31
Kodowanie w pythonie
Wejście-wyjście
——- Zadania praktyczne 1 ———
http://repl.it/languages/Python
1) Pobierz od użytkownika jego imie˛ i nazwisko używajac
˛ do tego
dwóch wywołań raw_input i nastepnie
˛
wypisz je w odwrotnej
kolejności i przecinkiem pomiedzy
˛
nimi.
Podaj imie: Stefan
Podaj nazwisko: Burczymucha
-> Burczymucha, Stefan
Tomasz Łukaszuk (WI PB)
Python
04-10-2014
13 / 31
Kodowanie w pythonie
Wejście-wyjście
——- Zadania praktyczne 1 ———
2) Pobierz od użytkownika jego imie˛ i nazwisko używajac
˛ jednego
wywołania raw_input i nastepnie
˛
wypisz [nazwisko], [imi˛
e]
Podaj imie i nazwisko: Stefan Burczymucha
-> Burczymucha, Stefan
Tomasz Łukaszuk (WI PB)
Python
04-10-2014
14 / 31
Kodowanie w pythonie
Wejście-wyjście
——- Zadania praktyczne 1 ———
3) Joanna zamówiła na przyjecie
˛
urodzinowe 32 kawałki pizzy. Pozwól
użytkownikowi (prawdopodobnie Joannie) na wpisanie liczby gości,
którzy bed
˛ a˛ jeść pizz˛e i wypisz liczbe˛ kawałków, ile dostanie każdy
gość. Jak wiesz pizza może nie dać sie˛ podzielić w całości. Można to
zrobić na dwa sposoby. Pierwszy to nie dzielić kawałków i każdemy
dać tylko całe kawałki, a reszte˛ odłożyć. Drugi sposób to podzielić
odłożone kawałki na równe cz˛eści pomiedzy
˛
gości. Twój program
powinien wyświetlić obie opcje:
Liczba gosci: 10
-> Opcja 1: 3 kawalki dla kazdego, 2 kawalki pozostaja
-> Opcja 2: 3.2 kawalki dla kazdego
Tomasz Łukaszuk (WI PB)
Python
04-10-2014
15 / 31
Kodowanie w pythonie
Instrukcje sterujace
˛
Wartość logiczna prawda - True
Każdy obiekt może być testowany na wartość prawdy, do
wykorzystania w wyrażeniach if lub while lub jako operand w
operacjach logicznych. Nastepuj
˛ ace
˛ wartości sa˛ uważane za
fałszywe (wartościowane jako false):
None
False
zero każdego typu numerycznego, np. 0, 0L, 0.0, 0j
każda pusta sekwencja, np. ”, (), []
kazde puste mapowanie, np. {}
instancje klas zdefiniowanych przez użytkownika, jeśli klasa
definiuje metode˛ __nonzero__() lub __len__(), gdy ta metoda
zwraca wartość całkowita zero lub boolowska˛ False.
Wszystkie inne wartości sa˛ uważane za prawdziwe
Tomasz Łukaszuk (WI PB)
Python
04-10-2014
16 / 31
Kodowanie w pythonie
Instrukcje sterujace
˛
Operacje boolowskie
Operation
x or y
x and y
not x
Result
if x is false, then y , else x
if x is false, then x, else y
if x is false, then True, else False
or wartościuje drugi argument tylko w przypadku kiedy pierwszy
argument jest False
and wartościuje drugi argument tylko w przypadku kiedy pierwszy
argument jest True
Należy pamietać,
˛
że operatory or/and moga˛ zwracać nie tylko
True lub False
Tomasz Łukaszuk (WI PB)
Python
04-10-2014
17 / 31
Kodowanie w pythonie
Instrukcje sterujace
˛
Konstrukcja if
1
2
3
4
5
6
7
8
9
10
11
12
13
>>> x = int(raw_input("Please enter an integer: "))
Please enter an integer: 42
>>> if x < 0:
...
x = 0
...
print ’Negative changed to zero’
... elif x == 0:
...
print ’Zero’
... elif x == 1:
...
print ’Single’
... else:
...
print ’More’
...
More
Może być zero lub wiecej
˛
cz˛eści elif
Cz˛eść else jest opcjonalna
Tomasz Łukaszuk (WI PB)
Python
04-10-2014
18 / 31
Kodowanie w pythonie
Instrukcje sterujace
˛
Konstrukcja while
1
2
3
4
5
6
>>> a, b = 0, 1
>>> while b < 1000:
...
print b,
...
a, b = b, a+b
...
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
Nic nowego . . .
Końcowy przecinek zapobiega przejściu do nowej linii.
Tomasz Łukaszuk (WI PB)
Python
04-10-2014
19 / 31
Kodowanie w pythonie
Instrukcje sterujace
˛
Konstrukcja for
1
2
3
4
5
6
7
8
>>> # Measure some strings:
... a = [’cat’, ’window’, ’defenestrate’]
>>> for x in a:
...
print x, len(x)
...
cat 3
window 6
defenestrate 12
Zamiast zawsze iterować po rosnacych
˛
liczbach arytmetycznych
(jak w Pascalu), lub dajac
˛ użytkownikowi możliwość definiowania
zarówno kroku iteracji jak i momentu jej zatrzymania (jak w C), w
Pythonie iteracja odbywa sie˛ po ciagu
˛ elementów dowolnej
kolejności (lista lub string), w kolejności, w jakiej wystepuj
˛ a˛ w
sekwencji.
Nie jest bezpieczne modyfikowanie sekwencji po której nastepuje
˛
iteracja.
Tomasz Łukaszuk (WI PB)
Python
04-10-2014
20 / 31
Kodowanie w pythonie
Instrukcje sterujace
˛
——- Zadania praktyczne 2 ———
1) Pobierz od użytkownika zdanie i wyświetl je w odwróconej
kolejności, każde słowo w oddzielnej linii.
Podaj zdanie: Poszla Ola do przedszkola.
-> przedsszkola.
-> do
-> Ola
-> Poszla
Tomasz Łukaszuk (WI PB)
Python
04-10-2014
21 / 31
Kodowanie w pythonie
Instrukcje sterujace
˛
——- Zadania praktyczne 2 ———
2) Klatka dla pytona powinna mieć odpowiednia˛ powierzchnie˛ zależna˛
od długości weża.
˛
Minimalna powierzchnia to 0.5 m2 na każdy metr
długości weża,
˛
jeżeli waż
˛ ma nie wiecej
˛
niż 6 metrów i 0.75 m2 na
każdy metr długości powyżej 6 metrów.
np. 9 metrowy pyton potrzebuje 5.25 m2 (6 * 0.5 + 3 * 0.75)
Napisz program, który zapyta użytkownika o długość weża
˛ i odpowie
jakiej powierzchni klatki on potrzebuje.
Podaj dlugosc Pythona: 6
-> Ten Python potrzebuje klatki o powierzchni 5.25 m2
Tomasz Łukaszuk (WI PB)
Python
04-10-2014
22 / 31
Kodowanie w pythonie
Instrukcje sterujace
˛
——- Zadania praktyczne 2 ———
3) Palindrom to wyraz, który tak samo brzmi czytany od poczatku
˛
i od
końca. Napisz program, który pobierze od użytkownika słowo i powie,
czy jest ono palindromem. Program nie powienien brać pod uwage˛
wielkości liter.
Podaj slowo: Kajak
-> Kajak jest palindromem
Tomasz Łukaszuk (WI PB)
Python
04-10-2014
23 / 31
Kodowanie w pythonie
Kontenery
Słowniki (Dictionaries)
1
2
3
4
5
6
7
8
9
10
11
12
d = {"server":"mpilgrim", "database":"master"}
d -> {’server’: ’mpilgrim’, ’database’: ’master’}
d["server"]
-> ’mpilgrim’
d[24] = 6666
d -> {’server’: ’mpilgrim’, ’database’: ’master’, 24 : 666}
del d[’server’]
d -> {’database’: ’master’, 24 : 666}
Klucze i wartości słowników moga˛ być dowolnego typu
(zagnieżdżenia)!
Słowniki NIE SA˛ UPORZADKOWANE
˛
Tomasz Łukaszuk (WI PB)
Python
04-10-2014
24 / 31
Kodowanie w pythonie
Kontenery
Listy (Lists)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
li = ["a", "b", "mpilgrim", "z", "example"]
li -> [’a’, ’b’, ’mpilgrim’, ’z’, ’example’]
li[4]
-> ’example’
li[-1]
-> ’example’
li[1:3]
-> [’b’, ’mpilgrim’]
li.append("new")
li -> [’a’, ’b’, ’mpilgrim’, ’z’, ’example’, ’new’]
li = [’a’, ’b’, ’mpilgrim’]
li = li + [’example’, ’new’]
li -> [’a’, ’b’, ’mpilgrim’, ’example’, ’new’]
Elementy listy moga˛ być dowolnego typu
Listy SA˛ UPORZADKOWANE
˛
Wiecej
˛
metod: remove, push, pop, index . . .
Tomasz Łukaszuk (WI PB)
Python
04-10-2014
25 / 31
Kodowanie w pythonie
Kontenery
Wyrażenia listowe
Wygodny sposób na tworzenie list
Wyrażenie listowe składa sie˛ z wyrażenia, nastepuj
˛ acej
˛ po nim
klauzuli for, a potem zero lub wiecej
˛
klauzul for lub if.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
vec1 = [2, 4, 6]
vec2 = [4, 3, -9]
[(x, x**2) for x in vec1]
-> [(2, 4), (4, 16), (6, 36)]
[x*y for x in vec1 for y in vec2]
-> [8, 6, -18, 16, 12, -36, 24, 18, -54]
[x+y for x in vec1 for y in vec2]
-> [6, 5, -7, 8, 7, -5, 10, 9, -3]
[vec1[i]*vec2[i] for i in range(len(vec1))]
-> [8, 12, -54]
Tomasz Łukaszuk (WI PB)
Python
04-10-2014
26 / 31
Kodowanie w pythonie
Kontenery
Krotki (Tuples)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
t = ("a", "b", "mpilgrim", "z", "example")
t -> (’a’, ’b’, ’mpilgrim’, ’z’, ’example’)
t[0]
-> ’a’
t[-1]
-> ’example’
t[1:3]
-> (’b’, ’mpilgrim’)
"z" in t
-> True
Elementy krotki moga˛ być dowolnego typu
Krotki SA˛ UPORZADKOWANE
˛
Krotki nie posiadaja˛ metod i sa˛ niezmienialne . . .
. . . ale elementy krotki moga˛ być!
Tomasz Łukaszuk (WI PB)
Python
04-10-2014
27 / 31
Kodowanie w pythonie
Kontenery
Zbiory (Sets)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
s1 = set([’one’, ’two’, ’three’])
s2 = set([’two’, ’three’, 4])
s1 | s2
-> set([4, ’two’, ’three’, ’one’])
s1 ^ s2
-> set([4, ’one’])
s1 & s2
-> set([’two’, ’three’])
s1 - s2
-> set([’one’])
Obiekt zbiór jest nieuporzadkowan
˛
a˛ kolekcja˛ niezmienialnych
wartości
Przydatne do testowania przynależności, usuwania duplikatów z
sekwencji i obliczania działań matematycznych, takich jak
przeciecie,
˛
różnica zbiorów i różnica symetryczna.
Tomasz Łukaszuk (WI PB)
Python
04-10-2014
28 / 31
Kodowanie w pythonie
Kontenery
——- Zadania praktyczne 3 ———
1) Napisz procedure˛ histogram(), która pobiera liste˛ liczb
całkowitych i rysuje na ekranie histogram. Na przykład,
histogram([4, 9, 7]) powinien dać nastepuj
˛ acy
˛ wynik:
****
*********
*******
def histogram(list):
...
end
Tomasz Łukaszuk (WI PB)
Python
04-10-2014
29 / 31
Kodowanie w pythonie
Kontenery
——- Zadania praktyczne 3 ———
2) Napisz funkcje˛ find_longest_word(), która pobiera liste˛ słów i
zwraca najdłuższe z nich.
def find_longest_word(slowa):
...
end
print find_longest_word(["ala","kaloryfer","szkola"])
-> kaloryfer
Tomasz Łukaszuk (WI PB)
Python
04-10-2014
30 / 31
Kodowanie w pythonie
Kontenery
——- Zadania praktyczne 3 ———
3) W kryptografii, szyfr Cezara jest bardzo prosta˛ technika˛ szyfrowania, w którym
każda litera w tekście jest zastepowana
˛
przez litere˛ znajdujac
˛ a˛ sie˛ w alfabecie
ustalona˛ liczbe˛ pozycji za nia.
˛ Na przykład, przy przesunieciu
˛
3, A zostanie
zastapiona
˛
przez D, B stanie sie˛ E, i tak dalej. Metoda nazywa sie˛ tak po Juliuszu
Cezarze, który używał jej do komunikowania sie˛ ze swoimi generałami. ROT-13
("obróć o 13 miejsc") jest powszechnie stosowanym przykładem szyfru Cezara, w
którym przesuniecie
˛
ma wartość 13. W Pythonie klucz ROT-13 może być
reprezentowany za pomoca˛ nastepuj
˛ acego
˛
słownika:
key = {’a’:’n’,
’i’:’v’,
’q’:’d’,
’y’:’l’,
’G’:’T’,
’O’:’B’,
’W’:’J’,
’b’:’o’,
’j’:’w’,
’r’:’e’,
’z’:’m’,
’H’:’U’,
’P’:’C’,
’X’:’K’,
’c’:’p’,
’k’:’x’,
’s’:’f’,
’A’:’N’,
’I’:’V’,
’Q’:’D’,
’Y’:’L’,
’d’:’q’,
’l’:’y’,
’t’:’g’,
’B’:’O’,
’J’:’W’,
’R’:’E’,
’Z’:’M’}
’e’:’r’,
’m’:’z’,
’u’:’h’,
’C’:’P’,
’K’:’X’,
’S’:’F’,
’f’:’s’,
’n’:’a’,
’v’:’i’,
’D’:’Q’,
’L’:’Y’,
’T’:’G’,
’g’:’
’o’:’
’w’:’
’E’:’
’M’:’
’U’:’
Twoim zadaniem jest napisanie kodera/dekodera ROT-13. Kiedy skończysz, bedziesz
˛
mógł przeczytać nastepuj
˛ ac
˛ a˛ tajna˛ wiadomość:
Pnrfne pvcure?
Tomasz Łukaszuk (WI PB)
V zhpu cersre Pnrfne fnynq!
Python
04-10-2014
31 / 31