Programowanie Fizyka Medyczna
Wykład III
6 marca 2012
Przypomnienie i rozszerzenie wiadomości z poprzednich wykładów
"program" w Pythonie,
dynamiczne typowanie zmiennych "duck typing",
typy mutable i immutable,
Shallow copy i Deep copy.
Krotka, lista, zbiór i słownik. Konwersja pomiędzy typami złożonymi.
Funkcje:
nieznane ilości zmiennych,
domyślne wartości argumentów,.
Skąd ściągnąć instalację Pythona w systemach Windows i Linux
Funkcje:
zwracanie liczby, listy i innych typów zobaczymy czy zdążymy
Program w Pythonie
Jako "program" traktujemy skrypt uruchamiany przez
Interpreter Python
def mnozrazy3(a):
print("Otrzymalem ", a)
print("Zwracam ", 3*a)
return 3*a
Zapisujemy do pliku
test.py
print("Moj program v1.0")
print(mnozrazy3(4))
print(mnozrazy3("a"))
Plik powinien mieć rozszerzenie .py
1. Możemy go uruchomić przez interpreter:
(Linux) [name@komp:~]$ python3 test.py
(Windows) c:\> pythw test.py
2. W linuxie (i systemach zgodnych z POSIX) możemy skorzystać ze
specjalnej interpretacji komentarza zaczynającego się of #!.
Programowanie FizMed, wykład 3 2
Program w Pythonie
Specjalny komentarz w pliku zródłowym
Modyfikujemy plik zródłowy dodając pierwszą linijkę, która będzie
zignorowana przez Windows, ale ma specjalne znaczenie dla powłoki
systemu Linux.
Nazwa interpretera
#!/usr/bin/python3
#!/usr/bin/python3
def mnozrazy3(a):
def mnozrazy3(a):
Definicja funkcji musi nastąpić przed
print("Otrzymalem ", a)
print("Otrzymalem ", a)
jej pierwszym użyciem
print("Zwracam ", 3*a)
print("Zwracam ", 3*a)
return 3*a
return 3*a
print("Moj program v1.0")
print("Moj program v1.0")
print(mnozrazy3(4))
print(mnozrazy3(4))
Program zaczyna wykonywać się od
print(mnozrazy3("a"))
print(mnozrazy3("a"))
początku pliku. Nie ma wyróżnionej funkcji
startowej jak np main() w języku C.
Programowanie FizMed, wykład 3 3
Program w Pythonie
Moduł rozszerzający jako samodzielny program.
Jeżeli napisany przez nas program zawiera definicje funkcji lub klas, które
możemy użyć niezależnie, można wykorzystać go jako moduł i wczytać do
innego programu poprzez instrukcję import. Musimy tylko zablokować
cześć wykonywalną, tak żeby zostały przetworzone tylko definicje,
Jeżeli nasz program wykonuje się
#!/usr/bin/python3
samodzielnie, ma zdefiniowaną globalną
zmienną __name__, której wartość wynosi
def mnozrazy3(a):
"__main__"
print("Otrzymalem ", a)
print("Zwracam ", 3*a)
return 3*a
Ta linia sprawdza warunek czy
__name__ równe jest "__main__"
if __name__ == "__main__":
print("Moj program v1.0")
Pozostały blok instrukcji zawarty jest w
print(mnozrazy3(4))
instrukcji warunkowej i nie wykona się, gdy
print(mnozrazy3("a"))
skorzystamy z naszego modułu poprzez
import.
Programowanie FizMed, wykład 3 4
Python jest językiem typowanym dynamicznie
>>> i = int(2) # i jest typu int
>>> f = float(5.4) # f jest typu float
>>> d = float(3) #d jest typu float
>>> c = complex (0,2) #c jest typu complex
W Pythonie zmienne nie mają "na stałe" przypisanego
konkretnego typu. Ich typ może się zmieniać dynamicznie w
czasie wykonywania programu.
>>> d = i # d jest teraz typu int
>>> i = f # i jest teraz typu float
>>> f = c # f jest teraz typu complex
Typ zwracany przez funkcję również jest określany
dynamicznie w czasie jej wykonania
Programowanie FizMed, wykład 3 5
Python jako język typowany dynamicznie
duck typing
Popatrzmy na użytą wcześniej funkcję mnozrazy3.
def mnozrazy3(a):
print("Otrzymalem ", a)
print("Zwracam ", 3*a)
return 3*a
Jaki typ ma zmienna a?
Przy pierwszym wywołaniu mnozrazy3(4) int.
Przy drugim wywołaniu mnozrazy3("a") str.
Jest to element typowania dynamicznego tzw. duck typing.
Do funkcji mnozrazy3 możemy wstawić dowolny obiekt, dla którego ma
sens operacja 3*a (czyli wywołanie funkcji __mul__). Typ zmiennej a jak i
typ zwracany przez funkcję jest ustalony dynamicznie w czasie jej
wywołania.
Programowanie FizMed, wykład 3 6
Typy modyfikowalne (mutable) i nie (immutable)
Typy
Mutable
Immutable
krotka (tuple),
lista (list),
zbiór zamknięty (frozenset),
zbiór (set),
Liczby int, float, complex
słownik (dictionary),
Ciągi:
tablica znaków (bytearray)
Liter str
Bajtów - bytes
Można modyfikować ich Nie można ich zmodyfikować
poszczególne elementy. bez zniszczenia oryginału i
utworzenia nowej kopii.
Programowanie FizMed, wykład 3 7
http://docs.python.org/release/3.1.3/library/stdtypes.html
Typy mutable i immutable oraz "shallow copy"
1. Obiekty typu immutable nie mogą zostać zmienione w funkcji ani w programie.
2. Generalnie przy przekazywaniu do funkcji trafia kopia zmiennej.
3. Przy obiektach typu mutable możemy mieć do czynienia z przekazaniem do
funkcji nie przez pełną kopię ale przez tzw. shallow copy ('płytką kopię').
Mamy z tym do czynienia na przykład w przypadku listy.
Jest to przydatne wtedy, gdy przekazywany obiekt może być dużych rozmiarów
np. lista złożona z miliona elementów. Do funkcji trafia wtedy odnośnik(referencja)
do danego obiektu (zajmujący zwykle mało miejsca), a nie sam obiekt.
Wtedy funkcją ma możliwość zmiany przekazanego obiektu.
a = [ 'c', 'd' ] # dwuelementowa lista
b = 3*a # nowa lista utworzona z 3 pełnych kopii a
c = [ 'u', a, 'w'] # nowa lista z referencją a
d = [ 'u', a[:], 'w'] # nowa lista z "shallow copy" a
Ile wynoszą wartości a,b,c,d?
a[0] = 'f'
Ile teraz wynoszą wartości a,b,c,d?
Programowanie FizMed, wykład 3 8
Czy funkcja może zmienić przekazaną do niej zmienną?
Przykład na liście
def zmienmnie3(a):
def zmienmnie2(a):
print("Otrzymalem ", a)
print("Otrzymalem ", a)
a=3*a # pełna kopia
a[0] =2 # zmiana oryginału
a[0] =2 #zmiana kopii
a=3*a # kopia już ze zmianą
print("Zwracam ", a)
print("Zwracam ", a)
return a
return a
a=[4]
a=[4]
print("Przed zmiana a=",a)
print("Przed zmiana a=",a)
zmienmnie3(a)
zmienmnie2(a)
print("Po zmianie a=",a)
print("Po zmianie a=",a)
Przed zmiana a= [4]
Wypisuje
Otrzymalem [4]
Przed zmiana a= [4]
Zwracam [2, 4, 4]
Otrzymalem [4]
Po zmianie a= [4]
Zwracam [2, 2, 2]
Po zmianie a= [2]
Programowanie FizMed, wykład 3 9
Listy, czyli modyfikowalne sekwencje
Zapisujemy je jako uporządkowany ciąg elementów oddzielonych przecinkami,
ujętych w nawiasy kwadratowe.
>>> a = [ "a" ] # Jest listą z jednym elementem "a".
Listy moga składać się z różnych obiektów, w szczególności z innych list.
>>> b = [ 3, a ] # uwaga na referencję
>>> c = [ 3, a[:] ] # shallow copy
Listy nie moga być kluczem w słowniku nie są "hashable"
Listy są indeksowalne
>>> b[0] # zwraca jeden, pierwszy element
>>> b[0:1] # zwraca listę jednoelementową
Listy są iterowalne
>>> for i in b:
print i
Ilość elementów w zewnętrznej liście zwraca funkcja
>>>len(b)
Programowanie FizMed, wykład 3 10
Zbiory set i frozenset
Jest to nieuporządkowany ciąg elementów oddzielonych przecinkami, ujętych w
nawiasy klamrowe.
>>> a = {"u"} # Jest to zbiór set z jednym elementem "u".
>>> b = frozenset(a) # Jest to zbiór frozenset z jednym elementem "u".
Oba typy zbiorów mogą się składać tylko z elementów typu hashable.
Zbiory typu set nie są "hashable" nie mogą być składnikami innych zbiorów i nie
mogą być kluczami w słowniku.
Zbiory typu frozenset są "hashable" mogą być składnikami innych zbiorów i
kluczami w słowniku
Zbiory nie są indeksowalne
>>> b[0] # błąd nie ma w nich ustalonego porządku
Zbiory są iterowalne
>>> for i in b:
print i
Ilość elementów w zbiorze zwraca funkcja
>>>len(b)
Programowanie FizMed, wykład 3 11
Słowniki (dictionary) jako tablice asocjacyjne (mapowania)
Zapisujemy je jako nieuporządkowany ciąg par elementów klucz:wartość oddzielonych
przecinkami, ujętych w nawiasy klamrowe.
>>> a = {"a":1} # Słownik z jednym elementem o wartości 1 dla klucza "a.
Kluczami w słowniku mogą być tylko elementy typu "hashable".
Słowniki nie są typu "hashable" nie moga być kluczem innym w słowniku
Słowniki są indeksowalne tylko poprzez klucze
>>> a["a"] # 1
Słowniki są iterowalne
>>> for i in a:
print i
Ilość elementów w słowniku zwraca funkcja
>>>len(b)
Wszystkie klucze w słowniku możemy uzyskać przy pomocy metody keys.
a.keys()
Wszystkie wartości w słowniku możemy uzyskać przy pomocy metody values.
a.values()
Obie zwracają "widoki", które można przekonwertować
Programowanie FizMed, wykład 3 12
Krotki, czyli n-tuple
Zapisujemy je jako uporządkowany ciąg elementów oddzielonych przecinkami,
ujętych w nawiasy okrągłe.
>>> a = ("a",)
Jest krotką z jednym elementem "a".
Krotki moga składać się z różnych obiektów, w szczególności z innych krotek.
>>> b = (3, a)
>>> b
(3, ("a",))
Krotki są "hashable" moga być kluczem w słowniku
>>> c = {b:"a"}
Krotki są indeksowalne
>>> b[0]
Krotki są iterowalne
>>> for i in b:
print i
Ilość elementów w zewnętrznej krotce zwraca funkcja
>>>len(b)
Programowanie FizMed, wykład 3 13
Konwersje pomiędzy typami złożonymi
Większość konwersji możliwa jest poprzez użycie domyślnego konstruktora obiektu
danej klasy, czyli. tuple, list, set lub frozenset. Klucze i wartości słownika możemy
użyć poprzez metody keys i values zwracające obiekt typu view.
Na przykład
a = ['a', 'b', 'c', 'd'] # Co jest tu utworzone?
b = tuple(a) # typ b to ?
c= set(a) # c? tuple set
d= set(b) # d?
e = list(d) # e ?
keys
list frozenset
dict
values
Programowanie FizMed, wykład 3 14
Funkcje i ich argumenty
W Pythonie (podobnie jak w C) nie ma różnicy pomiędzy funkcją i procedurą,
tak jak na przykład w Pascalu. To znaczy procedura jest po prostu funkcją, która nie
zwraca żadnej wartości.
Funkcje możemy podzielić na te, które umieszczone są poza jakąkolwiek inną klasą
oraz takie, które wbudowane są do definicji jakiejś klasy.
W przypadku, gdy funkcją zdefiniowana jest wewnątrz jakiejś klasy mówimy, że
jest jej metodą.
Funkcją (metoda) identyfikowana jest przez jej sygnaturę, na którą składają się:
jej nazwa oraz jej ilość parametrów.
def f1():
print("f1 nie ma parametrów")
f1() # OK
f1(1) # Błąd f1 nie pobiera żadnych parametrów, a w wywołaniu jest jeden
Programowanie FizMed, wykład 3 15
Funkcje i domyślne wartości argumentów
Funkcją (metoda) identyfikowana jest przez jej sygnaturę, na którą składają się:
jej nazwa oraz jej ilość parametrów.
Nie możemy podać więcej parametrów niż zdefiniowaliśmu, ale możemy podać
mniej.
def f2(a, b=1,c=2):
print("Wartości a = {}, b={}, c={}".format(a,b,c)) # metoda format zaraz będzie
f2() # Błąd! TypeError: f2() takes at least 1 argument (0 given)
# Nie mamy wartości dla pierwszego parametru
f2(1) # OK
# a=1, b=1, c=2
f2(1,3) # OK
# a=1, b=3, c=2
f2(1,3,5) # OK
# a=1, b=3, c=5
Programowanie FizMed, wykład 3 16
Nazwy argumentów i ich nieznana liczba
def f2(a, b=1,c=2):
print("Wartości a = {}, b={}, c={}".format(a,b,c))
Nie musimy też trzymać się ściśle kolejności o ile podamy nazwy argumentów
(named arguments/ keyword args)
f2(1, c=5) # OK
# a=1, b=1, c=5
f2(c=5,a=1, b=3) # OK
# a=1, b=3, c=5
Jest równoważne
f2(1,3,5) # OK
# a=1, b=3, c=5
Jak zabezpieczyć się przez nieuważnym programistą?
Można przechwycić nadmiar argumentów do:
krotki jeżeli są tylko wartości
lub słownika dla named arguments.
Programowanie FizMed, wykład 3 17
args i kwargs
def f3(a, b=1,c=2, *args, **kwargs):
print("Wartości a = {}, b={}, c={}".format(a,b,c))
print(args)
print(kwargs)
Funkcja f3 oczekuje na jeden argument a.
Następne dwie wartości nie muszą być podane, ale jeżeli się pojawią będa
przypisane w kolejności b i c , chyba że jawnie poda się nazwy.
Pozostałe wartości bez nazw zostaną "zapakowane" do krotki o nazwie args.
Pozostałe named arguments zostaną "zapakowane" do słownika o nazwie kwargs.
Na przykład:
f3(1,2,3,4,5,6, ala=7)
args = (4, 5, 6)
kwargs = {"ala": 7}
UWAGA! Nie można mieszać named arguments ze zwykłymi parametrami
f3(1,2, ala=7, 3,4,5,6) # Błąd !
Programowanie FizMed, wykład 3 18
Wracając do liczb
Co znaczą '+', '-' itd?
['__abs__', '__add__', '__bool__', '__ceil__', , '__divmod__', '__float__',
'__floor__', '__floordiv__',, '__invert__', '__mod__', '__mul__', '__neg__',
'__pos__', '__pow__', '__radd__', '__rdivmod__', '__reduce__',
'__reduce_ex__', '__rfloordiv__', , '__rmod__', '__rmul__',, '__round__',
'__rpow__', , '__rsub__', '__rtruediv__', '__sub__', , '__truediv__',
'__trunc__']
x + y sum of x and y x.__add__(y)
x - y difference of x and y x.__sub__(y)
x * y product of x and y x.__mul__(y)
x / y quotient of x and y x.__truediv__(y)
x // y floored quotient of x andy (1) x.__floordiv__(y)
x % y remainder of x / y (2) x.__mod__(y)
-x x negated x.__neg__(y)
+x x unchanged x.__pos__(y)
abs(x) absolute value or magnitude ofx
float(x) x converted to floating point (4)
divmod(x, y) the pair (x // y, x % y)
pow(x, y) x to the power y
pow() x ** y x to the power y
Programowanie FizMed, wykład 3 19
Wracając do liczb
Czym są operatory logiczne np ==, <, != ?
[ '__and__', '__bool__', '__eq__', '__ge__', '__gt__',
'__hash__', '__le__', '__lt__', '__ne__', __or__',
'__rand__','__ror__']
and __and__
or __or__
not zależy od __bool__, które musi zmapować nasz obiekt
na fałsz (False, == 0) lub prawdę (True, != 0)
< __lt__ less then
> __gt__ greater then
== __eq__ equal
!= __ne__ not equal
>= __ge__ greater or equal
<= __le__ less or equal
Programowanie FizMed, wykład 3 20
Wracając do liczb całkowitych
Czym są operatory bitowe np &, |, ^ ?
Są to operacje wykonywane na bitowej reprezentacji liczb całkowitych
import sys
sys.byteorder Ta wartość wynosi 'little' or 'big' Intel/AMD = little
Little endian najmłodszy bajt jest pierwszy
Big endian najstarszy bajt jest pierwszy
Reprezentację możemy uzyskać poprzez funkcję
int.to_bytes(length, byteorder, *, signed=False)
Która zwraca tablicę bajtów.
x | y bitwise or of x and y
x ^ y bitwise exclusive or of x and y
Przykłady
x & y bitwise and of x and y
x << n x shifted left by n bits
x >> n x shifted right by n bits
~x the bits of x inverted
Programowanie FizMed, wykład 3 21
Instalacja Python - Linux
Obecny w nowych dystrybucjach Linux
Dystrybucje oparte na Redhat (pakiety RPM)
su - #wchodzimy na konto administratora
yum install python3
Dystrybucje oparte na Debianie (pakiety deb)
sudo apt-get install python3
+ Pakiety
Numpy, scipy w dystrybucjach
Większy problem jest z matplotlib dla Python3, który trzeba
ściągnać i skompilowac ręcznie
(Linux) git clone https://github.com/matplotlib/matplotlib
python3 setup.py build_py
python3 setup.py build
python3 setup.py install
Proszę zostawić tylko tkagg jako backend.
Programowanie FizMed, wykład 3 22
Instalacja Python - Windows
Pod Windows istnieją gotowe pakiety instalacyjne na systemy 32 i
64bitowe.
Na razie proszę ściągnąć tylko wersję 32 bitową, która na pewno
działa.
http://www.python.org/ftp/python/3.2.2/python-3.2.2.msi
+ Pakiety
Numpy, scipy, matplotlib
http://www.lfd.uci.edu/~gohlke/pythonlibs/
matplotlib-1.2.x.win32-py3.2.exe
http://sourceforge.net/projects/scipy/files/scipy/0.10.1/scipy-0.10.1-
win32-superpack-python3.2.exe/download
http://sourceforge.net/projects/numpy/files/NumPy/1.6.1/numpy-
1.6.1-win32-superpack-python3.2.exe/download
Programowanie FizMed, wykład 3 23
Funkcja zwracająca sekwencję np. listę
Chcemy napisać funkcję, która może być użyta z jednym argumentem np.
a = mojafunkcja(2)
lub też z listą
a = mojafunkcja([1, 2, 3, 4, 5])
I jej działanie polegało na mnożeniu razy 3
Na pierwszy rzut oka możę się to wydawać proste, ale jak zdefiniować listę
argumentów takiej funkcji? Ponizszy kod działa tylko dla listy.
Wersja 1
def mojafunkcja(a):
result = []
if type(a) == list:
for i in a:
result.append(3*i)
return result
else:
return a*3
Programowanie FizMed, wykład 3 24
Funkcja zwracająca sekwencję np. listę
Wersja 2
def moja(*args):
if len(args)>1:
print("Tylko jeden argument: liczba, lista lub Numpy.array")
return None
if type(args[0])==int or type(args[0]) == float:
return args[0]*3
result = []
mytype = type(args[0])
for _tii in args[0]:
result.append(_tii*3)
return mytype(result)
Powyższa funkcja przyjmuje dowolną ilośc argumentów, ale warunek len(args)>1
powoduje, że zwróci wartość tylko gdy podany zostanie jeden.
Jeżeli będzie to liczba, zwrócona zostanie jej wartość *3 return args[0]*3
W pozostałych przypadkach pierwszy argument jest typu mytype = type(args[0]).
Tworzona jest lista jego elementów pomnożonych *3, która jest następnie
konwertowana na właściwy typ mytype(result). To działa dla krotki, listy, itp.
Programowanie FizMed, wykład 3 25
Na zakończenie:
F U CN RD THS,
U CN GT GD JB S CMPTR PRGMR
Programowanie FizMed, wykład 3 26
Wyszukiwarka
Podobne podstrony:
wyklad5 Pythonwyklad4 Pythonwyklad7 Pythonwyklad6 PythonPython wykladSieci komputerowe wyklady dr FurtakWykład 05 Opadanie i fluidyzacjaWYKŁAD 1 Wprowadzenie do biotechnologii farmaceutycznejmo3 wykladyJJZARZĄDZANIE WARTOŚCIĄ PRZEDSIĘBIORSTWA Z DNIA 26 MARZEC 2011 WYKŁAD NR 3Wyklad 2 PNOP 08 9 zaoczneWyklad studport 8Kryptografia wykladwięcej podobnych podstron