03 Wprowadzenie

background image

Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana

1

Wprowadzenie

Wprowadzenie

background image

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

background image

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

http://docs.python.org/reference/lexical_analysis.html#id5

http://docs.python.org/reference/lexical_analysis.html#id5

background image

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

http://docs.python.org/tutorial/introduction.html

http://docs.python.org/tutorial/introduction.html

background image

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

http://docs.python.org/tutorial/introduction.html

http://docs.python.org/tutorial/introduction.html

background image

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

http://docs.python.org/dev/3.0/

http://docs.python.org/dev/3.0/

background image

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

background image

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'

print

A\nZ

”””

”””

print

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

background image

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

background image

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'

background image

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

background image

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.'

background image

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.

http://docs.python.org/library/stdtypes.html#string-methods

http://docs.python.org/library/stdtypes.html#string-methods

background image

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

background image

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.'

background image

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.'

http://docs.python.org/library/re.html

http://docs.python.org/library/re.html

background image

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 !

background image

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']

background image

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']

background image

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

background image

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

background image

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')]

background image

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

background image

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.

background image

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

background image

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

background image

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

background image

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

background image

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

http://docs.python.org/reference/expressions.html#lambdas

http://docs.python.org/reference/expressions.html#lambdas

background image

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

background image

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

background image

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'

background image

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

background image

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

background image

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'

background image

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'

http://docs.python.org/tutorial/classes.html

http://docs.python.org/tutorial/classes.html

background image

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()

http://docs.python.org/library/functions.html#property

http://docs.python.org/library/functions.html#property

background image

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

background image

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

background image

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

background image

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'

http://docs.python.org/tutorial/errors.html

http://docs.python.org/tutorial/errors.html

background image

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

background image

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

background image

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

background image

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

http://docs.python.org/reference/simple_stmts.html#import

http://docs.python.org/reference/simple_stmts.html#import

background image

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ł.

http://docs.python.org/tutorial/modules.html#packages

http://docs.python.org/tutorial/modules.html#packages

background image

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

background image

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')

background image

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

background image

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)

background image

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__

http://docs.python.org/library/functions.html

http://docs.python.org/library/functions.html

background image

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)

http://docs.python.org/reference/datamodel.html#index-1941

http://docs.python.org/reference/datamodel.html#index-1941

background image

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

http://docs.python.org/reference/datamodel.html#index-1965

http://docs.python.org/reference/datamodel.html#index-1965

background image

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

http://docs.python.org/reference/datamodel.html#index-1965

http://docs.python.org/reference/datamodel.html#index-1965

background image

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__()

background image

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__()

background image

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

background image

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()

background image

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)

background image

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)

http://docs.python.org/library/functions.html

http://docs.python.org/library/functions.html

background image

Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana

61

Filozofia języka

Filozofia języka

background image

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!

background image

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.

background image

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.

background image

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.

background image

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.

background image

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.

background image

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.

background image

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.

background image

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.

background image

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ł.

background image

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

background image

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.

background image

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ć.

background image

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.

background image

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.

background image

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.

background image

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.

background image

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ć.

background image

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ć.

background image

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!

http://www.python.org/dev/peps/pep-0020/

http://www.python.org/dev/peps/pep-0020/

background image

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

background image

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

background image

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

background image

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

background image

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)

background image

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

background image

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

background image

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

background image

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)

background image

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

background image

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)

background image

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)

background image

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()

background image

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.

background image

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

background image

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ąć

background image

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.

background image

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

background image

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

http://www.python.org/dev/peps/pep-0008/

http://www.python.org/dev/peps/pep-0008/

background image

Jan Koprowski <jan.koprowski@gmail.com> Politechnika Gdańska, FTiMS – Informatyka Stosowana

101

Narzędzia

Narzędzia

background image

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

http://ipython.scipy.org/

http://ipython.scipy.org/

background image

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

http://wiki.python.org/moin/PythonEditors

http://wiki.python.org/moin/PythonEditors


Document Outline


Wyszukiwarka

Podobne podstrony:
03 2 Wprowadzanie zamówienia sprzedaży INSTR1
2014 03 wprowadzenie, Różne, Przygotowanie do ŚDM w Krakowie 2016 rok, Grudzień 2013 rok, Styczeń 20
Cwiczenie nr 03 Wprowadzenie do chemii analitycznej
03 Wprowadzenie C#
03 Wprowadzanie?nych stałych
03 2 Wprowadzanie zamówienia sprzedaży (INSTR1)
03 Wprowadzenie podjęcia produktów (INSTR12)
03 Wprowadzenie do badan jakosc Nieznany
Wprow. do Pracy z rodzina 03, wprowadzenie do pracy z rodziną
03 2 Wprowadzanie zamówienia sprzedaży INSTR1
03 css wprowadzenie
kurs wprow.cz.prakt.2008, Znieczulenie, Wykłady-Wprowadz. do spcjalizacji w anestezjologii i int.ter
Wykład 1 - Wprowadzenie - 01.03.2011 r, studia
03 Interakcje stosunki spoleczne organizacja struktura spoleczna, studia, wprowadzenie do socjologii
03 13 Wprowadzenie podjęcia produktów INSTR12

więcej podobnych podstron