Modelowanie procesów fizycznych w reaktorach jadrowych Krzysztof Miernik Zakład Fizyki Jadrowej Wydział Fizyki Uniwersytet Warszawski 1
Wykład 2: Wprowadzenie do Pythona 2
Język Python Stworzony w 1991 przez Guido van Rossuma Nazwa pochodzi od Monty Python Flying Circus Jest językiem wysokiego poziomu ogólnego przeznaczenia Jednym z naczelnych założeń projektowych jest czytelność kodu Umożliwia programowanie proceduralne, obiektowe i funkcyjne Typowanie dynamiczne i słabe Automatyczne zarzadzanie pamięcia Bardzo bogata biblioteka standardowa (batteries included) Nieprawdopodobnie bogate biblioteki dodatkowe (i sa łatwe do instalowania) Dlaczego Python? 3
Python, a inne języki Dlaczego Python? 4
Dlaczego Python? Google Trends popularno zapyta wzgl dem kategorii Programowanie Python C++ Fortran Dlaczego Python? 5
Dlaczego Python? Nature 518, 7537 (2015) Dlaczego Python? 6
Wprowadzenie do Pythona Python jako kalkulator liczby, ciagi znaków, listy instrukcje while, if, for skrypty, moduły listy, krotki, słowniki metody wejścia/wyjścia programowanie obiektowe biblioteka standardowa inne biblioteki Podstawy Pythona 7
Python jako kalkulator Duża część przykładów pochodzi z oficjalnego wprowadzenia do Pythona https://docs.python.org/3/tutorial/index.html. Obliczenia w interpreterze >>> 2 + 2 >>> 12 * 0.153-0.33 >>> 12 * (0.153-0.33) >>> 17 / 3 >>> 17 // 3 >>> 17 % 3 >>> 2**3 >>> 2**(1/2) >>> -3**2 >>> (-3)**2 >>> width = 20 >>> height = 50 + 9 >>> width * height >>> _ / 10**2 Podstawy Pythona 8
Łańcuchy znaków (1) Definiowanie łańcucha, polecenie print >>> spam eggs >>> doesn\ t >>> "doesn t" >>> "Yes", he said. >>> "\"Yes\", he said." >>> First line.\nsecond line. >>> s = First line.\nsecond line. >>> print(s) >>> print( C:\some\name ) >>> print(r C:\some\name ) >>> print("""\ Ala ma kota """) >>> 3 * un + ium Podstawowe struktury danych 9
Łańcuchy znaków (2) Podzbiory łańcucha, operacje >>> prefix = Py >>> glued = prefix + thon >>> glued[0] >>> glued[5] >>> glued[-1] >>> glued[-2] >>> glued[0:2] >>> glued[-2:] >>> glued[:2] >>> glued[:2] + glued[2:] >>> glued[0] = C >>> C + glued[1:] >>> len(glued) Podstawowe struktury danych 10
Łańcuchy znaków (3) Formatowanie łańcucha >>> print( {}.format( string )) >>> print( {} ma {}.format( ala, kota )) >>> s = "{0} {1} {2}" >>> s = s.format( Ala, ma, kota ) >>> print(s) >>> s = "{kto} {co} {kogo}" >>> s = s.format(kto= Ala, co= ma, kogo= kota ) >>> print(s) >>> pi = 3.141592653589793 >>> print(pi) >>> print( {:.3f}.format(pi)) >>> print( {:.3e}.format(pi)) >>> print( {: 8.3f}.format(pi)) >>> print( {:#^8.1f}.format(pi)) >>> print( {:*>8.1f}.format(pi)) >>> print( {:$<8.1f}.format(pi)) Podstawowe struktury danych 11
Listy Definiowanie, podstawowe operacje >>> squares = [1, 4, 9, 16, 25] >>> squares >>> squares[2] >>> squares[-1] >>> squares[0:2] >>> squares + [35, 49, 64, 81, 100] >>> squares = squares + [35, 49, 64, 81, 100] >>> squares >>> squares[5] = 36 >>> squares >>> len(squares) >>> letters = [ a, b, c ] >>> mix = squares + letters >>> mix >>> mix = [squares, letters] >>> mix >>> mix[0][3] >>> mix[1][2] Podstawowe struktury danych 12
Skrypty Program można zapisać w postaci skryptu w pliku tekstowym z rozszerzeniem *.py. Np. test.py squares = [1, 4, 9, 16, 25] print(squares) squares = squares + [35, 49, 64, 81, 100] print(squares) squares[5] = 36 print(squares) Skrypt można uruchomić poleceniem $ python test.py Kolejne przykłady będa wykorzystywały tę metodę zamiast interaktywnej powłoki Pythona. Skrypty 13
Instrukcja while Uwaga - w języku Python wcięcia definuja bloki kodu. Należy używać albo spacji, albo tabulatorów, ale nie wolno ich mieszać! a = 0 while a < 5: print(a) a += 1 a, b = 0, 1 while b < 10: print(b) a, b = b, a+b a, b = 0, 1 while b < 100: print(b, end=, ) a, b = b, a+b Instrukcje kontrolne 14
Instrukcja if x = 3 if x < 0: x = 0 print( Negative changed to zero ) elif x == 0: print( Zero ) elif x == 1: print( One ) else: print( More ) Instrukcje kontrolne 15
Pętla for (1) Pętla for porusza się po liście lub innej sekwencji z iteratorem cats = [ natasza, marusia, bolek, lolek ] for c in cats: print(c) Jeżeli chcemy dostać ciag arytmetyczny możemy użyć funkcji range for i in range(5): print(i) for i in range(5, 10): print(i) for i in range(0, 10, 3): print(i) for i in range(10, -5, -2): print(i) Ponieważ długość listy zwraca funkcja len, łatwo jest wygenerować ciag arytmetyczny odpowiadajacy danej liście elementów for i in range(len(cats)): print(i, cats[i]) Instrukcje kontrolne 16
Pętla for (2) W rzeczywistości range nie generuje listy, tylko iterator print(range(5)) print(list(range(5))) W pętli for możemy stosować polecenia break i continue. for num in range(2, 10): if num % 2 == 0: print("found an even number", num) continue print("found a number", num) Polecenie else jest wykonywane tylko jeżeli pętla nie zostanie przerwana przez break. for n in range(2, 20): for x in range(2, n): if n % x == 0: print(n, equals, x, *, n//x) break else: print(n, is a prime number ) Instrukcje kontrolne 17
Pętla while Polecenia continue, break, else można stosować w analogiczny sposób także w pętli while. x = 10 n = 7 while x > 0: if x % n == 0: print(x, is divisible by, n) break x -= 1 else: print( while - else ) Polecenie pass wykonuje pusta instrukcję i może być użyte w miejscach wymaganych przez składnię (np. jako puste miejse do wypełnienia w przyszłości. print( Press ctrl+c ) while True: pass Instrukcje kontrolne 18
Listy i ich metody (1) append, extend, insert, remove, pop, index, count, sort, reverse l = [3, 5, 1] print( list, l) l.append(9) print( append, l) l.extend([7, 13]) print( extend, l) l.insert(5, 11) print( insert, l) l.remove(1) print( remove, l) print(l.pop()) print( pop(), l) print(l.pop(2)) print( pop(2), l) print( 5 at position, l.index(5)) print( 11 appears, l.count(11), times ) l.sort(reverse=true) print( sort, reverse, l) l.reverse() print( reversed, l) Struktury danych 19
Listy i ich metody (2) copy, clear, del m = l.copy() print( copy, l, m) l.clear() print( clear, l, m) del nie zwraca wartości i usuwa element (lub zmienna) del m[0] print( del, m) del m[0:2] print( del, m) del m #print( del, m) Struktury danych 20
Kopiowanie list l = [1, 2, 3] m = l l[0] = 4 print(l, m) m jest tylko referencja do listy. Aby mieć dwie niezależne listy, musimy zrobić kopię. m = l.copy() l[0] = 1 print(l, m) l = [[0], [0], [0]] print(l) m = l.copy() l[0].append(1) print( l =, l, ; m =, m) Ta kopia jest tzw. kopia płytka i nie działa w przypadku zagnieżdżonych struktur. Trzeba użyć kopii głębokiej (o słowie import będzie później). import copy n = copy.deepcopy(l) l[1].append(1) print( l =, l, ; m =, m, ; n =, n) Struktury danych 21
Listy składane squares = [] for i in range(1, 10): squares.append(i**2) print(squares) To samo tylko szybciej (comprehension list) squares = [i**2 for i in range(1, 10)] print(squares) pairs = [(x, y) for x in range(1, 5) for y in range(1, 5) if x < y] print(pairs) pairs = [[(x, y) for x in range(1, z) for y in range(1, z) if x < y] for z in range(3, 6)] for i, p in enumerate(pairs): print(i, p) Struktury danych 22
Krotki i zbiory Krotki (tuple) sa podobne do list, ale sa niezmienne t = 1, 2, 3 r = (1, 2, 3) print(t, r) #t[0] = 0 #r[0] = 0 Zbiory (sets) sa jak zbiory matematyczne (nie może być duplikatów) s = {0, 0, 1, 1, 2, 3} print(s) Operator in odpowiada na pytanie o należność do zbioru (także listy, krotki, itd.) print(0 in s) print( Is in the set ) if 4 in s else print( Not in the set ) Struktury danych 23
Słowniki Słownik (dict) zawiera pary klucz - wartość (klucz musi być unikatowy) d = { Marek : 2.64, Krzysiek : 2.65, Agnieszka : 2.66 } print(d) print(d[ Marek ]) for k, v in d.items(): print(k, v) Klucz musi być niezmienny, więc np. tworzac mapę nuklidów (A, Z) musimy użyć tupli, a nie list jako kluczy. elements = {0 : n, 1 : H, 2 : He, 3 : Li, 4 : Be, 5 : B, 6 : C } nuclides = {} for z in range(len(elements)): for a in range(z, 3 * z): nuclides[(a, z)] = {}{}.format(a, elements[z]) print(nuclides) print( sort by key ) for n in sorted(nuclides.items()): print(n) Struktury danych 24
Funkcje (1) Funkcje tworzy się za pomoca składni def pitagoras(a, b): return (a**2 + b**2)**(1/2) a woła poprzez pitagoras(3, 4) Parametry moga mieć nadane domyślne wartości def arguments(x, x_max=1, dx=0.1): while x < x_max: print(x, x**(1/2)) x += dx wywołanie może mieć wtedy następujace postaci arguments(0.0) arguments(0.0, 2.0) arguments(0.0, dx=0.05) Funkcje 25
Funkcje (2) Odzyskiwanie parametrów w postaci listy i słownika def foo(i, j=1, *arguments, **keywords): print( i =, i) print( j =, j) print( arguments ) for arg in arguments: print(arg) print( keys ) for key in keywords.keys(): print(key) print( values ) for value in keywords.values(): print(value) print( items ) for item in keywords.items(): print(item) print( keys and values ) for key, value in keywords.items(): print(key, value) foo(0, 1, 2, 3, a=4, b=5, c=6) Funkcje 26
Funkcje (3) Parametr domyślny jest wyznaczany tylko raz i w miejscu deklaracji, co ma konsekwencje w pewnych przypadkach x = 5 def f1(arg=x): print(x) x = 6 f1() def f2(a, l=[]): l.append(a) return l print(f2(0)) print(f2(1)) Funkcje 27
Funkcja anonimowa Funkcja anonimowa (lambda) cubic = lambda x: x**3 print(cubic(2)) W szczególności można ich użyć przy sortowaniu list czy słowników for n in sorted(nuclides.items(), key=lambda x: x[0][1] ): print(n) Funkcje 28
Dokumentacja Funkcje (a także inne elementy) powinno się opisywać łańcuchem dokumentacyjnym (docstring). Python automatycznie obsługuje tak tworzona dokumentację. def foo(x): """Podnosi parametr x do kwadratu Bardzo prosta funkcja (bez sensu) """ return x**2 print(foo. doc ) Dokumentacja 29
Moduły Moduł to plik z rozszerzeniem *.py zawierajacy funkcje (i klasy), który można importować i używać w innym module. Plik nuclear_masses.py """ This module contains various methods of calculating nuclear masses. """ def LDM(A, Z, params=standard_params): """Liquid Drop Model""" pass def experimental_mass(a, Z, database= AME2013.dat ): pass if name == main : pass Jeżeli wywołamy powyższy plik jako skrypt, to wykonaja się polecenia obwarowane instrukcja if. Jeżeli natomiast zaimportujemy do innego skryptu, to ta część zostanie pominięta. Moduły i pakiety 30
Moduły Importowanie modułu import nuclear_masses nuclear_masses.ldm(10, 20) Importowanie wybranych funkcji from nuclear_masses import LDM LDM(10, 20) lub wszystkich (zwykle nie używane) from nuclear_masses import * LDM(10, 20) Moduły i pakiety 31
Pakiety Pakiety to moduły, które zawieraja inne moduły (w formie hierarchicznego drzewa) Taki pakiet to np. biblioteka matplotlib służaca do tworzenia wykresów. Zwykle importowany jest tylko moduł pyplot zawierajacy API użytkownika, ale czasem przydaja się inne elementy, np. moduł pozwalajacy na tworzenie animacji animation. import matplotlib.pyplot import matplotlib.animation matplotlib.pyplot.plot(x, y, - ) matplotlib.animation.funcanimation() Wygodnie jest zamiast długiej nazwy zaimportować moduł pod skrócona (dowolna) nazwa import matplotlib.pyplot as plt import matplotlib.animation as movie plt.plot(x, y, - ) movie.funcanimation() Moduły i pakiety 32
Pliki Funkcja open zwraca obiekt powiazany z plikiem, w zależności od trybu otwarcia może być on do odczytu (r), pisania (w, istniejacy plik zostaje skasowany), dopisywania (a), odczytu i zapisu (r+). Dodanie litery b do trybu oznacza tryb binarny, w innym przypadku jest to tryb tekstowy. data_file = open( data.txt, r) Funkcja read służy do czytania danych, read() wczyta cały plik, read(size) wczyta size bajtów. data_file.read(10) Funkcja readline wczytuje jedna linię tekstu (łacznie ze znakiem końca linii). data_file.readline() for line in data_file: print(line, end= ) write służy do pisania w pliku, natomiast seek i tell odpowiednio przesuwaja i zwracaja położenie bieżacej pozycji w pliku. data_file.write( {} {} {} \n.format(0, 0, 1) data_file.seek(10) data_file.tell() Operacje I/O 33
Błędy Prosty program w C++, z drobnym błędem #include <iostream> #include <vector> int main() { std::vector<int> v; if (v > 0) v.pop_back(); } i wynik kompilacji (149 linii) /usr/include/c++/6.3.1/bits/stl_iterator.h:906:5: note: template argument deduction/substitution failed: a.cpp:7:13: note: std::vector<int> is not derived from const gnu_cxx:: normal_iterator<_iterator, _Container> if (v > 0) ^ In file included from /usr/include/c++/6.3.1/bits/stl_algobase.h :67:0, from /usr/include/c++/6.3.1/bits/char_traits.h :39, from /usr/include/c++/6.3.1/ios:40, from /usr/include/c++/6.3.1/ostream:38, from /usr/include/c++/6.3.1/iostream:39, Wyjatki 34
Błędy w Pythonie Podobny program l = [0, 1, 2] if l > 0: l.pop() i próba uruchomienia Traceback (most recent call last): File "test.py", line 2, in <module> if l > 0: TypeError: > not supported between instances of list and int Wszelkie błędy sa zwracane w postaci wyjatków (Exception), należacych do odpowiednich klas. Powyżej mamy bład typu (TypeError). Program wcale nie musi przerywać działania w takiej sytuacji, możliwa jest odpowiednia obsługa wyjatku. data_file = open( data.txt ) counter = 0 for line in data_file: try: counter += int(line) except TypeError: pass Wyjatki 35
Programowanie obiektowe Podejście obiektowe jest próba opisu skomplikowanych systemów za pomoca abstrakcji. Programowanie obiektowe 36
Programowanie obiektowe Podejście obiektowe jest próba opisu skomplikowanych systemów za pomoca abstrakcji. Tworzymy obiekty, z którymi się komunikujemy (i które moga się komunikować między soba), które realizuja zadania dzięki wewnętrznym metodom. Programowanie obiektowe 36
Programowanie obiektowe Podejście obiektowe jest próba opisu skomplikowanych systemów za pomoca abstrakcji. Tworzymy obiekty, z którymi się komunikujemy (i które moga się komunikować między soba), które realizuja zadania dzięki wewnętrznym metodom. Problem dzielimy na pewne zadania, które przypisujemy obiektom i w pewnym sensie nie interesuje nas jak dany obiekt rozwiaże zadanie, o ile robi to zgodnie z oczekiwaniami. Niepotrzebne informacje sa ukryte wewnatrz obiektu. Programowanie obiektowe 36
Programowanie obiektowe Podejście obiektowe jest próba opisu skomplikowanych systemów za pomoca abstrakcji. Tworzymy obiekty, z którymi się komunikujemy (i które moga się komunikować między soba), które realizuja zadania dzięki wewnętrznym metodom. Problem dzielimy na pewne zadania, które przypisujemy obiektom i w pewnym sensie nie interesuje nas jak dany obiekt rozwiaże zadanie, o ile robi to zgodnie z oczekiwaniami. Niepotrzebne informacje sa ukryte wewnatrz obiektu. Każdy obiekt należy do pewnej klasy. Programowanie obiektowe 36
Programowanie obiektowe Podejście obiektowe jest próba opisu skomplikowanych systemów za pomoca abstrakcji. Tworzymy obiekty, z którymi się komunikujemy (i które moga się komunikować między soba), które realizuja zadania dzięki wewnętrznym metodom. Problem dzielimy na pewne zadania, które przypisujemy obiektom i w pewnym sensie nie interesuje nas jak dany obiekt rozwiaże zadanie, o ile robi to zgodnie z oczekiwaniami. Niepotrzebne informacje sa ukryte wewnatrz obiektu. Każdy obiekt należy do pewnej klasy. Każdy obiekt ma swoje zmienne i procedury. Programowanie obiektowe 36
Programowanie obiektowe Podejście obiektowe jest próba opisu skomplikowanych systemów za pomoca abstrakcji. Tworzymy obiekty, z którymi się komunikujemy (i które moga się komunikować między soba), które realizuja zadania dzięki wewnętrznym metodom. Problem dzielimy na pewne zadania, które przypisujemy obiektom i w pewnym sensie nie interesuje nas jak dany obiekt rozwiaże zadanie, o ile robi to zgodnie z oczekiwaniami. Niepotrzebne informacje sa ukryte wewnatrz obiektu. Każdy obiekt należy do pewnej klasy. Każdy obiekt ma swoje zmienne i procedury. Obiekty można ponownie używać w innych programach. Programowanie obiektowe 36
Programowanie obiektowe Podejście obiektowe jest próba opisu skomplikowanych systemów za pomoca abstrakcji. Tworzymy obiekty, z którymi się komunikujemy (i które moga się komunikować między soba), które realizuja zadania dzięki wewnętrznym metodom. Problem dzielimy na pewne zadania, które przypisujemy obiektom i w pewnym sensie nie interesuje nas jak dany obiekt rozwiaże zadanie, o ile robi to zgodnie z oczekiwaniami. Niepotrzebne informacje sa ukryte wewnatrz obiektu. Każdy obiekt należy do pewnej klasy. Każdy obiekt ma swoje zmienne i procedury. Obiekty można ponownie używać w innych programach. Wewnętrzna strukturę obiektów można modyfikować, uzupełniać i poprawiać, o ile nie wpływa to na widziane z zewnatrz własności. Programowanie obiektowe 36
Programowanie obiektowe Podejście obiektowe jest próba opisu skomplikowanych systemów za pomoca abstrakcji. Tworzymy obiekty, z którymi się komunikujemy (i które moga się komunikować między soba), które realizuja zadania dzięki wewnętrznym metodom. Problem dzielimy na pewne zadania, które przypisujemy obiektom i w pewnym sensie nie interesuje nas jak dany obiekt rozwiaże zadanie, o ile robi to zgodnie z oczekiwaniami. Niepotrzebne informacje sa ukryte wewnatrz obiektu. Każdy obiekt należy do pewnej klasy. Każdy obiekt ma swoje zmienne i procedury. Obiekty można ponownie używać w innych programach. Wewnętrzna strukturę obiektów można modyfikować, uzupełniać i poprawiać, o ile nie wpływa to na widziane z zewnatrz własności. Obiekty moga dziedziczyć (łaczyć się hierachicznie) po bardziej ogólnych klasach (np. samochód, czy rower jest bardziej szczegółowa realizacja klasy pojazd). Programowanie obiektowe 36
Programowanie obiektowe Podejście obiektowe jest próba opisu skomplikowanych systemów za pomoca abstrakcji. Tworzymy obiekty, z którymi się komunikujemy (i które moga się komunikować między soba), które realizuja zadania dzięki wewnętrznym metodom. Problem dzielimy na pewne zadania, które przypisujemy obiektom i w pewnym sensie nie interesuje nas jak dany obiekt rozwiaże zadanie, o ile robi to zgodnie z oczekiwaniami. Niepotrzebne informacje sa ukryte wewnatrz obiektu. Każdy obiekt należy do pewnej klasy. Każdy obiekt ma swoje zmienne i procedury. Obiekty można ponownie używać w innych programach. Wewnętrzna strukturę obiektów można modyfikować, uzupełniać i poprawiać, o ile nie wpływa to na widziane z zewnatrz własności. Obiekty moga dziedziczyć (łaczyć się hierachicznie) po bardziej ogólnych klasach (np. samochód, czy rower jest bardziej szczegółowa realizacja klasy pojazd). Obiekty moga zawierać inne obiekty (np. samochód zawiera koła, czujnik prędkości itd.). Programowanie obiektowe 36
Programowanie obiektowe Podejście obiektowe jest próba opisu skomplikowanych systemów za pomoca abstrakcji. Tworzymy obiekty, z którymi się komunikujemy (i które moga się komunikować między soba), które realizuja zadania dzięki wewnętrznym metodom. Problem dzielimy na pewne zadania, które przypisujemy obiektom i w pewnym sensie nie interesuje nas jak dany obiekt rozwiaże zadanie, o ile robi to zgodnie z oczekiwaniami. Niepotrzebne informacje sa ukryte wewnatrz obiektu. Każdy obiekt należy do pewnej klasy. Każdy obiekt ma swoje zmienne i procedury. Obiekty można ponownie używać w innych programach. Wewnętrzna strukturę obiektów można modyfikować, uzupełniać i poprawiać, o ile nie wpływa to na widziane z zewnatrz własności. Obiekty moga dziedziczyć (łaczyć się hierachicznie) po bardziej ogólnych klasach (np. samochód, czy rower jest bardziej szczegółowa realizacja klasy pojazd). Obiekty moga zawierać inne obiekty (np. samochód zawiera koła, czujnik prędkości itd.). W Pythonie wszyscy członkowie klasy sa publiczni, a wszystkie funkcje sa wirtualne (według terminologii C++). Programowanie obiektowe 36
Klasy import math class Point: def init (self, x, y): self.x = x self.y = y def distance(self, point): return math.sqrt((self.x - point.x)**2 + (self.y - point.y)**2) class Circle: def init (self, x, y, r): self.center = Point(x, y) self.r = r def distance_to_perimeter(self, point): return math.sqrt((self.center.x - point.x)**2 + (self.center.y - point.y)**2) - self.r p1 = Point(0, 0) p2 = Point(1, 2) c1 = Circle(1, 1, 1) print(p1.distance(p2)) print(c1.distance_to_perimeter(p2)) print(p1.distance(c1.center)) Programowanie obiektowe 37
Wyjatki - jeszcze raz Nowe wyjatki można tworzyć korzystajac z mechanizmu dziedziczenia. Wszystkie wyjatki dziedzicza po bazowej klasie Exception. class NuclearError(Exception): def init (self, msg = ): self.msg = msg def str (self): return self.msg try: if temp > temp_max: raise NuclearError( Max temp reached ) except NuclearError as err: print(err) Programowanie obiektowe 38
Krótki przeglad bibloteki standardowej (1) argparse - interfejs linii poleceń (parametry) datetime - operacje zwiazane z czasem i kalendarzem dbm - interfejs baz danych DBM distutils - narzędzia do instalowania i tworzenia pakietów Pythona doctest - testowanie dokumentacji email html http math - funkcje matematyczne multiprocessing - przetwarzanie wielowatkowe os - interakcje z systemem operacyjnym Biblioteka standardowa 39
Krótki przeglad bibloteki standardowej (2) random - generatory liczb losowych (płaski, Gauss) re - wyrażenia regularne smtpd - serwer SMTP smtplib - klient SMTP socketserver - operacje sieciowe niskiego poziomu ssl - OpenSSL sqlite3 - interfejs bazy danych SQLite timeit - pomiary wydajności programu tkinter - Tk GUI unittest - testowanie programu xml zipfile Biblioteka standardowa 40
Inne przydatne biblioteki numpy - numerical Python matplotlib QtPy scipy - scientific Python lmfit Ciekawostki SymPy - obliczenia symboliczne Biopython PyChem - astropy - Biblioteka standardowa 41
Podsumowanie 1 Dlaczego Python? 2 Podstawy Pythona 3 Podstawowe struktury danych 4 Skrypty 5 Instrukcje kontrolne 6 Struktury danych 7 Funkcje 8 Dokumentacja 9 Moduły i pakiety 10 Operacje I/O 11 Wyjatki 12 Programowanie obiektowe 13 Biblioteka standardowa Podsumowanie 42