Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
1
Wprowadzenie
Wprowadzenie
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
2
Plan prezentacji
Plan prezentacji
●
Głębsze poznanie języka
Głębsze poznanie języka
–
Zmienne
Zmienne
–
String, Unicode, Listy, Słowniki
String, Unicode, Listy, Słowniki
–
Funkcje, Klasy, Wyjątki
Funkcje, Klasy, Wyjątki
–
Budowanie modułów
Budowanie modułów
–
Dokumentowanie kodu
Dokumentowanie kodu
–
Introspekcje
Introspekcje
–
Refleksje
Refleksje
●
Filozofia języka
Filozofia języka
–
The Zen of Python (PEP 20)
The Zen of Python (PEP 20)
–
Coding Standards (PEP 8)
Coding Standards (PEP 8)
●
Narzędzia
Narzędzia
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
3
Zmienne w języku Python
Zmienne w języku Python
●
Nazwy bazują na ASCII
Nazwy bazują na ASCII
●
Nieograniczona długość nazw zmiennych
Nieograniczona długość nazw zmiennych
●
Garbage Collector
Garbage Collector
●
Rozróżnianie wielkości liter w nazwach
Rozróżnianie wielkości liter w nazwach
●
Case significant
Case significant
●
Nazwy zarezerwowane przez słowa kluczowe:
Nazwy zarezerwowane przez słowa kluczowe:
and, del, from, not, while, as, elif, global, or, with, assert, else, if, pass, yield, break, except, import, print,
and, del, from, not, while, as, elif, global, or, with, assert, else, if, pass, yield, break, except, import, print,
class, exec, in, raise, continue, finally, is, return, def, for, lambda, try,
class, exec, in, raise, continue, finally, is, return, def, for, lambda, try,
None
None
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
4
Podstawowe operacje
Podstawowe operacje
●
Przypisanie
Przypisanie
liczba = 2; urzad = 'pocztowy'; zespolona = 1 + 1j
liczba = 2; urzad = 'pocztowy'; zespolona = 1 + 1j
●
Przypisanie wartości więcej niż jednej zmiennej
Przypisanie wartości więcej niż jednej zmiennej
a = b =c = 10
a = b =c = 10
●
Przypisanie wartości innej zmiennej
Przypisanie wartości innej zmiennej
kopia_liczby = liczba, znaczek = urzad
kopia_liczby = liczba, znaczek = urzad
●
Zamiana wartości miejscami
Zamiana wartości miejscami
znaczek, liczba = liczba, znaczek
znaczek, liczba = liczba, znaczek
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
5
Podstawowe operacje
Podstawowe operacje
●
Usunięcie zmiennej
Usunięcie zmiennej
del kopia_liczby; del urzad # znaczek nadal istnieje
del kopia_liczby; del urzad # znaczek nadal istnieje
●
Użycie niedozwolonej nazwy powoduje błąd
Użycie niedozwolonej nazwy powoduje błąd
niedozwolona spacja = 'napis'; 7spacji = ' ' * 7; try = napis
niedozwolona spacja = 'napis'; 7spacji = ' ' * 7; try = napis
SyntaxError
SyntaxError
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
6
Zmienne w języku Python 3000
Zmienne w języku Python 3000
●
Nazwy bazują na Unicode
Nazwy bazują na Unicode
●
Zarezerwowane słowa kluczowe
Zarezerwowane słowa kluczowe
False, class, finally, is, return, None, continue, for, lambda, try, True, def, from, nonlocal, while, and, del,
False, class, finally, is, return, None, continue, for, lambda, try, True, def, from, nonlocal, while, and, del,
global, not, with, as, elif, if, or, yield, assert, else, import, pass, break, except, in, raise
global, not, with, as, elif, if, or, yield, assert, else, import, pass, break, except, in, raise
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
7
Wartości True i False
Wartości True i False
●
Wartości Fałszywe
Wartości Fałszywe
–
False
False
–
None
None
–
Numeryczne zero dowolnego typu
Numeryczne zero dowolnego typu
–
Pusty string lub kontener: krotka, lista,
Pusty string lub kontener: krotka, lista,
słownik, zbiór lub zbiór zamrożony
słownik, zbiór lub zbiór zamrożony
–
Obiekty użytkownika metoda __nonzero__()
–
Obiekty użytkownika metoda __nonzero__()
–
http://docs.python.org/reference/expressions.html#boolean-operations
http://docs.python.org/reference/expressions.html#boolean-operations
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
8
Surowe (raw) Stringi
Surowe (raw) Stringi
●
print A\nZ
”
”
print A\nZ
”
”
●
print 'A\nZ'
print 'A\nZ'
●
A\nZ
”””
”””
A\nZ
”””
”””
Raw strings
Raw strings
●
print r'A\nZ'
print r'A\nZ'
●
print r A\nZ
”
”
print r A\nZ
”
”
●
print r
A\nZ
”””
”””
print r
A\nZ
”””
”””
A
A
Z
Z
A
A
Z
Z
A
A
Z
Z
A\nZ
A\nZ
A\nZ
A\nZ
A\nZ
A\nZ
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
9
Unicode hak na ogonki
–
Unicode hak na ogonki
–
●
len('ą')
len('ą')
>>> 'ą'
>>> 'ą'
Unicode
Unicode
●
len (u'ą')
len (u'ą')
●
>>> u'ą'
>>> u'ą'
2
2
'\xc4\x85'
'\xc4\x85'
1
1
u'\u0105'
u'\u0105'
http://docs.python.org/reference/lexical_analysis.html#literals
http://docs.python.org/reference/lexical_analysis.html#literals
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
10
String to też obiekt
String to też obiekt
napis = 'ala ma kota.'
napis = 'ala ma kota.'
Powiększenie pierwszej litery
Powiększenie pierwszej litery
napis.capitalize()
napis.capitalize()
# 'Ala ma kota.'
# 'Ala ma kota.'
Wycentrowanie tekstu
Wycentrowanie tekstu
(ljust, rjust)
(ljust, rjust)
napis.center(20)
napis.center(20)
# ' Ala ma kota. '
# ' Ala ma kota. '
Zliczenie wystąpień znaków
Zliczenie wystąpień znaków
napis.count('a')
napis.count('a')
# 4
# 4
Kodowanie napisu
Kodowanie napisu
(decode)
(decode)
napis.encode('iso8859-2')
napis.encode('iso8859-2')
# 'ala ma kota'
# 'ala ma kota'
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
11
String to też obiekt
String to też obiekt
Sprawdzenie czy jest zakończony na
Sprawdzenie czy jest zakończony na
(startswith)
(startswith)
napis.endswith('kota.')
napis.endswith('kota.')
# True
# True
Zamiana tabulatorów na spacje
Zamiana tabulatorów na spacje
'tab\ttab'.expandtab(1)
'tab\ttab'.expandtab(1)
# 'tab tab'
# 'tab tab'
Znalezienie miejsca pierwszego wystąpienia
Znalezienie miejsca pierwszego wystąpienia
(index, rfind, rindex)
(index, rfind, rindex)
napis.find('ma')
napis.find('ma')
# 4
# 4
Sprawdzenie czy alfanumeryczny
Sprawdzenie czy alfanumeryczny
(isalnum, isdigit, islower,
(isalnum, isdigit, islower,
isupper, isspace, istitle; unicode: isnumeric, isdecimal)
isupper, isspace, istitle; unicode: isnumeric, isdecimal)
'77A'.isalnum()
'77A'.isalnum()
# True
# True
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
12
String to też obiekt
String to też obiekt
Wycinanie znaków z początku i końca
Wycinanie znaków z początku i końca
(lstrip, rstrip)
(lstrip, rstrip)
napis.strip('a.')
napis.strip('a.')
# 'la ma kota'
# 'la ma kota'
Dzielenie stringu na dwie części
Dzielenie stringu na dwie części
(split, splitlines, rsplit,
(split, splitlines, rsplit,
rpartition)
rpartition)
napis.partition('ma')
napis.partition('ma')
# ('ala', 'ma', 'kota.')
# ('ala', 'ma', 'kota.')
Podmiana fragmentu
Podmiana fragmentu
napis.replace('ala', 'Ela')
napis.replace('ala', 'Ela')
# Ela ma kota.'
# Ela ma kota.'
Zmiana na tytuł
Zmiana na tytuł
(lower, upper, swapcase)
(lower, upper, swapcase)
napis.title()
napis.title()
# 'Ala Ma Kota.'
# 'Ala Ma Kota.'
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
13
Operacje na stringach
Operacje na stringach
Konkatencja stringów
Konkatencja stringów
'Ala' Ma
Kota
”
” ”””
”””
'Ala' Ma
Kota
”
” ”””
”””
# 'AlaMaKota'
# 'AlaMaKota'
Konwersja na string
Konwersja na string
str(cokolwiek)
str(cokolwiek)
Operator konkatencji
Operator konkatencji
'Ala ma ' + str(2) + koty.
„
”
'Ala ma ' + str(2) + koty.
„
”
# 'Ala ma 2 koty'
# 'Ala ma 2 koty'
Operator powielania
Operator powielania
'la'*7
'la'*7
# 'lalalalalalala'
# 'lalalalalalala'
napis.replace('ala', 'Ala').replace('.', ' i psa.') # Ala ma kota i psa.
napis.replace('ala', 'Ala').replace('.', ' i psa.') # Ala ma kota i psa.
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
14
Formatowanie stringów
Formatowanie stringów
Podawanie kolejnych parametrów:
Podawanie kolejnych parametrów:
”
”
Podajemy {0} paramet{1} .format('kolejne', 'ry')
”
Podajemy {0} paramet{1} .format('kolejne', 'ry')
”
# Podajemy kolejne parametry
# Podajemy kolejne parametry
Parametry nazwane
Parametry nazwane
”
”
Nazwa {param} .format(param='parametru.')
”
Nazwa {param} .format(param='parametru.')
”
# Nazwa parametru
# Nazwa parametru
Parametry obiektu
Parametry obiektu
class Person(object):
class Person(object):
def __init__(self):
def __init__(self):
self.firstname = 'Jan'
self.firstname = 'Jan'
self.lastname = 'Koprowski'
self.lastname = 'Koprowski'
person = Person()
person = Person()
'Dzień dobry. Nazywam się {0.firstname} {0.lastname}'.format(person)
'Dzień dobry. Nazywam się {0.firstname} {0.lastname}'.format(person)
http://docs.python.org/library/stdtypes.html#string-formatting
http://docs.python.org/library/stdtypes.html#string-formatting
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
15
Dostęp do poszczególnych fragmentów
Dostęp do poszczególnych fragmentów
Pojedynczy znak (liczymy od 0)
Pojedynczy znak (liczymy od 0)
napis[4]
napis[4]
# 'm'
# 'm'
Zakres (liczymy od 0)
Zakres (liczymy od 0)
napis[4:6]
napis[4:6]
# 'ma'
# 'ma'
Pojedynczy znak od końca
Pojedynczy znak od końca
napis[-5]
napis[-5]
# 'k'
# 'k'
Zakres licząc od końca
Zakres licząc od końca
napis[-5:-1]
napis[-5:-1]
# 'kota'
# 'kota'
napis[-5:]
napis[-5:]
# 'kota.'
# 'kota.'
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
16
Wyrażenia regularne
Wyrażenia regularne
import re
import re
tekst = 'Mama Ali ma kota i psa.'
tekst = 'Mama Ali ma kota i psa.'
Znajdowanie wszystkich wystąpień wzorca
Znajdowanie wszystkich wystąpień wzorca
re.findall(r'ma', tekst)
re.findall(r'ma', tekst)
# ['ma', 'ma']
# ['ma', 'ma']
Zamiana fragmentu wyrażenia
Zamiana fragmentu wyrażenia
re.sub('Mama', 'Tata', napis)
re.sub('Mama', 'Tata', napis)
# 'Tata Ali ma kota i psa.'
# 'Tata Ali ma kota i psa.'
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
17
Uwaga !
Uwaga !
Pamiętaj ! Przy modyfikacji stringu
Pamiętaj ! Przy modyfikacji stringu
zwracana jest kopia obiektu.
zwracana jest kopia obiektu.
Oryginalna zmienna nie ulega
Oryginalna zmienna nie ulega
modyfikacji !
modyfikacji !
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
18
Modyfikacja list
Modyfikacja list
lista = ('a', 'b', 'c')
lista = ('a', 'b', 'c')
Dodawanie nowych elementów
Dodawanie nowych elementów
lista.append('d')
lista.append('d')
# ['a' 'b', 'c', 'd']
# ['a' 'b', 'c', 'd']
Rozszerzanie listy o listę nowych elementów
Rozszerzanie listy o listę nowych elementów
lista.extend(['e', 'f', 'g'])
lista.extend(['e', 'f', 'g'])
# ['a' 'b', 'c', 'd', 'e', 'f', 'g']
# ['a' 'b', 'c', 'd', 'e', 'f', 'g']
Dodanie elementu na zdefiniowanej pozycji
Dodanie elementu na zdefiniowanej pozycji
lista.insert(0, '0')
lista.insert(0, '0')
# ['0', 'a' 'b', 'c', 'd', 'e', 'f', 'g']
# ['0', 'a' 'b', 'c', 'd', 'e', 'f', 'g']
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
19
Modyfikacja list
Modyfikacja list
Usunięcie zadanego elementu
Usunięcie zadanego elementu
lista.remove('0')
lista.remove('0')
# ['a' 'b', 'c', 'd', 'e', 'f']
# ['a' 'b', 'c', 'd', 'e', 'f']
Usunięcie ostatniego elementu
Usunięcie ostatniego elementu
lista.remove('0')
lista.remove('0')
# ['a' 'b', 'c', 'd', 'e']
# ['a' 'b', 'c', 'd', 'e']
Odwrócenie kolejności
Odwrócenie kolejności
lista.reverse(6)
lista.reverse(6)
# ['e', 'd', 'c', 'b', 'a']
# ['e', 'd', 'c', 'b', 'a']
Sortowanie listy
Sortowanie listy
lista.sort()
lista.sort()
# ['a' 'b', 'c', 'd', 'e']
# ['a' 'b', 'c', 'd', 'e']
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
20
Modyfikacja list
Modyfikacja list
Pobranie indeksu zadanego elementu
Pobranie indeksu zadanego elementu
lista.index('d')
lista.index('d')
# 3
# 3
Ilość elementów listy
Ilość elementów listy
lista.count()
lista.count()
# 6
# 6
http://docs.python.org/library/stdtypes.html#sequence-types-str-unicode-list-tuple-buffer-xrange
http://docs.python.org/library/stdtypes.html#sequence-types-str-unicode-list-tuple-buffer-xrange
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
21
Modyfikacja słowników
Modyfikacja słowników
Dodawanie elementów
Dodawanie elementów
dict.update({'d': 'D'})
dict.update({'d': 'D'})
# {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'}
# {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'}
Usunięcie wartości o zadanym kluczu
Usunięcie wartości o zadanym kluczu
dict.pop('d')
dict.pop('d')
# {'a': 'A', 'b': 'B', 'c': 'C'}
# {'a': 'A', 'b': 'B', 'c': 'C'}
Usunięcie pierwszego elementu
Usunięcie pierwszego elementu
dict.popitem()
dict.popitem()
# {'b': 'B', 'c': 'C'}
# {'b': 'B', 'c': 'C'}
Wyczyszczenie słownika
Wyczyszczenie słownika
dict.clear()
dict.clear()
# {}
# {}
h
ttp
://d
ocs.
pyt
h
on
.o
rg
/lib
ra
ry
/st
dtyp
es.
htm
l#
d
ict
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
22
Modyfikacja słowników
Modyfikacja słowników
dict = {'a': 'A', 'b': 'B', 'c': 'C'}
dict = {'a': 'A', 'b': 'B', 'c': 'C'}
Pobranie wyłącznie kluczy
Pobranie wyłącznie kluczy
(iterkeys)
(iterkeys)
dict.keys()
dict.keys()
# ['a', 'b', 'c']
# ['a', 'b', 'c']
Pobranie wartości
Pobranie wartości
(itervalues)
(itervalues)
dict.values()
dict.values()
# ['A', 'B', 'C']
# ['A', 'B', 'C']
Pobranie elementów
Pobranie elementów
(iteritems)
(iteritems)
dict.items()
dict.items()
# [('a', 'A'), ('b', 'B'), ('c', 'C')]
# [('a', 'A'), ('b', 'B'), ('c', 'C')]
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
23
Modyfikacja słowników
Modyfikacja słowników
●
items() - kopia, iteritems() - kolejne elementy
items() - kopia, iteritems() - kolejne elementy
●
Przy użyciu iteritems(), iterkeys(), itervalues()
Przy użyciu iteritems(), iterkeys(), itervalues()
oszczędzasz pamięć co może być krytyczne,
oszczędzasz pamięć co może być krytyczne,
szczególnie dla dużych obiektów.
szczególnie dla dużych obiektów.
●
W module itertools specjalne wersje funkcji dla
W module itertools specjalne wersje funkcji dla
stosowania iteratorów.
stosowania iteratorów.
●
W Pytonie 3000 wyłącznie iteratory
W Pytonie 3000 wyłącznie iteratory
http://docs.python.org/library/itertools.html#module-itertools
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
24
Uwaga !
Uwaga !
Pamiętaj ! Działania na listach i
Pamiętaj ! Działania na listach i
słownikach modyfikują obiekt, na
słownikach modyfikują obiekt, na
którym są wykonywane.
którym są wykonywane.
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
25
Parametry domyślne
Parametry domyślne
Dla dowolnego parametru funkcji możesz
Dla dowolnego parametru funkcji możesz
zdefiniować wartość domyślną
zdefiniować wartość domyślną
def dane(imie='Jan', nazwisko='Kowalski', wiek=55):
def dane(imie='Jan', nazwisko='Kowalski', wiek=55):
print imie + + nazwisko + ', ' + str(wiek)
” ”
print imie + + nazwisko + ', ' + str(wiek)
” ”
dane()
dane()
# Jan Kowalski, 55
# Jan Kowalski, 55
dane('Joanna', 'd'Arc', 597)
dane('Joanna', 'd'Arc', 597)
# Joanna d'Arc, 597
# Joanna d'Arc, 597
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
26
Parametry nazwane
Parametry nazwane
Możesz przekazywać jedynie wybrane parametry
Możesz przekazywać jedynie wybrane parametry
podając ich nazwy
podając ich nazwy
def dane(imie='Jan', nazwisko='Kowalski', wiek=55):
def dane(imie='Jan', nazwisko='Kowalski', wiek=55):
print imie + + nazwisko + ', ' + str(wiek)
” ”
print imie + + nazwisko + ', ' + str(wiek)
” ”
dane(nazwisko='Kowalski junior', wiek=16)
dane(nazwisko='Kowalski junior', wiek=16)
# Jan Kowalski junior, 16
# Jan Kowalski junior, 16
http://docs.python.org/tutorial/controlflow.html#more-on-defining-functions
http://docs.python.org/tutorial/controlflow.html#more-on-defining-functions
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
27
Funkcje i argumenty (tuple)
Funkcje i argumenty (tuple)
Funkcja może jako swój parametr pobrać krotkę
Funkcja może jako swój parametr pobrać krotkę
argumentów
argumentów
def suma(*args):
def suma(*args):
wynik = 0
wynik = 0
for skladnik in args:
for skladnik in args:
wynik += skladnik
wynik += skladnik
return wynik
return wynik
suma(1,2,3,4,5,6,7)
suma(1,2,3,4,5,6,7)
# 28
# 28
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
28
Funkcje i argumenty (dictionary)
Funkcje i argumenty (dictionary)
Funkcja może potraktować przekazane argumenty
Funkcja może potraktować przekazane argumenty
jako słownik: {nazwa_parametru: wartość}
jako słownik: {nazwa_parametru: wartość}
def showfunction(**kwargs):
def showfunction(**kwargs):
for key, value in kwargs.iteritems():
for key, value in kwargs.iteritems():
print key + ': ' + value
print key + ': ' + value
showfunction(secret='password', imie='Jan', nazwisko='Kowalski')
showfunction(secret='password', imie='Jan', nazwisko='Kowalski')
# imie: Jan
# imie: Jan
# nazwisko: Kowalski
# nazwisko: Kowalski
# secret: password
# secret: password
http://docs.python.org/reference/compound_stmts.html#function-definitions
http://docs.python.org/reference/compound_stmts.html#function-definitions
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
29
Zmienna funkcja :)
Zmienna funkcja :)
Możesz przypisywać funkcjom inne nazwy
Możesz przypisywać funkcjom inne nazwy
import math
import math
pierwiastek = math.sqrt
pierwiastek = math.sqrt
pierwiastek(4)
pierwiastek(4)
# 2.0
# 2.0
Możesz tworzyć funkcja zwracające wartości bez
Możesz tworzyć funkcja zwracające wartości bez
używania def
używania def
sum2=lambda x,y: x+y
sum2=lambda x,y: x+y
sum2(3,4)
sum2(3,4)
# 7
# 7
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
30
Klasy garść informacji
–
Klasy garść informacji
–
Każda klasa dziedziczy po object
Każda klasa dziedziczy po object
class Person(object):
class Person(object):
pass
pass
Każda metoda jako pierwszy parametr przyjmuje
Każda metoda jako pierwszy parametr przyjmuje
obiekt, w którym jest zdefiniowana
obiekt, w którym jest zdefiniowana
class Person(object):
class Person(object):
def wyswietl_napis(self):
def wyswietl_napis(self):
print 'Napis'
print 'Napis'
Python wspiera wielodziedziczenie
Python wspiera wielodziedziczenie
class Amfibia(Lodz,Samochod):
class Amfibia(Lodz,Samochod):
pass
pass
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
31
Klasy - konstruktor i destruktor
Klasy - konstruktor i destruktor
class Person(object):
class Person(object):
counter = 0
counter = 0
def __init__(self):
def __init__(self):
# konstruktor
# konstruktor
print 'Jestem konstruktorem'
print 'Jestem konstruktorem'
def __del__(self):
def __del__(self):
# destruktor
# destruktor
print 'Jestem destruktorem'
print 'Jestem destruktorem'
p = Person()
p = Person()
# Jestem konstruktorem
# Jestem konstruktorem
del p
del p
# Jestem destruktorem
# Jestem destruktorem
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
32
Klasy atrybuty klasy i instancji
–
Klasy atrybuty klasy i instancji
–
Zmienne instancji definiujemy w konstruktorze
Zmienne instancji definiujemy w konstruktorze
class Person(object):
class Person(object):
def __init__(self):
def __init__(self):
self.firstname = 'Jan'
self.firstname = 'Jan'
self.lastname = 'Kowalski'
self.lastname = 'Kowalski'
Zmienne klasy definiujemy zaraz po jej definicji
Zmienne klasy definiujemy zaraz po jej definicji
class Person(object):
class Person(object):
counter = 0
counter = 0
Nazwy elementów prywatnych zaczynamy od __
Nazwy elementów prywatnych zaczynamy od __
class Person(object):
class Person(object):
__private_field = 'top secret'
__private_field = 'top secret'
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
33
Klasy zmienne statyczne
–
Klasy zmienne statyczne
–
class Person(object):
class Person(object):
counter = 0
counter = 0
def __init__(self):
def __init__(self):
Person.counter += 1
Person.counter += 1
def __del__(self):
def __del__(self):
Person.counter -= 1
Person.counter -= 1
p1 = Person()
p1 = Person()
p2 = Person()
p2 = Person()
p1.counter
p1.counter
# 2
# 2
del p1
del p1
p2.counter
p2.counter
# 1
# 1
Zmienne klasy działają jak zmienne statyczne
Zmienne klasy działają jak zmienne statyczne
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
34
Klasy metody statyczne
–
Klasy metody statyczne
–
Metody statyczne definiujemy poprzedzając je
Metody statyczne definiujemy poprzedzając je
nazwą @staticmethod oraz nie podając
nazwą @staticmethod oraz nie podając
parametru self
parametru self
class Person(object):
class Person(object):
@staticmethod
@staticmethod
def wypisz_napis():
def wypisz_napis():
print 'Napis'
print 'Napis'
Person.wypisz_napis()
Person.wypisz_napis()
# Napis
# Napis
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
35
Klasy metody prywatne
–
Klasy metody prywatne
–
Nazwy metod prywatnych ropoczynamy od
Nazwy metod prywatnych ropoczynamy od
dwóch podkreślników __
dwóch podkreślników __
class Person(object):
class Person(object):
def __top_secret_method():
def __top_secret_method():
print 'Secret information'
print 'Secret information'
p = Person()
p = Person()
p.__top_secret_method()
p.__top_secret_method()
# Attribute Error: 'Person' object has no attribute
# Attribute Error: 'Person' object has no attribute
'__top_secret_method'
'__top_secret_method'
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
36
Klasy dostęp do przodka
–
Klasy dostęp do przodka
–
Dostęp do przodka uzyskujemy poprzez metodę
Dostęp do przodka uzyskujemy poprzez metodę
super()
super()
class ABC(object):
class ABC(object):
def A(self):
def A(self):
print 'A from ABC'
print 'A from ABC'
class A(ABC):
class A(ABC):
def A(self):
def A(self):
super(A, self).A()
super(A, self).A()
a = A()
a = A()
a.A()
a.A()
# 'A from ABC'
# 'A from ABC'
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
37
Klasy enkapsulacja
–
Klasy enkapsulacja
–
class Klasa(object):
class Klasa(object):
def __init__(self):
def __init__(self):
self.__x = None
self.__x = None
def getx(self):
def getx(self):
return self.__x
return self.__x
def setx(self, value):
def setx(self, value):
self._x = value
self._x = value
def delx(self):
def delx(self):
del self.__x
del self.__x
x = property(getx, setx, delx, 'Zmienna x');
x = property(getx, setx, delx, 'Zmienna x');
klasa = Klasa()
klasa = Klasa()
klasa.x = 12 # klasa.setx(12)
klasa.x = 12 # klasa.setx(12)
print klasa.x # print klasa.getx()
print klasa.x # print klasa.getx()
del klasa.x # klasa.delx()
del klasa.x # klasa.delx()
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
38
Wyłapywanie: try - except
Wyłapywanie: try - except
Wyjątek wyłapujemy używając except
Wyjątek wyłapujemy używając except
try:
try:
open('/etc/shadow')
open('/etc/shadow')
except IOError, (errno, strerror):
except IOError, (errno, strerror):
print u'Wystąpił błąd numer ' + str(errno) + ': ' + strerror
print u'Wystąpił błąd numer ' + str(errno) + ': ' + strerror
Wystąpił błąd
Wystąpił błąd
Wystąpił błąd numer 13: Permission denide
Wystąpił błąd numer 13: Permission denide
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
39
Wyjątki: try except - else
–
Wyjątki: try except - else
–
Gdy nie wystąpi wyjątek - else
Gdy nie wystąpi wyjątek - else
try:
try:
open('/etc/shadow')
open('/etc/shadow')
except IOError, (errno, strerror):
except IOError, (errno, strerror):
print u'Wystąpił błąd numer ' + str(errno) + ': ' + strerror
print u'Wystąpił błąd numer ' + str(errno) + ': ' + strerror
else:
else:
print u'Plik /etc/shadow otwarty pomyślnie'
print u'Plik /etc/shadow otwarty pomyślnie'
Wystąpił błąd
Wystąpił błąd
Wystąpił błąd numer 13: Permission denide
Wystąpił błąd numer 13: Permission denide
Nie było błędu
Nie było błędu
Plik /etc/shadow otwarty pomyślnie
Plik /etc/shadow otwarty pomyślnie
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
40
Wyjątki: try except else - finally
–
–
Wyjątki: try except else - finally
–
–
try:
try:
open('/etc/shadow')
open('/etc/shadow')
except IOError, (errno, strerror):
except IOError, (errno, strerror):
print u'Wystąpił błąd numer ' + str(errno) + ': ' + strerror
print u'Wystąpił błąd numer ' + str(errno) + ': ' + strerror
else:
else:
print u'Plik /etc/shadow otwarty pomyślnie'
print u'Plik /etc/shadow otwarty pomyślnie'
finally:
finally:
print u'Ja wykonam się zawsze'
print u'Ja wykonam się zawsze'
Wystąpił błąd
Wystąpił błąd
Wystąpił błąd numer 13: Permission denide
Wystąpił błąd numer 13: Permission denide
Ja wykonam się zawsze
Ja wykonam się zawsze
Nie było błędu
Nie było błędu
Plik /etc/shadow otwarty pomyślnie
Plik /etc/shadow otwarty pomyślnie
Ja wykonam się zawsze
Ja wykonam się zawsze
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
41
Wyjątki kilka wyjątków jednocześnie
–
Wyjątki kilka wyjątków jednocześnie
–
try:
try:
open('/etc/shadow')
open('/etc/shadow')
print dict['klucz']
print dict['klucz']
except IOError:
except IOError:
print u'Błąd otwarcia pliku'
print u'Błąd otwarcia pliku'
except KeyError:
except KeyError:
print u'Błąd dostępu do słownika'
print u'Błąd dostępu do słownika'
else:
else:
print u'Nie wystąpiły błędy'
print u'Nie wystąpiły błędy'
try:
try:
open('/etc/shadow')
open('/etc/shadow')
print dict['klucz']
print dict['klucz']
except (IOError, KeyError):
except (IOError, KeyError):
print u'Wystąpił błąd'
print u'Wystąpił błąd'
else:
else:
print u'Nie wystąpiły błędy'
print u'Nie wystąpiły błędy'
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
42
Wyjątki Tworzenie własnego wyjątku
–
Wyjątki Tworzenie własnego wyjątku
–
class MojWyjatek(Exception):
class MojWyjatek(Exception):
pass
pass
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
43
Wyjątki Zgłaszanie wyjątku
–
Wyjątki Zgłaszanie wyjątku
–
class MojWyjatek(Exception):
class MojWyjatek(Exception):
pass
pass
def zglos():
def zglos():
raise MojWyjatek(u'Masz problem')
raise MojWyjatek(u'Masz problem')
return 0
return 0
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
44
Wyjątki Zgłaszanie wyjątku
–
Wyjątki Zgłaszanie wyjątku
–
class MojWyjatek(Exception):
class MojWyjatek(Exception):
pass
pass
def zglos():
def zglos():
raise MojWyjatek(u'Masz problem')
raise MojWyjatek(u'Masz problem')
return 0
return 0
try:
try:
zglos()
zglos()
except MojWyjatek, strerror:
except MojWyjatek, strerror:
print strerror
print strerror
# Masz problem
# Masz problem
http://docs.python.org/tutorial/errors.html#user-defined-exceptions
http://docs.python.org/tutorial/errors.html#user-defined-exceptions
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
45
Importowanie modułów
Importowanie modułów
Importowanie modułu
Importowanie modułu
import math
import math
math.sqrt(4) # 2.0
math.sqrt(4) # 2.0
Importowanie z modułu
Importowanie z modułu
from math import sqrt, log
from math import sqrt, log
sqrt(4) # 2.0
sqrt(4) # 2.0
Importowanie modułu jako
Importowanie modułu jako
import math as ma
import math as ma
ma.sqrt(4) # 2.0
ma.sqrt(4) # 2.0
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
46
Plik to Twój moduł
Plik to Twój moduł
moje.py
moje.py
class Klasa(object):
class Klasa(object):
pass
pass
def funkcja():
def funkcja():
return ''
return ''
a = 'kuku'
a = 'kuku'
czyjes.py
czyjes.py
from moje import Klasa, funkcja, a
from moje import Klasa, funkcja, a
k = Klasa()
k = Klasa()
funkcja()
funkcja()
print a
print a
Każdy plik możesz zaimportować jako moduł.
Każdy plik możesz zaimportować jako moduł.
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
47
Dokumentowanie kodu
Dokumentowanie kodu
class MojaKlasa(object):
class MojaKlasa(object):
”””
”””
To jest moja klasa”””
To jest moja klasa”””
def metoda(self):
def metoda(self):
”””
”””
Wypisuje 'Napis'”””
Wypisuje 'Napis'”””
print 'Napis'
print 'Napis'
help(MojaKlasa)
help(MojaKlasa)
class MojaKlasa(__builtin__.object)
class MojaKlasa(__builtin__.object)
| To jest moja klasa
| To jest moja klasa
|
|
| Methods defined here:
| Methods defined here:
|
|
| metoda(self)
| metoda(self)
| Ta metoda wypisuje napisa 'Napis'
| Ta metoda wypisuje napisa 'Napis'
http://docs.python.org/tutorial/controlflow.html#documentation-strings
http://docs.python.org/tutorial/controlflow.html#documentation-strings
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
48
Introspekcje
Introspekcje
Informacje o obiekcie
Informacje o obiekcie
dir(obiekt)
dir(obiekt)
Dokumentacja obiektu, metody, funkcji
Dokumentacja obiektu, metody, funkcji
help(obiekt)
help(obiekt)
Sprawdzenie czy posiada atrybut
Sprawdzenie czy posiada atrybut
hasattr(obiekt, 'nazwa_atrybutu')
hasattr(obiekt, 'nazwa_atrybutu')
Pobranie atrybutu
Pobranie atrybutu
getattr(obiekt, 'nazwa_atrybutu')
getattr(obiekt, 'nazwa_atrybutu')
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
49
Introspekcje
Introspekcje
Sprawdzenie czy obiekt jest typu
Sprawdzenie czy obiekt jest typu
isinstance(obiekt, typ)
isinstance(obiekt, typ)
Sprawdzenie czy obiekt dziedziczy po
Sprawdzenie czy obiekt dziedziczy po
issubclass(obiekt, podtyp)
issubclass(obiekt, podtyp)
Sprawdzenie czy obiekt jest wykonywalny
Sprawdzenie czy obiekt jest wykonywalny
callable(obiekt)
callable(obiekt)
Lista słów kluczowych
Lista słów kluczowych
keywords
keywords
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
50
Introspekcje
Introspekcje
Lista obiektów wbudowanych
Lista obiektów wbudowanych
dir(__builtins__)
dir(__builtins__)
Dostęp do docstringów
Dostęp do docstringów
obiekt.__doc__
obiekt.__doc__
Nazwa obiektu
Nazwa obiektu
obiekt.__name__
obiekt.__name__
Pobieranie typu obiektu
Pobieranie typu obiektu
type(obiekt)
type(obiekt)
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
51
Introspekcje
Introspekcje
Sprawdzanie identyczności obiektów
Sprawdzanie identyczności obiektów
obiekt1 is obiekt2
obiekt1 is obiekt2
Dostęp do atrybutów obiektu
Dostęp do atrybutów obiektu
obiekt.__dict__
obiekt.__dict__
Lista przodków klasy
Lista przodków klasy
klasa.__bases__
klasa.__bases__
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
52
Introspekcje funkcji
Introspekcje funkcji
def fun(a, b=1, c=2, d=3):
def fun(a, b=1, c=2, d=3):
pass
pass
Nazwa funkcji
Nazwa funkcji
fun.func_name
fun.func_name
# fun
# fun
Dokumentacja funkcji
Dokumentacja funkcji
fun.func_doc
fun.func_doc
# ''
# ''
Domyślne wartości funkcji
Domyślne wartości funkcji
fun.func_defaults
fun.func_defaults
# (1,2,3)
# (1,2,3)
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
53
Introspekcje funkcji
Introspekcje funkcji
Obiekt kodu funkcji
Obiekt kodu funkcji
fun.func_code
fun.func_code
#
#
<code object fun at 0x98e8f08, file "<ipython console>", line 1>
<code object fun at 0x98e8f08, file "<ipython console>", line 1>
Liczba przyjmowanych argumentów
Liczba przyjmowanych argumentów
fun.func_code.co_argcount
fun.func_code.co_argcount
# 4
# 4
Liczba zmiennych łącznie z argumentami
Liczba zmiennych łącznie z argumentami
fun.func_code.co_nlocals
fun.func_code.co_nlocals
# 4
# 4
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
54
Introspekcje funkcji
Introspekcje funkcji
Nazwa pliku w którym znajduje się funkcja
Nazwa pliku w którym znajduje się funkcja
fun.func_code.co_filename
fun.func_code.co_filename
# '<ipython console>'
# '<ipython console>'
Nazwy argumentów i zmiennych lokalnych
Nazwy argumentów i zmiennych lokalnych
fun.func_code.co_varnames
fun.func_code.co_varnames
# ('a', 'b', 'c', 'd')
# ('a', 'b', 'c', 'd')
Dane o funkcji
Dane o funkcji
fun.func_code.co_flags
fun.func_code.co_flags
0x04 czy użyto *args
–
0x04 czy użyto *args
–
0x08 czy użyto **kwargs
–
0x08 czy użyto **kwargs
–
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
55
Refleksje
Refleksje
Wywołanie podczas przypisanie wartości
Wywołanie podczas przypisanie wartości
def __setattr__()
def __setattr__()
Wywołanie podczas pobierania wartości
Wywołanie podczas pobierania wartości
def __getattr__()
def __getattr__()
Wywołanie podczas usuwania wartości
Wywołanie podczas usuwania wartości
def __delattr__()
def __delattr__()
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
56
Refleksje
Refleksje
Wywołanie podczas zwracania obiektu
Wywołanie podczas zwracania obiektu
def __new__()
def __new__()
Wywołanie podczas wywołania obiektu
„
”
Wywołanie podczas wywołania obiektu
„
”
def __call__()
def __call__()
Wywołanie podczas użycia repr()
Wywołanie podczas użycia repr()
def __repr__()
def __repr__()
Wywołanie podczas użycia len()
Wywołanie podczas użycia len()
def __len__()
def __len__()
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
57
Refleksje Operatory
–
Refleksje Operatory
–
< object.__lt__(self, other)
< object.__lt__(self, other)
<= object.__le__(self, other)
<= object.__le__(self, other)
== object.__eq__(self, other)
== object.__eq__(self, other)
!= object.__ne__(self, other)
!= object.__ne__(self, other)
> object.__gt__(self, other)
> object.__gt__(self, other)
>= object.__ge__(self, other)
>= object.__ge__(self, other)
cmp() object.__cmp__(self, other)
cmp() object.__cmp__(self, other)
+ object.__add__(self, other)
+ object.__add__(self, other)
- object.__sub__(self, other)
- object.__sub__(self, other)
* object.__mul__(self, other)
* object.__mul__(self, other)
/ object.__div__(self, other)
/ object.__div__(self, other)
% object.__mod__(self, other)
% object.__mod__(self, other)
** object.__pow__(self, other)
** object.__pow__(self, other)
// object.__floordiv__(self, other)
// object.__floordiv__(self, other)
http://docs.python.org/reference/datamodel.html#special-method-names
http://docs.python.org/reference/datamodel.html#special-method-names
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
58
Programowanie funkcjonalne
Programowanie funkcjonalne
Lista wszystkich elementów lokalnych
Lista wszystkich elementów lokalnych
locals()
locals()
Lista wszystkich elementów globalnych
Lista wszystkich elementów globalnych
globals()
globals()
Przykład wywołania funkcji o zadanej nazwie
Przykład wywołania funkcji o zadanej nazwie
pobrana_funkcja = globals()['funkcja']
pobrana_funkcja = globals()['funkcja']
pobrana_funkcja()
pobrana_funkcja()
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
59
Programowanie funkcjonalne
Programowanie funkcjonalne
Definiowanie prostych funkcji - wyrażeń
Definiowanie prostych funkcji - wyrażeń
sum2 = lambda x,y: x+y
sum2 = lambda x,y: x+y
Wywołanie funkcji na każdym elemencie
Wywołanie funkcji na każdym elemencie
map(funkcja, sekwencja)
map(funkcja, sekwencja)
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
60
Programowanie funkcjonalne
Programowanie funkcjonalne
Konsolidacja danych
Konsolidacja danych
zip(sekwencja1, sekwencja2, ...)
zip(sekwencja1, sekwencja2, ...)
Odfiltrowanie danych dla których zwrócono True
Odfiltrowanie danych dla których zwrócono True
filter(funkcja, sekwencja)
filter(funkcja, sekwencja)
Zwrócenie funkcji zadanej dla sekwencji
Zwrócenie funkcji zadanej dla sekwencji
reduce(funkcja, sekwencja)
reduce(funkcja, sekwencja)
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
61
Filozofia języka
Filozofia języka
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
62
The Zen of Python
The Zen of Python
Beautiful is better than ugly.
Beautiful is better than ugly.
Explicit is better than implicit.
Explicit is better than implicit.
Simple is better than complex.
Simple is better than complex.
Complex is better than complicated.
Complex is better than complicated.
Flat is better than nested.
Flat is better than nested.
Sparse is better than dense.
Sparse is better than dense.
Readability counts.
Readability counts.
Special cases aren't special enough to break
Special cases aren't special enough to break
the rules.
the rules.
Although practicality beats purity.
Although practicality beats purity.
Errors should never pass silently.
Errors should never pass silently.
Unless explicitly silenced.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation
In the face of ambiguity, refuse the temptation
to guess.
to guess.
There should be one-- and preferably only one
There should be one-- and preferably only one
--obvious way to do it.
--obvious way to do it.
Although that way may not be obvious at first
Although that way may not be obvious at first
unless you're Dutch.
unless you're Dutch.
Now is better than never.
Now is better than never.
Although never is often better than *right* now.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a
If the implementation is hard to explain, it's a
bad idea.
bad idea.
If the implementation is easy to explain, it may
If the implementation is easy to explain, it may
be a good idea.
be a good idea.
Namespaces are one honking great idea -- let's
Namespaces are one honking great idea -- let's
do more of those!
do more of those!
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
63
The Zen of Python
The Zen of Python
Piękne jest lepsze niż brzydkie.
Piękne jest lepsze niż brzydkie.
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
64
The Zen of Python
The Zen of Python
Piękne jest lepsze niż brzydkie.
Piękne jest lepsze niż brzydkie.
Jawne jest lepsze niż domyślne.
Jawne jest lepsze niż domyślne.
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
65
The Zen of Python
The Zen of Python
Piękne jest lepsze niż brzydkie.
Piękne jest lepsze niż brzydkie.
Jawne jest lepsze niż domyślne.
Jawne jest lepsze niż domyślne.
Proste jest lepsze niż złożone.
Proste jest lepsze niż złożone.
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
66
The Zen of Python
The Zen of Python
Piękne jest lepsze niż brzydkie.
Piękne jest lepsze niż brzydkie.
Jawne jest lepsze niż domyślne.
Jawne jest lepsze niż domyślne.
Proste jest lepsze niż złożone.
Proste jest lepsze niż złożone.
Złożone jest lepsze niż skomplikowane.
Złożone jest lepsze niż skomplikowane.
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
67
The Zen of Python
The Zen of Python
Piękne jest lepsze niż brzydkie.
Piękne jest lepsze niż brzydkie.
Jawne jest lepsze niż domyślne.
Jawne jest lepsze niż domyślne.
Proste jest lepsze niż złożone.
Proste jest lepsze niż złożone.
Złożone jest lepsze niż skomplikowane.
Złożone jest lepsze niż skomplikowane.
Płaskie jest lepsze niż zagnieżdżone.
Płaskie jest lepsze niż zagnieżdżone.
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
68
The Zen of Python
The Zen of Python
Piękne jest lepsze niż brzydkie.
Piękne jest lepsze niż brzydkie.
Jawne jest lepsze niż domyślne.
Jawne jest lepsze niż domyślne.
Proste jest lepsze niż złożone.
Proste jest lepsze niż złożone.
Złożone jest lepsze niż skomplikowane.
Złożone jest lepsze niż skomplikowane.
Płaskie jest lepsze niż zagnieżdżone.
Płaskie jest lepsze niż zagnieżdżone.
Rzadkie jest lepsze niż zagęszczone.
Rzadkie jest lepsze niż zagęszczone.
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
69
The Zen of Python
The Zen of Python
Piękne jest lepsze niż brzydkie.
Piękne jest lepsze niż brzydkie.
Jawne jest lepsze niż domyślne.
Jawne jest lepsze niż domyślne.
Proste jest lepsze niż złożone.
Proste jest lepsze niż złożone.
Złożone jest lepsze niż skomplikowane.
Złożone jest lepsze niż skomplikowane.
Płaskie jest lepsze niż zagnieżdżone.
Płaskie jest lepsze niż zagnieżdżone.
Rzadkie jest lepsze niż zagęszczone.
Rzadkie jest lepsze niż zagęszczone.
Czytelność ma znaczenie.
Czytelność ma znaczenie.
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
70
The Zen of Python
The Zen of Python
Piękne jest lepsze niż brzydkie.
Piękne jest lepsze niż brzydkie.
Jawne jest lepsze niż domyślne.
Jawne jest lepsze niż domyślne.
Proste jest lepsze niż złożone.
Proste jest lepsze niż złożone.
Złożone jest lepsze niż skomplikowane.
Złożone jest lepsze niż skomplikowane.
Płaskie jest lepsze niż zagnieżdżone.
Płaskie jest lepsze niż zagnieżdżone.
Rzadkie jest lepsze niż zagęszczone.
Rzadkie jest lepsze niż zagęszczone.
Czytelność ma znaczenie.
Czytelność ma znaczenie.
Sytuacje wyjątkowe nie są na tyle wyjątkowe,
Sytuacje wyjątkowe nie są na tyle wyjątkowe,
aby łamać reguły.
aby łamać reguły.
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
71
The Zen of Python
The Zen of Python
Piękne jest lepsze niż brzydkie.
Piękne jest lepsze niż brzydkie.
Jawne jest lepsze niż domyślne.
Jawne jest lepsze niż domyślne.
Proste jest lepsze niż złożone.
Proste jest lepsze niż złożone.
Złożone jest lepsze niż skomplikowane.
Złożone jest lepsze niż skomplikowane.
Płaskie jest lepsze niż zagnieżdżone.
Płaskie jest lepsze niż zagnieżdżone.
Rzadkie jest lepsze niż zagęszczone.
Rzadkie jest lepsze niż zagęszczone.
Czytelność ma znaczenie.
Czytelność ma znaczenie.
Sytuacje wyjątkowe nie są na tyle wyjątkowe,
Sytuacje wyjątkowe nie są na tyle wyjątkowe,
aby łamać reguły.
aby łamać reguły.
Aczkolwiek pragmatyzm wygrywa z puryzmem
Aczkolwiek pragmatyzm wygrywa z puryzmem
sztywnego trzymania się reguł.
sztywnego trzymania się reguł.
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
72
The Zen of Python
The Zen of Python
Piękne jest lepsze niż brzydkie.
Piękne jest lepsze niż brzydkie.
Jawne jest lepsze niż domyślne.
Jawne jest lepsze niż domyślne.
Proste jest lepsze niż złożone.
Proste jest lepsze niż złożone.
Złożone jest lepsze niż skomplikowane.
Złożone jest lepsze niż skomplikowane.
Płaskie jest lepsze niż zagnieżdżone.
Płaskie jest lepsze niż zagnieżdżone.
Rzadkie jest lepsze niż zagęszczone.
Rzadkie jest lepsze niż zagęszczone.
Czytelność ma znaczenie.
Czytelność ma znaczenie.
Sytuacje wyjątkowe nie są na tyle wyjątkowe,
Sytuacje wyjątkowe nie są na tyle wyjątkowe,
aby łamać reguły.
aby łamać reguły.
Aczkolwiek pragmatyzm wygrywa z puryzmem
Aczkolwiek pragmatyzm wygrywa z puryzmem
sztywnego trzymania się reguł.
sztywnego trzymania się reguł.
Błędy zawsze powinny być sygnalizowane
Błędy zawsze powinny być sygnalizowane
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
73
The Zen of Python
The Zen of Python
Piękne jest lepsze niż brzydkie.
Piękne jest lepsze niż brzydkie.
Jawne jest lepsze niż domyślne.
Jawne jest lepsze niż domyślne.
Proste jest lepsze niż złożone.
Proste jest lepsze niż złożone.
Złożone jest lepsze niż skomplikowane.
Złożone jest lepsze niż skomplikowane.
Płaskie jest lepsze niż zagnieżdżone.
Płaskie jest lepsze niż zagnieżdżone.
Rzadkie jest lepsze niż zagęszczone.
Rzadkie jest lepsze niż zagęszczone.
Czytelność ma znaczenie.
Czytelność ma znaczenie.
Sytuacje wyjątkowe nie są na tyle wyjątkowe,
Sytuacje wyjątkowe nie są na tyle wyjątkowe,
aby łamać reguły.
aby łamać reguły.
Aczkolwiek pragmatyzm wygrywa z puryzmem
Aczkolwiek pragmatyzm wygrywa z puryzmem
sztywnego trzymania się reguł.
sztywnego trzymania się reguł.
Błędy zawsze powinny być sygnalizowane
Błędy zawsze powinny być sygnalizowane
No chyba, że zostaną celowo ukryte.
No chyba, że zostaną celowo ukryte.
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
74
The Zen of Python
The Zen of Python
Piękne jest lepsze niż brzydkie.
Piękne jest lepsze niż brzydkie.
Jawne jest lepsze niż domyślne.
Jawne jest lepsze niż domyślne.
Proste jest lepsze niż złożone.
Proste jest lepsze niż złożone.
Złożone jest lepsze niż skomplikowane.
Złożone jest lepsze niż skomplikowane.
Płaskie jest lepsze niż zagnieżdżone.
Płaskie jest lepsze niż zagnieżdżone.
Rzadkie jest lepsze niż zagęszczone.
Rzadkie jest lepsze niż zagęszczone.
Czytelność ma znaczenie.
Czytelność ma znaczenie.
Sytuacje wyjątkowe nie są na tyle wyjątkowe,
Sytuacje wyjątkowe nie są na tyle wyjątkowe,
aby łamać reguły.
aby łamać reguły.
Aczkolwiek pragmatyzm wygrywa z puryzmem
Aczkolwiek pragmatyzm wygrywa z puryzmem
sztywnego trzymania się reguł.
sztywnego trzymania się reguł.
Błędy zawsze powinny być sygnalizowane
Błędy zawsze powinny być sygnalizowane
No chyba, że zostaną celowo ukryte.
No chyba, że zostaną celowo ukryte.
W obliczu dwuznaczności odrzuć pokusę aby
W obliczu dwuznaczności odrzuć pokusę aby
zgadywać.
zgadywać.
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
75
The Zen of Python
The Zen of Python
Piękne jest lepsze niż brzydkie.
Piękne jest lepsze niż brzydkie.
Jawne jest lepsze niż domyślne.
Jawne jest lepsze niż domyślne.
Proste jest lepsze niż złożone.
Proste jest lepsze niż złożone.
Złożone jest lepsze niż skomplikowane.
Złożone jest lepsze niż skomplikowane.
Płaskie jest lepsze niż zagnieżdżone.
Płaskie jest lepsze niż zagnieżdżone.
Rzadkie jest lepsze niż zagęszczone.
Rzadkie jest lepsze niż zagęszczone.
Czytelność ma znaczenie.
Czytelność ma znaczenie.
Sytuacje wyjątkowe nie są na tyle wyjątkowe,
Sytuacje wyjątkowe nie są na tyle wyjątkowe,
aby łamać reguły.
aby łamać reguły.
Aczkolwiek pragmatyzm wygrywa z puryzmem
Aczkolwiek pragmatyzm wygrywa z puryzmem
sztywnego trzymania się reguł.
sztywnego trzymania się reguł.
Błędy zawsze powinny być sygnalizowane
Błędy zawsze powinny być sygnalizowane
No chyba, że zostaną celowo ukryte.
No chyba, że zostaną celowo ukryte.
W obliczu dwuznaczności odrzuć pokusę aby
W obliczu dwuznaczności odrzuć pokusę aby
zgadywać.
zgadywać.
Powinien istnieć jeden, i najlepiej tylko jeden,
Powinien istnieć jeden, i najlepiej tylko jeden,
oczywisty sposób do zrobienia danej rzeczy.
oczywisty sposób do zrobienia danej rzeczy.
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
76
The Zen of Python
The Zen of Python
Piękne jest lepsze niż brzydkie.
Piękne jest lepsze niż brzydkie.
Jawne jest lepsze niż domyślne.
Jawne jest lepsze niż domyślne.
Proste jest lepsze niż złożone.
Proste jest lepsze niż złożone.
Złożone jest lepsze niż skomplikowane.
Złożone jest lepsze niż skomplikowane.
Płaskie jest lepsze niż zagnieżdżone.
Płaskie jest lepsze niż zagnieżdżone.
Rzadkie jest lepsze niż zagęszczone.
Rzadkie jest lepsze niż zagęszczone.
Czytelność ma znaczenie.
Czytelność ma znaczenie.
Sytuacje wyjątkowe nie są na tyle wyjątkowe,
Sytuacje wyjątkowe nie są na tyle wyjątkowe,
aby łamać reguły.
aby łamać reguły.
Aczkolwiek pragmatyzm wygrywa z puryzmem
Aczkolwiek pragmatyzm wygrywa z puryzmem
sztywnego trzymania się reguł.
sztywnego trzymania się reguł.
Błędy zawsze powinny być sygnalizowane
Błędy zawsze powinny być sygnalizowane
No chyba, że zostaną celowo ukryte.
No chyba, że zostaną celowo ukryte.
W obliczu dwuznaczności odrzuć pokusę aby
W obliczu dwuznaczności odrzuć pokusę aby
zgadywać.
zgadywać.
Powinien istnieć jeden, i najlepiej tylko jeden,
Powinien istnieć jeden, i najlepiej tylko jeden,
oczywisty sposób do zrobienia danej rzeczy.
oczywisty sposób do zrobienia danej rzeczy.
Chociaż sposób ten nie musi być początkowo
Chociaż sposób ten nie musi być początkowo
oczywisty jeśli nie jesteś Holendrem.
oczywisty jeśli nie jesteś Holendrem.
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
77
The Zen of Python
The Zen of Python
Piękne jest lepsze niż brzydkie.
Piękne jest lepsze niż brzydkie.
Jawne jest lepsze niż domyślne.
Jawne jest lepsze niż domyślne.
Proste jest lepsze niż złożone.
Proste jest lepsze niż złożone.
Złożone jest lepsze niż skomplikowane.
Złożone jest lepsze niż skomplikowane.
Płaskie jest lepsze niż zagnieżdżone.
Płaskie jest lepsze niż zagnieżdżone.
Rzadkie jest lepsze niż zagęszczone.
Rzadkie jest lepsze niż zagęszczone.
Czytelność ma znaczenie.
Czytelność ma znaczenie.
Sytuacje wyjątkowe nie są na tyle wyjątkowe,
Sytuacje wyjątkowe nie są na tyle wyjątkowe,
aby łamać reguły.
aby łamać reguły.
Aczkolwiek pragmatyzm wygrywa z puryzmem
Aczkolwiek pragmatyzm wygrywa z puryzmem
sztywnego trzymania się reguł.
sztywnego trzymania się reguł.
Błędy zawsze powinny być sygnalizowane
Błędy zawsze powinny być sygnalizowane
No chyba, że zostaną celowo ukryte.
No chyba, że zostaną celowo ukryte.
W obliczu dwuznaczności odrzuć pokusę aby
W obliczu dwuznaczności odrzuć pokusę aby
zgadywać.
zgadywać.
Powinien istnieć jeden, i najlepiej tylko jeden,
Powinien istnieć jeden, i najlepiej tylko jeden,
oczywisty sposób do zrobienia danej rzeczy.
oczywisty sposób do zrobienia danej rzeczy.
Chociaż sposób ten nie musi być początkowo
Chociaż sposób ten nie musi być początkowo
oczywisty jeśli nie jesteś Holendrem.
oczywisty jeśli nie jesteś Holendrem.
Teraz jest lepsze niż nigdy.
Teraz jest lepsze niż nigdy.
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
78
The Zen of Python
The Zen of Python
Piękne jest lepsze niż brzydkie.
Piękne jest lepsze niż brzydkie.
Jawne jest lepsze niż domyślne.
Jawne jest lepsze niż domyślne.
Proste jest lepsze niż złożone.
Proste jest lepsze niż złożone.
Złożone jest lepsze niż skomplikowane.
Złożone jest lepsze niż skomplikowane.
Płaskie jest lepsze niż zagnieżdżone.
Płaskie jest lepsze niż zagnieżdżone.
Rzadkie jest lepsze niż zagęszczone.
Rzadkie jest lepsze niż zagęszczone.
Czytelność ma znaczenie.
Czytelność ma znaczenie.
Sytuacje wyjątkowe nie są na tyle wyjątkowe,
Sytuacje wyjątkowe nie są na tyle wyjątkowe,
aby łamać reguły.
aby łamać reguły.
Aczkolwiek pragmatyzm wygrywa z puryzmem
Aczkolwiek pragmatyzm wygrywa z puryzmem
sztywnego trzymania się reguł.
sztywnego trzymania się reguł.
Błędy zawsze powinny być sygnalizowane
Błędy zawsze powinny być sygnalizowane
No chyba, że zostaną celowo ukryte.
No chyba, że zostaną celowo ukryte.
W obliczu dwuznaczności odrzuć pokusę aby
W obliczu dwuznaczności odrzuć pokusę aby
zgadywać.
zgadywać.
Powinien istnieć jeden, i najlepiej tylko jeden,
Powinien istnieć jeden, i najlepiej tylko jeden,
oczywisty sposób do zrobienia danej rzeczy.
oczywisty sposób do zrobienia danej rzeczy.
Chociaż sposób ten nie musi być początkowo
Chociaż sposób ten nie musi być początkowo
oczywisty jeśli nie jesteś Holendrem.
oczywisty jeśli nie jesteś Holendrem.
Teraz jest lepsze niż nigdy.
Teraz jest lepsze niż nigdy.
Chociaż nigdy jest często lepsze niż właśnie
Chociaż nigdy jest często lepsze niż właśnie
teraz.
teraz.
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
79
The Zen of Python
The Zen of Python
Piękne jest lepsze niż brzydkie.
Piękne jest lepsze niż brzydkie.
Jawne jest lepsze niż domyślne.
Jawne jest lepsze niż domyślne.
Proste jest lepsze niż złożone.
Proste jest lepsze niż złożone.
Złożone jest lepsze niż skomplikowane.
Złożone jest lepsze niż skomplikowane.
Płaskie jest lepsze niż zagnieżdżone.
Płaskie jest lepsze niż zagnieżdżone.
Rzadkie jest lepsze niż zagęszczone.
Rzadkie jest lepsze niż zagęszczone.
Czytelność ma znaczenie.
Czytelność ma znaczenie.
Sytuacje wyjątkowe nie są na tyle wyjątkowe,
Sytuacje wyjątkowe nie są na tyle wyjątkowe,
aby łamać reguły.
aby łamać reguły.
Aczkolwiek pragmatyzm wygrywa z puryzmem
Aczkolwiek pragmatyzm wygrywa z puryzmem
sztywnego trzymania się reguł.
sztywnego trzymania się reguł.
Błędy zawsze powinny być sygnalizowane
Błędy zawsze powinny być sygnalizowane
No chyba, że zostaną celowo ukryte.
No chyba, że zostaną celowo ukryte.
W obliczu dwuznaczności odrzuć pokusę aby
W obliczu dwuznaczności odrzuć pokusę aby
zgadywać.
zgadywać.
Powinien istnieć jeden, i najlepiej tylko jeden,
Powinien istnieć jeden, i najlepiej tylko jeden,
oczywisty sposób do zrobienia danej rzeczy.
oczywisty sposób do zrobienia danej rzeczy.
Chociaż sposób ten nie musi być początkowo
Chociaż sposób ten nie musi być początkowo
oczywisty jeśli nie jesteś Holendrem.
oczywisty jeśli nie jesteś Holendrem.
Teraz jest lepsze niż nigdy.
Teraz jest lepsze niż nigdy.
Chociaż nigdy jest często lepsze niż właśnie
Chociaż nigdy jest często lepsze niż właśnie
teraz.
teraz.
Źle, jeśli implementację jest trudno wyjaśnić.
Źle, jeśli implementację jest trudno wyjaśnić.
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
80
The Zen of Python
The Zen of Python
Piękne jest lepsze niż brzydkie.
Piękne jest lepsze niż brzydkie.
Jawne jest lepsze niż domyślne.
Jawne jest lepsze niż domyślne.
Proste jest lepsze niż złożone.
Proste jest lepsze niż złożone.
Złożone jest lepsze niż skomplikowane.
Złożone jest lepsze niż skomplikowane.
Płaskie jest lepsze niż zagnieżdżone.
Płaskie jest lepsze niż zagnieżdżone.
Rzadkie jest lepsze niż zagęszczone.
Rzadkie jest lepsze niż zagęszczone.
Czytelność ma znaczenie.
Czytelność ma znaczenie.
Sytuacje wyjątkowe nie są na tyle wyjątkowe,
Sytuacje wyjątkowe nie są na tyle wyjątkowe,
aby łamać reguły.
aby łamać reguły.
Aczkolwiek pragmatyzm wygrywa z puryzmem
Aczkolwiek pragmatyzm wygrywa z puryzmem
sztywnego trzymania się reguł.
sztywnego trzymania się reguł.
Błędy zawsze powinny być sygnalizowane
Błędy zawsze powinny być sygnalizowane
No chyba, że zostaną celowo ukryte.
No chyba, że zostaną celowo ukryte.
W obliczu dwuznaczności odrzuć pokusę aby
W obliczu dwuznaczności odrzuć pokusę aby
zgadywać.
zgadywać.
Powinien istnieć jeden, i najlepiej tylko jeden,
Powinien istnieć jeden, i najlepiej tylko jeden,
oczywisty sposób do zrobienia danej rzeczy.
oczywisty sposób do zrobienia danej rzeczy.
Chociaż sposób ten nie musi być początkowo
Chociaż sposób ten nie musi być początkowo
oczywisty jeśli nie jesteś Holendrem.
oczywisty jeśli nie jesteś Holendrem.
Teraz jest lepsze niż nigdy.
Teraz jest lepsze niż nigdy.
Chociaż nigdy jest często lepsze niż właśnie
Chociaż nigdy jest często lepsze niż właśnie
teraz.
teraz.
Źle, jeśli implementację jest trudno wyjaśnić.
Źle, jeśli implementację jest trudno wyjaśnić.
Dobrze, jeśli implementację jest łatwo wyjaśnić.
Dobrze, jeśli implementację jest łatwo wyjaśnić.
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
81
The Zen of Python
The Zen of Python
Piękne jest lepsze niż brzydkie.
Piękne jest lepsze niż brzydkie.
Jawne jest lepsze niż domyślne.
Jawne jest lepsze niż domyślne.
Proste jest lepsze niż złożone.
Proste jest lepsze niż złożone.
Złożone jest lepsze niż skomplikowane.
Złożone jest lepsze niż skomplikowane.
Płaskie jest lepsze niż zagnieżdżone.
Płaskie jest lepsze niż zagnieżdżone.
Rzadkie jest lepsze niż zagęszczone.
Rzadkie jest lepsze niż zagęszczone.
Czytelność ma znaczenie.
Czytelność ma znaczenie.
Sytuacje wyjątkowe nie są na tyle wyjątkowe,
Sytuacje wyjątkowe nie są na tyle wyjątkowe,
aby łamać reguły.
aby łamać reguły.
Aczkolwiek pragmatyzm wygrywa z puryzmem
Aczkolwiek pragmatyzm wygrywa z puryzmem
sztywnego trzymania się reguł.
sztywnego trzymania się reguł.
Błędy zawsze powinny być sygnalizowane
Błędy zawsze powinny być sygnalizowane
No chyba, że zostaną celowo ukryte.
No chyba, że zostaną celowo ukryte.
W obliczu dwuznaczności odrzuć pokusę aby
W obliczu dwuznaczności odrzuć pokusę aby
zgadywać.
zgadywać.
Powinien istnieć jeden, i najlepiej tylko jeden,
Powinien istnieć jeden, i najlepiej tylko jeden,
oczywisty sposób do zrobienia danej rzeczy.
oczywisty sposób do zrobienia danej rzeczy.
Chociaż sposób ten nie musi być początkowo
Chociaż sposób ten nie musi być początkowo
oczywisty jeśli nie jesteś Holendrem.
oczywisty jeśli nie jesteś Holendrem.
Teraz jest lepsze niż nigdy.
Teraz jest lepsze niż nigdy.
Chociaż nigdy jest często lepsze niż właśnie
Chociaż nigdy jest często lepsze niż właśnie
teraz.
teraz.
Źle, jeśli implementację jest trudno wyjaśnić.
Źle, jeśli implementację jest trudno wyjaśnić.
Dobrze, jeśli implementację jest łatwo wyjaśnić.
Dobrze, jeśli implementację jest łatwo wyjaśnić.
Przestrzenie nazw są świetnym pomysłem
–
Przestrzenie nazw są świetnym pomysłem
–
stwórzmy ich więcej!
stwórzmy ich więcej!
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
82
Standardy kodowania
Standardy kodowania
●
Dla każdego wcięcia używaj czterech spacji
Dla każdego wcięcia używaj czterech spacji
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
83
Standardy kodowania
Standardy kodowania
●
Dla każdego wcięcia używaj czterech spacji
Dla każdego wcięcia używaj czterech spacji
●
Dla bardzo starego kodu używaj ośmiu spacji
Dla bardzo starego kodu używaj ośmiu spacji
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
84
Standardy kodowania
Standardy kodowania
●
Dla każdego wcięcia używaj czterech spacji
Dla każdego wcięcia używaj czterech spacji
●
Dla bardzo starego kodu używaj ośmiu spacji
Dla bardzo starego kodu używaj ośmiu spacji
●
Nigdy nie mieszaj tabulatorów i spacji
Nigdy nie mieszaj tabulatorów i spacji
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
85
Standardy kodowania
Standardy kodowania
●
Dla każdego wcięcia używaj czterech spacji
Dla każdego wcięcia używaj czterech spacji
●
Dla bardzo starego kodu używaj ośmiu spacji
Dla bardzo starego kodu używaj ośmiu spacji
●
Nigdy nie mieszaj tabulatorów i spacji
Nigdy nie mieszaj tabulatorów i spacji
●
Dla nowego kodu używaj wyłącznie spacji
Dla nowego kodu używaj wyłącznie spacji
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
86
Standardy kodowania
Standardy kodowania
●
Dla każdego wcięcia używaj czterech spacji
Dla każdego wcięcia używaj czterech spacji
●
Dla bardzo starego kodu używaj ośmiu spacji
Dla bardzo starego kodu używaj ośmiu spacji
●
Nigdy nie mieszaj tabulatorów i spacji
Nigdy nie mieszaj tabulatorów i spacji
●
Dla nowego kodu używaj wyłącznie spacji
Dla nowego kodu używaj wyłącznie spacji
●
Kod powinien używać ISO8859-1 lub ASCII
Kod powinien używać ISO8859-1 lub ASCII
(Py3000 UTF8)
–
(Py3000 UTF8)
–
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
87
Standardy kodowania
Standardy kodowania
●
Dla każdego wcięcia używaj czterech spacji
Dla każdego wcięcia używaj czterech spacji
●
Dla bardzo starego kodu używaj ośmiu spacji
Dla bardzo starego kodu używaj ośmiu spacji
●
Nigdy nie mieszaj tabulatorów i spacji
Nigdy nie mieszaj tabulatorów i spacji
●
Dla nowego kodu używaj wyłącznie spacji
Dla nowego kodu używaj wyłącznie spacji
●
Kod powinien używać ISO8859-1 lub ASCII
Kod powinien używać ISO8859-1 lub ASCII
(Py3000 UTF8)
–
(Py3000 UTF8)
–
●
Limitem długości linii jest 79 znaków
Limitem długości linii jest 79 znaków
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
88
Standardy kodowania - importy
Standardy kodowania - importy
●
Importy są zawsze u góry pliku po
Importy są zawsze u góry pliku po
komentarzach i docstringach ale przed danymi
komentarzach i docstringach ale przed danymi
globalnymi i stałymi modułu
globalnymi i stałymi modułu
●
Oddziel jedną linią importy
Oddziel jedną linią importy
–
bibliotek standardowych
bibliotek standardowych
–
bibliotek nie-standardowych
bibliotek nie-standardowych
–
lokalnych aplikacji/bibliotek
lokalnych aplikacji/bibliotek
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
89
Standardy kodowania - importy
Standardy kodowania - importy
Wszystkie importy rozdzielamy
Wszystkie importy rozdzielamy
TAK
TAK
impot os
impot os
import sys
import sys
from foobar import foo, Bar
from foobar import foo, Bar
NIE
NIE
import os, sys
import os, sys
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
90
Standardy kodowania białe znaki
–
Standardy kodowania białe znaki
–
Unikaj nadmiarowych spacji:
Unikaj nadmiarowych spacji:
●
w nawiasach i klamrach
w nawiasach i klamrach
TAK:
TAK:
spam(ham[1], {eggs: 2}) NIE:
spam(ham[1], {eggs: 2}) NIE:
spam( ham[ 1 ], { eggs: 2 } )
spam( ham[ 1 ], { eggs: 2 } )
●
tuż po przecinku, średniku i kropce
tuż po przecinku, średniku i kropce
TAK:
TAK:
if x == 4: print x, y; x, y = y, x NIE:
if x == 4: print x, y; x, y = y, x NIE:
if x == 4 : print x , y ; x , y = y , x
if x == 4 : print x , y ; x , y = y , x
●
przed nawiasam wykonującym funkcję
przed nawiasam wykonującym funkcję
TAK:
TAK:
spam(1) NIE:
spam(1) NIE:
spam (1)
spam (1)
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
91
Standardy kodowania białe znaki
–
Standardy kodowania białe znaki
–
Unikaj nadmiarowych spacji
Unikaj nadmiarowych spacji
wokół wyrażeń by
wokół wyrażeń by
wyrównać z innymi
wyrównać z innymi
TAK:
TAK:
x = 1
x = 1
y = 2
y = 2
long_variable = 3
long_variable = 3
NIE:
NIE:
x
x
= 1
= 1
y
y
= 2
= 2
long_variable
long_variable
= 3
= 3
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
92
Standardy kodowania białe znaki
–
Standardy kodowania białe znaki
–
Używaj spacji wokół znaków arytmetycznych
Używaj spacji wokół znaków arytmetycznych
TAK:
TAK:
i = i + 1
i = i + 1
submitted += 1
submitted += 1
x = x * 2 - 1
x = x * 2 - 1
hypot2 = x * x + y * y
hypot2 = x * x + y * y
c = (a + b) * (a - b)
c = (a + b) * (a - b)
NIE:
NIE:
i=i+1
i=i+1
submitted +=1
submitted +=1
x = x*2 - 1
x = x*2 - 1
hypot2 = x*x + y*y
hypot2 = x*x + y*y
c = (a+b) * (a-b)
c = (a+b) * (a-b)
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
93
Standardy kodowania białe znaki
–
Standardy kodowania białe znaki
–
●
Nie używaj spacji wokół symbolu równości gdy
Nie używaj spacji wokół symbolu równości gdy
używasz go jako prametru
używasz go jako prametru
TAK:
TAK:
def complex(real, imag=0.0):
def complex(real, imag=0.0):
return magic(r=real, i=imag)
return magic(r=real, i=imag)
NIE:
NIE:
def complex(real, imag = 0.0):
def complex(real, imag = 0.0):
return magic(r = real, i = imag)
return magic(r = real, i = imag)
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
94
Standardy kodowania
Standardy kodowania
●
Łączenie wyrażeń w jednej linii jest niezalecane
Łączenie wyrażeń w jednej linii jest niezalecane
TAK:
TAK:
if foo == 'blah':
if foo == 'blah':
do_blah_thing()
do_blah_thing()
do_one()
do_one()
do_two()
do_two()
do_three()
do_three()
RACZEJ NIE:
RACZEJ NIE:
if foo == blah : do_blah_thing()
‘
’
if foo == blah : do_blah_thing()
‘
’
do_one(); do_two(); do_three()
do_one(); do_two(); do_three()
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
95
Standardy kodowania - Komentarze
Standardy kodowania - Komentarze
●
Komentarze powinny być pełnymi zdaniami.
Komentarze powinny być pełnymi zdaniami.
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
96
Standardy kodowania - Komentarze
Standardy kodowania - Komentarze
●
Komentarze powinny być pełnymi zdaniami.
Komentarze powinny być pełnymi zdaniami.
●
Jeżeli komentarz jest zdaniem powinien być pisany
Jeżeli komentarz jest zdaniem powinien być pisany
dużą litery, jeżeli nie jest to identyfikator, którego
dużą litery, jeżeli nie jest to identyfikator, którego
nazwa zaczyna się od małej litery
nazwa zaczyna się od małej litery
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
97
Standardy kodowania - Komentarze
Standardy kodowania - Komentarze
●
Komentarze powinny być pełnymi zdaniami.
Komentarze powinny być pełnymi zdaniami.
●
Jeżeli komentarz jest zdaniem powinien być pisany
Jeżeli komentarz jest zdaniem powinien być pisany
dużą litery, jeżeli nie jest to identyfikator, którego
dużą litery, jeżeli nie jest to identyfikator, którego
nazwa zaczyna się od małej litery
nazwa zaczyna się od małej litery
●
Jeżeli komentarz jest krótki kropkę można pominąć
Jeżeli komentarz jest krótki kropkę można pominąć
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
98
Standardy kodowania - Komentarze
Standardy kodowania - Komentarze
●
Komentarze powinny być pełnymi zdaniami.
Komentarze powinny być pełnymi zdaniami.
●
Jeżeli komentarz jest zdaniem powinien być pisany
Jeżeli komentarz jest zdaniem powinien być pisany
dużą litery, jeżeli nie jest to identyfikator, którego
dużą litery, jeżeli nie jest to identyfikator, którego
nazwa zaczyna się od małej litery
nazwa zaczyna się od małej litery
●
Jeżeli komentarz jest krótki kropkę można pominąć
Jeżeli komentarz jest krótki kropkę można pominąć
●
Powinieneś używać dwóch spacji po kropce.
Powinieneś używać dwóch spacji po kropce.
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
99
Standardy kodowania - Komentarze
Standardy kodowania - Komentarze
●
Komentarze powinny być pełnymi zdaniami.
Komentarze powinny być pełnymi zdaniami.
●
Jeżeli komentarz jest zdaniem powinien być pisany
Jeżeli komentarz jest zdaniem powinien być pisany
dużą litery, jeżeli nie jest to identyfikator, którego
dużą litery, jeżeli nie jest to identyfikator, którego
nazwa zaczyna się od małej litery
nazwa zaczyna się od małej litery
●
Jeżeli komentarz jest krótki kropkę można pominąć
Jeżeli komentarz jest krótki kropkę można pominąć
●
Powinieneś używać dwóch spacji po kropce.
Powinieneś używać dwóch spacji po kropce.
●
Pisz komentarze w języku angielskim
Pisz komentarze w języku angielskim
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
100
Standardy kodowania - Komentarze
Standardy kodowania - Komentarze
●
Komentarze powinny być pełnymi zdaniami.
Komentarze powinny być pełnymi zdaniami.
●
Jeżeli komentarz jest zdaniem powinien być pisany
Jeżeli komentarz jest zdaniem powinien być pisany
dużą litery, jeżeli nie jest to identyfikator, którego
dużą litery, jeżeli nie jest to identyfikator, którego
nazwa zaczyna się od małej litery
nazwa zaczyna się od małej litery
●
Jeżeli komentarz jest krótki kropkę można pominąć
Jeżeli komentarz jest krótki kropkę można pominąć
●
Powinieneś używać dwóch spacji po kropce.
Powinieneś używać dwóch spacji po kropce.
●
Pisz komentarze w języku angielskim
Pisz komentarze w języku angielskim
●
Komentarzy liniowych # używaj możliwie rzadko
Komentarzy liniowych # używaj możliwie rzadko
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
101
Narzędzia
Narzędzia
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
102
Konsola
Konsola
Python
Python
●
_ wartość ostatnio
_ wartość ostatnio
obliczonego wyrażenia
obliczonego wyrażenia
●
quit() wyjście CTRL + D
–
quit() wyjście CTRL + D
–
●
help() - pomoc
help() - pomoc
●
dostarczony z językiem
dostarczony z językiem
Ipython = Python +
Ipython = Python +
●
Automatyczne wcięcia
Automatyczne wcięcia
●
Kolorowanie składni
Kolorowanie składni
●
Podpowiadanie składni
Podpowiadanie składni
●
Wsparcie dla introspekcji
Wsparcie dla introspekcji
●
Lepsze wyjście błędu
Lepsze wyjście błędu
Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana
103
Edytory
Edytory
Eclips +PyDEV
Eclips +PyDEV
NetBeans + JpyDbg + pythonnetbeans6
NetBeans + JpyDbg + pythonnetbeans6
Eric
Eric
Geany
Geany
DrPython
DrPython
SPE
SPE