Python dla każdego naukowca - 2013

advertisement
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
JĘZYK PYTHON
– NARZĘDZIE DLA KAŻDEGO NAUKOWCA
Dr Marcin Lewandowski [ [email protected] ]
Strona kursu: http://us4us.eu/wydarzenia/kursy/
1
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
PYTHON - WSTĘP
2
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Języki kompilowane
.c
• Plik z kodem źródłowym
• KOMPILACJA
.o
• Plik z kodem binarnym
• KONSOLIDACJA
• Plik wykonywalny
.exe
3
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Interpreter Pythona
.py
.pyc
• Plik z kodem źródłowym
• KOMPILACJA - jednokrotna
• Plik z binarnym kodem pośrednim
• Program wykonywalny dla maszyny wirtualnej
• Uruchamianie na różnych systemach
operacyjnych/maszynach wirtualnych
4
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
DRY KISS
• KISS – Keep It Simple Stupid
• nie przesadzaj ze skomplikowanymi konstrukcjami
• prostota jest cnotą 
• DRY – Don’t repeat yourself
• przemyśl architekturę całości i klocków z których ją zbudujesz
• pisz możliwie generyczne/uniwersalne funkcje
5
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Zen of Python
import this
>>> import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
6
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
START
• Uruchomienie Python w trybie interaktywnym:
> python
Enthought Python Distribution -- www.enthought.com
Version: 7.3-2 (32-bit)
Python 2.7.3 |EPD 7.3-2 (32-bit)| (default, Apr 12 2012,
14:30:37) [MSC v.1500 32 bit (Intel)] on win32
Type "credits", "demo" or "enthought" for more
information.
>>>
• Ewaluacja wyrażenia:
>>> 3*(7+2)
27
• Wyjście z trybu interaktywnego Pythona:
CTRL-Z
# EOF on Windows
CTRL-D
# EOF on Unix
7
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Uruchomienie skryptu Python
• Windows:
> python skrypt.py
> skrypt.py
• Linux:
% python skrypt.py
% ./skrypt.py
• Wymaga dodania pierwszej linii:
#!/usr/bin/env python
• Wymaga ustawienia atrybutu ‘executable’:
% chmod u+x skrypt.py
8
PYTHON-2013
9
Marcin Lewandowski [ [email protected] ]
Wykonanie/Ewaluacja poleceń/skryptu
Wykonanie:
s = ’a = 2*2; print a’
exec(s)
Ewaluacja:
s = ’2*2’
a = eval(s)
print a
Wykonanie skryptu z pliku:
execfile(’myscript.py’)
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Kod Python w module
mymod.py:
def fun1():
print 2*2
def fun2():
print 2+2
Załadowanie modułu i wykonanie funkcji:
$ python
>>> import mymod
>>> mymod.fun1()
>>> mymod.fun2()
10
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
11
Błędy
• Błędy składni (Syntax errors)
• czyli błędy „gramatyczne” i „ortograficzne” języka - Python wykona
program tylko gdy tego typu błędów nie ma.
Błędy składni są sygnalizowane na etapie kompilacji kodu
źródłowego.
• PYTHON nie weryfikuje statycznie zgodności typów danych –
dlatego niezgodności typów będą powodowały błędy działania!
• Błędy działania (Runtime errors)
• Błędy które pojawiają się na etapie wykonywania programu.
• Obecnie w językach programowania tego typu błędy są nazywane
‘Wyjątkami’ (Exceptions) i istnieje specjalny mechanizm ich obsługi
• Błędy semantyczne (Semantic errors)
• Program działa i nie zgłasza błędów, ale wynik jego działania jest
niepoprawny – to błąd semantyczny. Programista miał co innego na
myśli niż faktycznie wykonuje program.
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Debugging
• Debug Prints
• Umieszczanie w kodzie programu funkcji print do śledzenia jego
stanu wewnętrznego w newralgicznych miejscach:
a = 1
if _debug_: print ”a:”, a
b = a + 1
if _debug_: print ”b:”, b
• Log
• Exceptions/Trace
• Debugger
12
PYTHON-2013
IDLE
Marcin Lewandowski [ [email protected] ]
13
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
14
EX1
IDLE debugger
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
ELEMENTY JĘZYKA
PYTHON
15
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Słowa kluczowe
• assert, break, continue, del, except, exec, finally, import,
•
•
•
•
is, pass, print, raise, return, try, yield
and, as, in, or, not
for, from, with
if, else, elif, while
class, def, global, lambda
16
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Zarezerwowane
•_
jest używany w trybie interaktywnym do pamiętania
rezultatu ostatniej ewaluacji
(→koncepcja twórczo rozwinięta w IPython)
• _*
nazwy lokalne (nie widoczne przy imporcie)
• __*__
używany do nazw systemowych i niech tak zostanie 
(np.: __builtins__, __doc__, __name__)
• __*
prywatne nazwy w klasach
17
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
18
Raczej zarezerwowane
• dir(__builtins__)
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BufferError',
'BytesWarning', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError',
'Exception', 'False', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError',
'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'KeyError',
'KeyboardInterrupt', 'LookupError', 'MemoryError', 'NameError', 'None',
'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError',
'PendingDeprecationWarning', 'ReferenceError', 'RuntimeError', 'RuntimeWarning',
'StandardError', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError',
'SystemExit', 'TabError', 'True', 'TypeError', 'UnboundLocalError',
'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError',
'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning',
'WindowsError', 'ZeroDivisionError', '__debug__', '__doc__', '__import__',
'__name__', '__package__', 'abs', 'all', 'any', 'apply', 'basestring', 'bin', 'bool', 'buffer',
'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'cmp', 'coerce', 'compile', 'complex',
'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'execfile', 'exit',
'file', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex',
'id', 'input', 'int', 'intern', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals',
'long', 'map', 'max', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property',
'quit', 'range', 'raw_input', 'reduce', 'reload', 'repr', 'reversed', 'round', 'set', 'setattr',
'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'unichr', 'unicode',
'vars', 'xrange', 'zip‘]
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Przedefiniowanie nazw
(tego bym raczej nie robił)
• Spróbuj:
>>> len
<built-in function len>
>>> len('abc')
3
>>> len=2
>>> len
2
>>> len('abc')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable
>>> del len
>>> len
<built-in function len>
>>>
19
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Identyfikatory
• identifier ::= (letter|"_") (letter | digit | "_")*
• letter ::= lowercase | uppercase
• lowercase ::= "a"..."z"
• uppercase ::= "A"..."Z"
• digit ::= "0"..."9"
• WieLkOść LiTeR Ma zNaczEnie!!!
• W wersji 3.0+ UNICODE!
20
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Linia kodu
• Linia tekstu zakończona znakiem nowej linii:
• LF (0x0A) – Unix (Linux, MacOS, Solaris, …)
• CR LF (0x0D 0x0A) – Windows
• Narzędzie do zamiany CRLF na LF
<PYTHON>\Tools\scripts\crlf.py
• Wcięcia linii definiują bloki wykonawcze!!!
21
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Kodowanie znaków (Charset/Encoding)
• Ustalenie kodowania dla pliku:
# -*- coding: <encoding-name> -*• Latin-1 (ISO-8859-1) – domyślny 7-bit/char
• Latin-2 (ISO-8859-2) – polskie znaki
• UTF-8 BOM (byte-order mark)
22
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
23
Komentarze
• Znak # rozpoczyna komentarz – traktowany do końca linii
print 2*2
# oblicz 2*2
• Oczywiście:
print ‘Tutaj to nie jest # komentarz #’
• Komentarze dokumentacyjne:
def fun(x):
”””Ta funkcja zwraca 2*sin(x)”””
return 2*sin(x)
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
24
Duck typing
• "If it looks like a duck and quacks like a duck, it must be a
duck.„
def calc(a, b, c):
return (a+b)*c
print calc(1, 2, 3)
print calc([1, 2, 3], [4, 5, 6], 2)
print calc('apples ', 'and oranges, ', 3)
--9
[1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]
apples and oranges, apples and oranges, apples and
oranges,
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Typy proste
• None – specjalny obiekt pusty:
None==None is true
None==False is false
not(None) is true!
• Boolean – typ logiczny:
True
False==False
bool(42)
not(42==True)
(True or False) and not(False)
True==1
not(1.000001==1)
1.00000000000000000000000009 == 1
25
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Integer
• Stałopozycyjny 32-bitowy
32
int(’32’) # int ze stringu
1/3
# sic! UWAGA!!!
int(3.14) # trunc
0xABCD
# heksadecymalnie
0o1234567 # ósemkowo
0b10010001 # binarnie
26
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Long
• Stałopozycyjny – dowolnie długi!
5L
12319809854761238913209182039812301
long(1)
• W Python 3.0+ usunięty/ujednolicony z Integer!
27
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Float
• Zmiennopozycyjny 32-bitowy
4.
4.0
float(44)
1.0/3
complex(1+2j).real
complex(1+2j).imag
4.25e3, 4.25E+3
+ moduł decimal – patrz dokumentacja Pythona
28
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Zespolony
• Complex – zespolony (2x Float):
complex(1)
complex(2j)
complex(’3+j’)
complex(1,2)
1+2j
29
PYTHON-2013
30
Marcin Lewandowski [ [email protected] ]
Operatory numeryczne
Operator
Rezultat
Uwagi
x+y
Suma x i y
x-y
Różnica x i y
x*y
Iloczyn x i y
x/y
Dzielenie x przez y
Dzielenie
całkowitoliczbowe dla Int
x // y
Dzielenie x przez y
Dzielenie
całkowitoliczbowe
x%y
Reszta z dzielenia x przez y
Modulo
-x
zmiana znaku x
+x
Bez zmiany znaku x
PYTHON-2013
31
Marcin Lewandowski [ [email protected] ]
Funkcje numeryczne
Operator
Rezultat
Uwagi
abs(x)
Wartość bezwzględna/moduł x
Moduł dla zespolonych
int(x)
Konwersja x do Integer
long(x)
Konwersja x do Long
float(x)
Konwersja x do Float
complex(re,im)
Liczba zespolona: re + im*j
c.conjugate()
Sprzężenie liczby zespolonej c
divmod(x, y)
Zwraca parę: (x // y, x % y)
pow(x, y)
x ** y
x do potęgi y
+ moduł math – patrz dokumentacja Pythona
PYTHON-2013
32
Marcin Lewandowski [ [email protected] ]
Operatory bitowe
Operator
Rezultat
Uwagi
x|y
x OR y
x^y
x XOR y
x&y
x AND y
x << n
Przesunięcie x o n bitów
w lewo
n >= 0
x >> n
Przesunięcie x o n bitów
w prawo
n >= 0
~x
Negacja bitów x
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Funkcje konwersji Integer/Long
Funkcja
Opis
bin(i)
Binarna reprezentacja liczby całkowitej i (string)
bin(12) == ‘0b1100’
hex(i)
Heksadecymalna reprezentacja liczby całkowitej i
(string)
hex(12) == ‘0xc’
int(o)
long(o)
Konwersja obiektu o do liczby Integer/Long
(trunc dla o typu Float)
int(s, base)
long(s, base)
Konwersja łańcucha s do liczby Integer/Long w zadanej
bazie
oct(i)
Ósemkowa reprezentacja liczby całkowitej i (string)
oct(12) == ‘014’
33
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Łańcuchy znakowe
• String – łańcuchy znakowe:
’A string’
"Another string"
"Escape \" quotation"
’He’ + ’llo’ + ’!’*10
’’’Cote d’azure’’’
"""Multiline string
a newline"""
’T: %.02f P:%d’ % (20.567, 1024)
+ funkcje typu string – patrz dokumentacja Pythona
34
EX2
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Listy
• List – lista:
[1, 2, 3]
[’word’, 33, 123.998]
[’w’, ’o’, ’r’, ’d’]
list("word")
[[’list’], [’of’, ’lists’]]
list((’a’, 1, 2))
• Tuple – lista niemodyfikowalna:
(1, 2)
(’a’, 1)
(’memento comma!’,)
tuple([’a’, 1])
range(3)
# [0, 1, 2]
range(2, 4)
# [2, 3]
range(0, 5, 2)
# [0, 2, 4]
35
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Funkcje dla list i łańcuchów znakowych
• Listy (modyfikują a!):
a = [5, 6, 7, 8]
a.pop() # a = [5, 6, 7]
a.append(2) # a = [5, 6, 7, 2]
a.sort() # a = [2, 5, 6, 7]
a.reverse() # a = [7, 6, 5, 2]
• Łańcuchy znakowe:
a = ’Ala ma kota’
a.split() # [’Ala’, ’ma’, ’kota’]
a.upper() # ’ALA MA KOTA’
a.title() # ’Ala Ma Kota’
import string
string.join(a.split(), ’_’) # ’Ala_ma_kota’
+ więcej funkcji – patrz dokumentacja Pythona
36
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Indeksowanie sekwencji (1)
Wyrażenie
Wynik
seq[i:j]
Elementy seq w zakresie [i … j)
seq[i:]
Elementy seq w zakresie [i … końca]
seq[:j]
Elementy seq w zakresie [0 … j)
seq[:-1]
Elementy seq w zakresie [0 … końca-1]
seq[:]
Wszystkie elementy seq (kopia)
seq[i:j:k]
Elementy seq w zakresie [i … j) z krokiem k (co
k-ty)
37
PYTHON-2013
38
Marcin Lewandowski [ [email protected] ]
Indeksowanie sekwencji (2)
PYTHON
Wynik
MATLAB
a = [5, 6, 7, 8]
a = [5 6 7 8]
a[0]
5
a(1)
a[2:4]
[7, 8]
a(3:4)
a[-1]
8
a(end)
a[-2]
7
a(end-1)
a[2:]
[7, 8]
a(3:end)
a[::2]
[5, 7]
a(1:2:end)
a[::-1]
[8, 7, 6, 5]
a(end:-1:1)
len(a)
4
length(a)
[min(a), max(a)]
[5, 8]
[min(a) max(a)]
TAKŻE DLA: a = ‘Python rulez’[0:4]
a = (5, 6, 7, 8) a = [{1: 2}, [3, 4], 5, ’Six’]
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Słowniki
• Dictionary/Hash – słownik:
{}, dict()
{1:’one’, 2:’two’, 5:’five’}
{’A’:1, ’AB’:2, ‘ABC’:1234}
{’NY’: ’USA’, ’WAW’: ’Poland’}
dict(one=2, two=3)
dict(zip(('one', 'two'), (2, 3)))
dict([['two', 3], ['one', 2]])
39
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Operatory/Funkcje dla kolekcji (1)
Operacja
Wynik
s[i] = x
Element i słownika s jest zamieniany na x
s[i:j] = t
‘Plaster’ s elementów [i … j) jest zamieniany na
elementy z t
del s[i:j]
To samo co s[i:j] = []
s[i:j:k] = t
Elementy s[i:j:k] zamieniane na elementy z t
del s[i:j:k]
Usunięcie elementów s[i:j:k]
40
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Operatory/Funkcje dla kolekcji (2)
Operacja
Wynik
s.append(x)
To samo co s[len(s):len(s)] = [x]
s.extend(x)
To samo co s[len(s):len(s)] = x
s.count(x)
Zwraca liczbę elementów spełniających
warunek:
s[i] == x
s.index(x[, i[, j]])
Zwraca najmniejszy indeks k, taki że
s[k] == x oraz i <= k < j
s.insert(i, x)
To samo co s[i:i] = [x]
s.pop([i])
To samo co x = s[i]; del s[i]; return x
s.remove(x)
To samo co del s[s.index(x)]
s.reverse()
Odwraca kolejność elementów s (w miejscu)
s.sort([cmp[, key[,
reverse]]])
Sortuje elementy s (w miejscu)
41
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Operatory/Funkcje dla kolekcji (3)
Operacja
Wynik
x in coll
True jeśli coll zawiera x
x not in coll
True jeśli coll zawiera x
any(coll)
True jeśli którykolwiek element coll jest
True
all(coll)
True jeśli wszystkie elementy coll są True
len(coll)
Liczba elementów coll
max(coll[,
key=function])
Element maksymalny coll
min(coll[, key=function]) Element minimalny coll
42
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Zbiory
• set – zbiór (nieuporządkowany) :
set()
set([1, 2]), set([2, 1])
set((2, 1))
set(range(0,5))
set([1, 2]) | set([3, 4])
• frozenset – zbiór niemodyfikowalny
+ funkcje na zbiorach – patrz dokumentacja Pythona
43
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
44
Jak skopiować kolekcję
>>>
>>>
>>>
>>>
[1,
a = [1, 2, 3]
b = a
# kopia !?
a[1] = 2000 # zmiana w oryginale
b
2000, 3]
# !@%^
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
45
EX3
Kopia kolekcji
a
b
b
b
=
=
=
=
[1, 2, 3]
a[:]
# metoda 1
list(a)
# metoda 2
[]; b.extend(a) # metoda 3
b = [];
b = [ e for e in a ]
for n in range(len(a)):
b.append(a[n])
# metoda 4
# metoda 5
+ deepcopy – patrz dokumentacja Pythona
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
range()/xrange()
• Pętla na sekwencji:
for n in range(1000000000):
print(n)
MemoryError 
• Rozwiązanie – użyj xrange()
for n in xrange(1000000000):
print(n)
• W Python 3.0 xrange() nieistnieje, a range() zachowuje
się jak xrange()!!!
• →patrz iteratory
46
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
List comprehension (1)
• Tworzenie listy:
all = []
for i in range(0, 100):
all.append(i)
• j.w. w wersji jednolinijkowej:
all = [ i for i in range(0, 100) ]
list = [ expr for item in iterable ]
47
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
List comprehension (2)
• Tworzenie listy:
odd = []
for i in range(0, 100):
if i%2:
odd.append(i)
• j.w. w wersji jednolinijkowej:
odd = [ i for i in range(0, 100) if i%2]
list = [ expr for item in iterable if cond]
48
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Struktury kontrolne i pętle
• Instrukcje warunkowe
• If
• Pętle
• for
• while
• Inne
• import
• return
• yield
• pass
• assert
49
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
if
if warunek1:
blok1
elif warunek2:
blok2
# … Dodatkowe elif …
else:
blok3
50
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
True or False
• False:
• None
• False
• Numeryczne zero: 0, 0L, 0.0, 0j
• Pusta sekwencja: '', (), []
• Pusta słownik:
{}
• Instancja klasy z funkcjami __nonzero__() lub __len__(), które
zwracają 0 lub False
• Reszta True 
51
PYTHON-2013
52
Marcin Lewandowski [ [email protected] ]
Operatory porównań
Operator
Znaczenie
<
Mniejszy niż
<=
Mniejszy lub równy
>
Większy niż
>=
Większy lub równy
==
Równy
!=
Nie równy
is
Identyczność obiektów
is not
Zaprzeczenie identyczności obiektów
Uwagi
<>
+ Operatory logiczne: not, and, or
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
UWAGA na zwarcia!
"short circuit"
>>> 'a'
True
>>> 'b'
False
>>> 'a'
False
>>> 'b'
True
== ('a' or 'b')
== ('a' or 'b')
== ('a' and 'b')
== ('a' and 'b')
53
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
For in range
>>> od1do10 = range(1, 11)
>>> for count in od1do10 : print count
1
2
…
9
10
>>> od1do10
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
54
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
for-continue, for-else
for n in range(2, 10, 1):
if n % 2:
print n, ”is odd”
break
else:
print ”Odd not found”
55
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
while, while-else
input_ok = False
while not input_ok:
s = input('Enter something: ')
if s == 'exit':
break
if len(s) < 3:
print('Too small')
continue
input_ok = True
else:
print ”Input is OK”
56
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
57
EX4
BMI (Body Mass Index)
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
BMI zakresy
Zakres BMI
< 16.5
[16.5, 18.5)
[18.5, 25)
[25, 30)
[30, 35)
[35, 40)
> 40
Diagnoza
Poważna niedowaga
Niedowaga
Prawidłowa
Nadwaga
Otyłość klasy I
Otyłość klasy II
Otyłość klasy III
58
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Algorytm
Instrukcja dla użytkownika
2. Wprowadzenie danych: wagi i wzrostu
3. Sprawdzenie poprawności zakresów danych
1.
•
•
Waga – 0-150kg
Wzrost – 0-200cm
Obliczenie BMI wg. wzoru
5. Klasyfikacja BMI wg. Tabeli
6. Powrót do punktu 1
4.
59
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Wersja I
• Korzystając z:
• Tylko typy proste
• Instrukcje: pętli, warunki
• Operacje numeryczne
• Komenda print,
• Funkcje: raw_input(), sys.exit()
60
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Wersja II
• Modyfikacja Wersji I:
• Użyj listy do definicji klasyfikatora BMI
61
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Funkcje
def <name>(arg1, arg2,... argN):
<statements>
return <value>
#optional
n.p.:
def sayHello(who):
print 'Hello ‘, who
# End of function
62
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Funkcje przykład
def printMax(a, b):
if a > b:
print a, 'is maximum'
elif a == b:
print a, 'is equal to', b
else:
print b, 'is maximum'
>>> printMax(3, 4)
4 is maximum
>>> x = 5
>>> y = 7
>>> printMax(x, y)
7 is maximum
63
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
lambda
lambda arg1, arg2,... argN
:expression using arguments
f = lambda x, y, z: x + y + z
def func(x, y, z): return x + y + z
64
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
65
def/lambda/return/yeld
• def – jest wykonywalny (!) i tworzy nowy obiekt pod
•
•
•
•
nazwą funkcji
lambda – tworzy i zwraca nowy obiekt funkcji
return – zwraca rezultat do kodu wywołującego
yield – podobnie jak return zwraca rezultat, ale
zapamiętuje stan wewn. funkcji i miejsce powrotu
global – deklaruje zmienne w funkcji jako globalne
(domyślnie są lokalne)
• Argumenty do funkcji są przekazywane przez
przypisanie (object reference)
• Argumenty, wartości zwracane i zmienne nie są
deklarowane
Python 3.0+: nonlocal – odpowiednik global dla zakresu otaczającego
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Reguły zakresu (scoping)
• Moduł to zakres global. Zmienne zdefiniowane na
•
•
•
•
poziomie modułu są dostępne z innych modułów za
pomocą prefiksu nazwy modułu.
Zakres global obejmuje tylko jeden plik!!!
Można zaimportować wszystkie nazwy z modułu do
przestrzeni globalnej modułu importując jego
zawartość.
Każde wywołanie funkcji tworzy nowy zakres lokalny
(dla tej funkcji).
Zmienne utworzone/przypisane w funkcji są lokalne,
chyba, że zostały zadeklarowane jako global
Wszystkie inne nazwy są wyszukiwane w zakresie:
otaczającym (enclosing scope), globalnym,
wbudowanym (__builtin__).
66
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Reguła przeszukiwania LEGB
67
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Przykłady
X = 88 # global X
def func():
X = 99 # local X
func()
print(X) # 88
---------------------------------# Global scope
X = 99
def func(Y):
# Local scope
Z = X + Y# X is a global
return Z
func(1)
# 100
68
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Argumenty funkcji
• Argumenty typów niemodyfikowalnych (Immutable)
efektywnie są przekazywane przez wartość (np.
integer, string).
• Argumenty typów modyfikowalnych efektywnie są
przekazywane przez referencję (np. listy, słowniki).
69
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
70
Składnia argumentów funkcji
Składnia
Strona
Interpretacja
func(value)
Wywołanie
argument normalny pozycyjny
func(name=value)
Wywołanie
argument nazwany
func(*sequence)
Wywołanie
przekazuje elementy sekwencji jako kolejne
argumenty pozycyjne
func(**dict)
Wywołanie
przekazuje elementy słownika (klucz/wartość)
jako kolejne argumenty nazwane
def func(name)
Funkcja
Argument normalny: dopasowanie po pozycji
lub nazwie
def
func(name=value)
Funkcja
Argument domyślny, o ile nie przekazany w
wywołaniu
def func(*name)
Funkcja
Zbiera pozostałe argumenty pozycyjne w listę
def func(**name)
Funkcja
Zbiera pozostałe argumenty nazwane w słownik
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Argumenty pozycyjne/nazwane/domyślne
def func(spam, eggs, toast=0, ham=0):
print((spam, eggs, toast, ham))
> func(1, 2)
(1, 2, 0, 0)
> func(1, ham=1, eggs=0)
(1, 0, 0, 1)
> func(spam=1, eggs=0)
(1, 0, 0, 0)
> func(toast=1, eggs=2, spam=3)
(3, 2, 1, 0)
> func(1, 2, 3, 4)
(1, 2, 3, 4)
71
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Argumenty typu * i **
>>> def f(*args): print(args)
...
> f()
()
> f(1)
(1,)
> f(1, 2, 3, 4)
(1, 2, 3, 4)
----------------> def f(**args): print(args)
...
> f()
{}
> f(a=1, b=2)
{'a': 1, 'b': 2}
72
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
73
Funkcje – dobra praktyka
• Funkcja powinna służyć do realizacji jednej dobrze
•
•
•
•
określonej rzeczy i nie być zbyt rozbudowana
Używaj argumentów na wejściu i return na wyjściu funkcji
Zmiennych global używaj tylko w kiedy to absolutnie
konieczne
Nie modyfikuj argumentów przekazywanych przez
referencję o ile wywołujący się tego nie spodziewa
Nie modyfikuj zmiennych w innych modułach
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Wyjątki
try:
blok-try
except ErrorClass1:
blok-except1
except ErrorClass2:
blok-except2
except …
…
else:
blok-else
finally:
blok-finally
74
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Wyjątki - przykład
try:
a = 1/0
except:
print 'except'
else:
print 'ok'
finally:
print 'finally'
75
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Generacja wyjątku
# Generacja instancji wyjątku
raise <instance>
# Utworzenie instancji i generacja wyjątku
raise <class>
# Powtórna generacja ostatniego wyjątku
raise
-------------------try:
raise IndexError
except IndexError:
print 'got exception’
76
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
77
Składnia try/except/else/finally
Składnia
Interpretacja
except:
Łapie wyjątki wszystkich typów
except name:
Łapie tylko wyjątki danego typu
except name as value:
Łapie wyjątki danego typu oraz jego instancję
except (name1, name2):
Łapie wyjątki danych typów
except (name1, name2)
as value:
Łapie wyjątki danych typów oraz ich instancję
else:
Wykonywane gdy żaden wyjątek nie został
zgłoszony
finally:
Wykonywane ZAWSZE na końcu bloku except
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
78
EX5
with/as
with expression [as variable]:
with-block
with open(r'C:\data') as file:
for line in file:
print(line)
…
+ Context Management Protocol – patrz dokumentacja Pythona
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
MODUŁY
79
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Moduły po co i jak
• MODUŁ = biblioteka Pythona
• PAKIET (Package) = zestaw modułów w drzewie
katalogów
• Po co:
• Code reuse!
• Dzielenie kodu/przestrzeni nazw
• Współdzielenie serwisów/funkcji/danych
• Kroki ładowania modułu:
1. Znalezienie pliku modułu (ścieżka przeszukiwania)
2. Kompilacja modułu do byte-code (o ile konieczne)
3. Wykonanie modułu
80
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
import
import <module1>, <module2>
from <module> import <name1>, <name2>
from <module> import *
81
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
sys.path
• Poszukiwanie pliku modułu:
1. Katalog domowy/bieżący (UWAGA na nazwy!)
2. Zmienna systemowa PYTHONPATH
3. Katalog biblioteki standardowej
4. Zawartość plików .pth
• Powyższe tworzy ścieżkę przeszukiwania pamiętaną w
sys.path
82
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
83
Typy modułów
import mod
• Plik źródłowy Python modułu: mod.py
• Skompilowany byte-code modułu: mod.pyc
• Katalog o nazwie mod – dla importu pakietów
• Skompilowany moduł natywny – biblioteka dynamiczna
systemu operacyjnego (np. mod.dll/mod.pyd dla
Windows, mod.so dla Linux)
• Moduł wbudowany w interpreter Pythona (skompilowany i
statycznie zlinkowany)
• Plik ZIP – zostaje automatycznie rozpakowany w locie
• Obraz modułu w pamięci – dla zamrożonych programów
wykonawczych
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
84
Przykład
>>> sin(2.0)
NameError: name 'sin' is not defined
>>> import math
>>> dir(math) # look what is in the ’math’
['__doc__', '__name__', '__package__',
'acos', 'acosh', 'asin',…
>>> math.sin(math.pi/2)
1.0
>>> from math import sin
>>> sin(math.pi/2)
1.0
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Ładowanie modułów c.d.
• Przemianowanie podczas ładowania:
from math import sin as mysin
• Możliwość przeładowania modułu:
reload(mymodule)
85
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Przekrywanie nazw przy imporcie
from M import func
from N import func # ooops
func()
# wywoła N.func!
-----------------------------------------import M, N
M.func()
N.func()
# ładuje całe moduły
# wołamy M.func()
# wołamy N.func()
86
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
‘Nieśmiałe’ ładowanie
try:
import urllib3 as urllib # 1st try
except:
try:
import urllib2 as urllib # 2nd try
except:
import urllib as urllib #
urllib.urlopen(’http://neuro.imm.dtu.dk/’)
87
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
88
Dokumentacja modułów/funkcji
"""A module ble, ble, ble ..."""
def fun_add(x, y=1):
"""
fun_add(x,y=1) takes one or two numerical arguments
and adds them together. If the second argumentn is
empty it increments input by 1
"""
return x + y
print myfunction.__doc__
Generacja dokumentacji
HTML dla modułu
$ pydoc -w ./mymodule.py
>>> help(myfunction)
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Uruchamianie modułu jako skryptu
• Przydatne np. do testowania modułów
• Moduł uruchomiony jako skrypt
if __name__ == '__main__':
print ‘Just self testing’
test1()
89
Download