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