Upload
others
View
4
Download
0
Embed Size (px)
Citation preview
Technologie Informacyjne i Komunikacyjne RPython cz. 3
Katarzyna Grzelak
14 listopada 2019
K.Grzelak (UW) 1 / 62
Sterowanie programem - podsumowanie -rozszerzenia
K.Grzelak (UW) 2 / 62
Instrukcje warunkowe - podsumowanie
if a>0:print(’Liczba dodatnia’)
Po instrukcji if mozna umiescic dowolna liczbe bloków elif i blokelse
if a==0:print(’Zero’)
elif a>0:print(’Liczba dodatnia’)
elif -10<a<0:print(’Liczba ujemna wieksza od -10’)
else:print(’Liczba ujemna mniejsza lub równa -10’)
K.Grzelak (UW) 3 / 62
Petla for - podsumowanie
Petla for po typie iteracyjnym. Wypisywanie liczb w jednymwierszu.
for i in range(0,6):print(i,end=" ")
print()
for i in range(2,20,2):print(i,end=" ")
print()
K.Grzelak (UW) 4 / 62
Petla for - podsumowanie
Petla for po typie sekwencyjnym. Wypisywanie liczb wkolumnie.
liczby = 15, 134, 12, 31for i in liczby:
print(i)
liczby=[234, 54, 15, 45]for i in liczby:print(i)
K.Grzelak (UW) 5 / 62
Petla while - podsumowanie
Petla while (wykonuje sie dotad az warunek wnagłówku przestanie byc spełniony)
i=0while i<5:
print(i)i+=1
K.Grzelak (UW) 6 / 62
Petle - podsumowanie
Instrukcja break przerywa działanie petli for lub while
Instrukcja continue powoduje przejscie do kolejnegoobiegu petliPetle for i while moga byc zakonczone else.
K.Grzelak (UW) 7 / 62
Petle - podsumowanie
for n in range(2, 10):for dzielnik in range(2, n):
if n % dzielnik == 0:print(n, ’=’, dzielnik, ’*’, n//dzielnik)break
else:print(n, ’jest liczba pierwsza’)
https://docs.python.org/3/library/
K.Grzelak (UW) 8 / 62
Instrukcja pass
Instrukcja pass zastepuje kod, który bedziemy chcieli wpisac wprzyszłosci
if a==0:print(’Zero’)
elif a>0:print(’Liczba dodatnia’)
elif -10<a<0:pass
else:print(’Liczba ujemna mniejsza lub równa -10’)
K.Grzelak (UW) 9 / 62
Wyrazenie trójargumentowe
x = A if B else C
rodzaj = ’parzysta’ if liczba%2==0 else ’nieparzysta’
print(’Liczba jest ’,rodzaj)
Równowazne takiej instrukcji warunkowej:
if liczba%2==0:rodzaj=’parzysta’
else:rodzaj=’nieparzysta’
print(’Liczba jest ’,rodzaj)
K.Grzelak (UW) 10 / 62
Typy sekwencyjne - podsumowanie
K.Grzelak (UW) 11 / 62
Modyfikowalne i niemodyfikowalne typy sekwencyjne
Sekwencje niemodyfikowalne (immutable)
krotka (tuple)ciag (łancuch) znaków (str)ciag (łancuch) bajtów (bytes)
Sekwencje modyfikowalne (mutable)
lista (list)
K.Grzelak (UW) 12 / 62
Krotki - kontynuacja
K.Grzelak (UW) 13 / 62
Krotki
Krotki – obiekty, których nie mozna zmieniac. Działajaszybciej od list.
Tworzenie krotek - przykładypusta_krotka = ()krotka1 = 1, 3, 4krotka2 = (5, 6, 7)krotka3 = tuple(’Napis’)krotka4 = tuple([125,81,16,25])krotka5 = tuple(range(5,15))krotka6 = ((1,4,9) , (1,2**3,3**3))
K.Grzelak (UW) 14 / 62
Rozpakowywanie krotek
# Rozpakowywanie krotki
a,b,c = krotka1print(a,b,c)a,b,c,*reszta = krotka5print(a,b,c)print(’reszta=’, reszta)
# Zamiana nazw zmiennych
liczba1=100liczba2=1000liczba1, liczba2 = liczba2, liczba1print (liczba1,liczba2)
K.Grzelak (UW) 15 / 62
Najwiekszy wspólny dzielnik - algorytm EuklidesaZamiana nazw zmiennych klasycznie
def nwd(a,b):# Jezeli a<b zamieniamy kolejnoscif a<b:temp=aa=bb=temp
while b:r=a%ba=bb=r
return a
K.Grzelak (UW) 16 / 62
Najwiekszy wspólny dzielnik - algorytm EuklidesaZamiana nazw zmiennych krócej
def nwd(a,b):# Jezeli a<b zamieniamy kolejnoscif a<b:a,b=b,a
while b:r=a%ba,b=b,r
return a
K.Grzelak (UW) 17 / 62
Rozpakowywanie krotek
punkty = ((3,7,5),(1,1,1),(8,5,3))
for x,y,z in punkty:print(x,y,x)
# To samo sformatowane: uzycie funkcji format
for x,y,z in punkty:print(’x={0}, y={1}, z={2}’.format(x,y,z))
Tak samo dla list
K.Grzelak (UW) 18 / 62
Listy - kontynuacja
K.Grzelak (UW) 19 / 62
Listy
Listy mozna modyfikowac. Moga miec zmiennadługosc.
Tworzenie list - przykładypusta_lista = []lista1 = [5, 6, 7]lista2 = list(’Napis’)lista3 = list([125,81,16,25])lista4 = list(range(5,15))lista5 = [[1,4,9] , [1,2**3,3**3]]
Listy znaków
znaki1=[’A’,’B’,’D’,’Z’] znaki2=list(’ABCDE’)
K.Grzelak (UW) 20 / 62
Listy - dodawanie i usuwanie elementów
s.append(j): Dodawanie elementu na konculistys.insert(i,n): Wstawianie elementu n podindeksem i (i przesuwanie).Wolniejsze niz appends.pop(i): Usuwanie elementu o indeksie i.s.remove(n): Usuwanie pierwszego elementu ookreslonej wartosci.s.extend(lista): Rozbudowanie listy
K.Grzelak (UW) 21 / 62
Powtórzenie. Kiedy tworzone nowe obiekty w pamieci?
Zwykłe zmienne
W drugiej linijce nazwy a i b sa zwiazane z tymsamym obszarem w pamieci !
a=15b=aa=123
K.Grzelak (UW) 22 / 62
Kiedy tworzone nowe obiekty w pamieci ?
Zwykłe zmiennea=15b=aa+=5
Zwykłe zmiennea=15b=ab+=5
K.Grzelak (UW) 23 / 62
Kiedy tworzone nowe obiekty w pamieci ?
Listy
W drugiej linijce nazwy lista2 i lista1 sa zwiazane ztym samym obszarem w pamieci !
lista1=[1,15,3,44,5]lista2=lista1lista1=[’pies’,’kot’,’mis’,15]
K.Grzelak (UW) 24 / 62
Kolejny przykład z listami
lista1=[1,15,3,44,5]lista2=lista1lista2[1]=666print("lista1= ", lista1)print("lista2= ", lista2)# Wymuszone stworzenie nowej listylista3=lista1[:]lista2[0]=0print("lista1= ", lista1)print("lista3= ", lista3)
Wyniklista1= [1, 666, 3, 44, 5]lista2= [1, 666, 3, 44, 5]lista1= [0, 666, 3, 44, 5]lista3= [1, 666, 3, 44, 5]
K.Grzelak (UW) 25 / 62
Podsumowanie
T1=[125,225,369]# Tu NIE tworzony nowy obiektT2=T1# Tu tworzony nowy obiektT3=T1[:]# Tu tez tworzony nowy obiektT4=list(T1)
Tak mozna sprawdzic czy tworzony nowy obiekt
if T2 is T1:print(’T1 i T2 odwoluja sie do tego ’’samego obiektu’)
K.Grzelak (UW) 26 / 62
Słowniki - poczatek
K.Grzelak (UW) 27 / 62
Słownik
Zbiór par klucz-wartosc. Rozmiar słownika (inaczej tablicyasocjacyjnej, mapy) moze sie zmieniac. Klucze od wartoscioddzielane sa dwukropkami.
Tworzenie słowników - przykładypusty_slownik = {}
Taki sam słownik zdefiniowany na kilka sposobów:
a = {’one’: 1, ’two’: 2, ’three’: 3}b = dict(one=1, two=2, three=3)c = dict(zip([’one’, ’two’, ’three’], [1, 2, 3]))d = dict(zip((’one’, ’two’, ’three’), (1, 2, 3)))e = dict([(’two’, 2), (’one’, 1), (’three’, 3)])f = dict({’three’: 3, ’one’: 1, ’two’: 2})
https://docs.python.org/3/library/
K.Grzelak (UW) 28 / 62
Słownik
a = {’one’: 1, ’two’: 2, ’three’: 3}print(list(a.keys()))print(list(a.values()))if ’four’ not in a:
print("Klucza ’four’ nie ma w słowniku")print(a[’one’])a[’one’]=0print(a)del a[’two’]print(a)
Wynik działania programu[’one’, ’two’, ’three’][1, 2, 3]Klucza ’four’ nie ma w słowniku1{’one’: 0, ’two’: 2, ’three’: 3}{’one’: 0, ’three’: 3}
K.Grzelak (UW) 29 / 62
Zbiory - poczatek
K.Grzelak (UW) 30 / 62
Zbiór
Zbiór nieuszeregowanych, unikalnych elementów(słowniki składajace sie z samych kluczy")
s1={1,2,5,6,6,5,5,5}s2=set([1,2,5,6,6,5,5,5])
Wynik działania programu{1, 2, 5, 6}{1, 2, 5, 6}
K.Grzelak (UW) 31 / 62
Listy składane
K.Grzelak (UW) 32 / 62
Listy składane
lista = [ f(i) for i in X if g(i) ]
Tworzenie listy lista z wartosci funkcji f na tychelementach obiektu X, które spełniaja warunek g.
K.Grzelak (UW) 33 / 62
Listy składane
Przykładlista = [i**2 for i in range(20) if i%2==1]
print(lista)
Konstrukcja równowazna do:
lista = []for i in range(20):
if i%2 == 1:lista.append(i**2)
print(lista)
K.Grzelak (UW) 34 / 62
Powiekszanie listy w funkcji
K.Grzelak (UW) 35 / 62
Przykład z poprzedniego wykładu
def dzien(x, L):L.append(x)return L
T1=[’TN’,"11.11.2019","C. Olimp."]print(dzien(’czwartek’,T1))print(dzien(’wtorek’,T1))print(dzien(’poniedzialek’,T1))
Wynik działania programu[’TN’, ’11.11.2019’, ’C. Olimp.’, ’czwartek’][’TN’, ’11.11.2019’, ’C. Olimp.’, ’czwartek’, ’wtorek’][’TN’, ’11.11.2019’, ’C. Olimp.’, ’czwartek’, ’wtorek’, ’poniedziałek’]
K.Grzelak (UW) 36 / 62
Wersja 2
def dzien(x, L):L2=L[:]L2.append(x)return L2
T1=[’TN’,"11.11.2019","Centrum Olimpijskie"]print(dzien(’czwartek’,T1))print(dzien(’wtorek’,T1))print(dzien(’poniedzialek’,T1))
Wynik działania programu[’TN’, ’11.11.2019’, ’Centrum Olimpijskie’, ’czwartek’][’TN’, ’11.11.2019’, ’Centrum Olimpijskie’, ’wtorek’,][’TN’, ’11.11.2019’, ’Centrum Olimpijskie’, ’poniedziałek’]
K.Grzelak (UW) 37 / 62
Wersja 3
def dzien(x, L):L2=list(L)L2.append(x)return L2
T1=[’TN’,"11.11.2019","Centrum Olimpijskie"]print(dzien(’czwartek’,T1))print(dzien(’wtorek’,T1))print(dzien(’poniedzialek’,T1))
Wynik działania programu[’TN’, ’11.11.2019’, ’Centrum Olimpijskie’, ’czwartek’][’TN’, ’11.11.2019’, ’Centrum Olimpijskie’, ’wtorek’,][’TN’, ’11.11.2019’, ’Centrum Olimpijskie’, ’poniedziałek’]
K.Grzelak (UW) 38 / 62
Funkcje - podsumowanie
K.Grzelak (UW) 39 / 62
Funkcje - podsumowanie
Funkcje – podstawowy sposób organizacji kodu uzywanegowielokrotnie.
Instrukcja return przerywa działanie funkcji i zwraca daneW funkcji moze byc wiecej niz jedno polecenie return
Jesli nie ma zadnego return to funkcja zwraca obiekt None
K.Grzelak (UW) 40 / 62
Funkcje – zwracanie wartosci logicznej
Przykładdef doskonala(liczba):
suma = 0for i in range(1,liczba):
if liczba%i == 0:suma+=i
if suma==liczba:return True
else:return False
K.Grzelak (UW) 41 / 62
Funkcje – zwracanie wielu wartosci
Funkcja moze zwracac wiele wartosci !!
def sumy(a,b):suma_p=0suma_np=0for liczba in range(a,b+1):
if(liczba%2==0):suma_p+=liczba
else:suma_np+=liczba
suma=suma_p+suma_npreturn suma_p,suma_np,suma
suma1,suma2,suma_tot = sumy(1,10)# Mozna tez tak:wyniki = sumy(5,30)
K.Grzelak (UW) 42 / 62
Funkcje - zakresy waznosci zmiennych
Zakresy waznosci zmiennych
def f1():l1 = []for i in range(1,10):
l1.append(i)
# Mozliwe, ale nie polecane:l2 = []def f2():
for i in range(1,10):l2.append(i)
f1()f2()# Bład# print(l1)print(l2)
K.Grzelak (UW) 43 / 62
Funkcje - argumenty domyslne
def wypisz(imie,nazwisko,grupa=4,rok=1):print(imie, nazwisko, grupa, rok )
wypisz(’Jan’,’Kowalski’)wypisz(’Piotr’,’Majewski’,5,2)wypisz(’Adam’,’Nowakowski’,rok=3)wypisz(nazwisko="Makowska",imie="Anna",rok=3,grupa=5)
K.Grzelak (UW) 44 / 62
Argumenty funkcji
Funkcje moga miec argumenty:pozycyjnedefiniowane za pomoca słów kluczowych (dodefiniowania wartosci domyslnych)
Argumenty definiowane za pomoca słów kluczowychmusza byc za argumentami pozycyjnymi.
K.Grzelak (UW) 45 / 62
Przekazywanie do funkcji elementów listy/krotki ilisty/krotki jako całosci
Przekazujemy elementy listydef suma(a,b,c):
return a+b+c
lista=[4,5,2]
print(suma(*lista))
Przekazujemy cała listedef suma(l):
return sum(l)
lista=[4,5,2]
print(suma(lista))
K.Grzelak (UW) 46 / 62
Zmienna liczba argumentów funkcji
def fun1(*args):print(args)return len(args)
print(fun1(’Ala ma kota’))print(fun1(25,77,’Kwadrat’,25.5))
def fun2(*args,**kwargs):print(args)print(kwargs)
fun2(25,77,imie="Anna",grupa=4)
K.Grzelak (UW) 47 / 62
Funkcje anonimowe - lambda
Zwykła funkcjadef kwadrat(x):
return x**2print(kwadrat(5))
Funkcja lambdakwadrat_l = lambda x: x**2print (kwadrat_l(5))
Inna funkcja lambdasuma = lambda a,b,c: a+b+cprint(suma(5,10,15))
K.Grzelak (UW) 48 / 62
Dokumentacja funkcji
Dokumentacja funkcji - przykładdef suma(a,b,c):
" To jest funkcja do sumowania "return a+b+c
lista=[4,5,2]
print(suma.__doc__)
K.Grzelak (UW) 49 / 62
Biblioteki naukowe - kontynuacja
K.Grzelak (UW) 50 / 62
https://www.scipy.org
K.Grzelak (UW) 51 / 62
Konwencje importowania bibliotek
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
W przypadku duzych bibliotek, np. Numpy,importowanie w sposób: from numpy import *to zła praktyka
K.Grzelak (UW) 52 / 62
Pakiet SciPy
Pakiet SciPyBiblioteka do zastosowan naukowychTutaj dopasowywanie funkcji do danych, liniowa algebra,całkowanie . . .Uzycie: import scipy.optimize
Uzycie skrótowe: import scipy.optimize as sp
Uzycie (dopasowanie funkcji do danych):from scipy.optimize import curve_fitWtedy curve_fit zamiast sp.curve_fit.
K.Grzelak (UW) 53 / 62
Dopasowywanie krzywych do danych
K.Grzelak (UW) 54 / 62
Dopasowywanie krzywej teoretycznej do danych
Wywołanie funkcji dopasowujacej krzywa teoretyczna do danychpar,cov = curve_fit(f,x,y,p0=start,sigma=s,absolute_sigma=True)
Funkcja zwraca macierz 1D z parametrami (par) i macierzkowariancji 2D (cov)f – dopasowywana funkcjax – macierz ze współrzednymi x punktówy – macierz ze współrzednymi y punktówp0 – macierz z poczatkowymi wartosciami parametróws – macierz z błedami y
Jesli nie podamy poczatkowych wartosci parametrów, to kazdy bedziemiał przypisana wartosc jeden.
K.Grzelak (UW) 55 / 62
Dopasowywanie krzywej teoretycznej do danych
Czesc 1 programu
import numpy as npimport matplotlib.pyplot as ptfrom scipy.optimize import curve_fit
# Wczytywanie danych do macierzydata = np.loadtxt(’linetest.txt’)x = data[:, 0]y = data[:, 1]s = data[:, 2]# Rysowanie punktow z bledamipt.errorbar(x, y, yerr = s, fmt=’o’)
K.Grzelak (UW) 56 / 62
Dopasowywanie krzywej teoretycznej do danych
Czesc 2 programu
# Definicja funkcji dopasowywanejdef f(x, a, b):
return a * x + b# Parametry poczatkowestart=np.array([1,0])# Glowna funkcja, wynik to macierz# z parametrami i macierz kowariancjipar, cov = curve_fit(f, x, y,p0=start,sigma=s,absolute_sigma=True)# Rysowanie dopasowywanej krzywejx2 = np.arange(-10, 10, 0.1)pt.plot(x2, f(x2,*par))pt.show()
K.Grzelak (UW) 57 / 62
Dopasowywanie krzywej teoretycznej do danych
Czesc 3 programu
# Wypisywanie dopasowanych parametrow i ich bledowprint("parametry= ", par)print("errors= ", np.sqrt(np.diag(cov)))
K.Grzelak (UW) 58 / 62
Histogramy
PrzykładPrzykładowo: w pliku pomiary.txt znajduja sie wyniki 100 pomiarówokresu wahadła matematycznego. Chcemy zrobic rozkład czestosciwystepowania wyników z okreslonego przedziału.
import numpy as npimport matplotlib.pyplot as pt
data = np.loadtxt(’pomiary.txt’)pt.hist(data)pt.xlabel(’T[s]’)pt.ylabel(’N’)pt.title(’Wyniki pomiarow okresu wahadla’)pt.show()
K.Grzelak (UW) 59 / 62
Histogramy
PrzykładRysunek bedacy wynikiem działania programu z poprzedniej strony.
3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45T[s]
0
10
20
30
40
50
60
N
Wyniki pomiarow okresu wahadla
K.Grzelak (UW) 60 / 62
Generacja liczb losowych
W bibliotece random:Generacja rzeczywistej liczby losowej z przedziału [a,b):
random.uniform(a,b)
Generacja rzeczywistej liczby losowej z przedziału [0.0,1.0)random.random()
W bibliotece numpy:Generacja n całkowitych liczb losowych z przedziału [a,b):
data=np.random.randint(a,b,n)
Generacja n rzeczywistych liczb losowych z przedziału [a,b):
data=a+(b-a)*np.random.random_sample(n)
K.Grzelak (UW) 61 / 62
interpreter python3bardziej zaawansowany interpreter ipython3notatnik Jupyter Notebook https://jupyter.org :polecenie jupyter notebook otwiera notatnik wprzegladarcerozbudowane srodowiska programistyczne: PyDev,PyCharm, Spyder . . .
K.Grzelak (UW) 62 / 62