poezja wikipedia
Transkrypt
poezja wikipedia
Wstęp do programowania Wykład 1 Wprowadzenie Janusz Szwabiński Plan wykładu: Sprawy administracyjne Nauka programowania wyzwania i cele Czym jest program komputerowy? Błędy i ich usuwanie Języki naturalne i formalne Języki skryptowe (interpretowane) Dlaczego Python? Przykłady prostych krótkich programów w Pythonie Sprawy administracyjne Dane kontaktowe http://prac.im.pwr.edu.pl/~szwabin/ (http://prac.im.pwr.edu.pl/~szwabin/) email: [email protected] pokój 5.16, budynek C11 konsultacje: czwartek 11:15 12:45, piątek 9:15 10:45 Treści programowe Środowiska do programowania w Pythonie. Podstawowe typy danych, literały, operatory i wyrażenia. Dygresja reprezentacja danych liczbowych. Wyrażenia warunkowe i pętle. Funkcje, skrypty i moduły. Listy, krotki, zbiory i słowniki. Operacje na plikach. Programowanie obiektowe: klasy i obiekty, dziedziczenie Interfejsy użytkownika w Tkinter. Materiały do wykładów prezentacje i listy zadań pod adresem http://prac.im.pwr.wroc.pl/~szwabin/ (http://prac.im.pwr.wroc.pl/~szwabin/) strona główna Pythona (http://www.python.org) A. B. Downey, J. Elkner, C. Meyers, Think Python. How to Think Like a Computer Scientist, (http://www.greenteapress.com/thinkpython/ (http://www.greenteapress.com/thinkpython/)) M. Pilgrim, Dive into Python, (http://www.diveintopython.net/ (http://www.diveintopython.net/)) D. Mertz, Text Processing in Python, (http://gnosis.cx/TPiP/ (http://gnosis.cx/TPiP/)) M. Summerfield, Rapid Gui Programming with Python and QT D. Harrell, Rzecz o istocie informatyki. Algorytmika, WNT, Warszawa 2000 N. Wirth, Algorytmy + struktury danych = programy, WNT, Warszawa 2000 Zaliczenie listy zadań na ćwiczeniach i laboratoriach dwa testy: na 7 i ostatnim wykładzie lab ocena = ćw + 2 wyk + 4 4 Nauka programowania Cele programowanie w konkretnym języku (tutaj w Pythonie) rozwiązywanie problemów: formułowanie problemów kreatywne poszukiwanie rozwiązań programowanie jako środek do osiąnięcia celu przedstawienia rozwiązania Wyzwania Informatykprogramista łączy w sobie cechy: matematyka używa języka formalnego do opisu pomysłów (obliczeń) inżyniera wymyśla i tworzy "rzeczy", łączy istniejące komponenty w bardziej skomplikowane układy o nowych funkcjonalnościach, szuka alternatyw naukowca obserwuje zachowanie układów złożonych, formułuje hipotezy i testuje prognozy Algorytm skończony ciąg jasno zdefiniowanych czynności, koniecznych do wykonania pewnego rodzaju zadań jego zadaniem jest przeprowadzenie systemu z pewnego stanu początkowego do pożądanego stanu końcowego Przykład metoda babilońska wyliczania pierwiastka (metoda Herona) Szukamy aproksymacji √S : 1. Rozpocznij z dowolną dodatnią wartością początkową x 0 (im bliżej szukanego pierwiastka, tym lepiej). 2. Znajdź kolejne przybliżenie według wzoru 1 x n+1 = 2 S (x n + ) xn 3. Powtarzaj krok 2 do osiągnięcia pożądanej dokładności. In [1]: S = 25 import math math.sqrt(25) Out[1]: 5.0 In [2]: x0 = 1 In [3]: x1 = (x0+S/x0)/2 # Uwaga!!! Poniższy przykład działa poprawnie z Pythonem 3.X In [4]: print(x1) 13.0 In [5]: x2 = (x1+S/x1)/2 print(x2) 7.461538461538462 In [6]: x3 = (x2+S/x2)/2 print(x3) 5.406026962727994 In [7]: x4 = (x3+S/x3)/2 print(x4) 5.015247601944898 Program komputerowy Program komputerowy to ciąg instrukcji opisujących sposób wykonania pewnych obliczeń (niekoniecznie matematycznych). Szczegóły programu wyglądają różnie w różnych językach programowania, jednak niezależnie od języka można wyróżnić kilka podstawowych elementów programu: wejście pobranie danych z klawiatury, pliku, bazy danych lub innego źródła wyjście prezentacja danych na ekranie, ich zapis do pliku lub innego urządzenia obliczenia podstawowe operacje matematyczne warunkowe przetwarzanie wykonywanie części programu tylko przy spełnieniu pewnych warunków powtarzanie powtarzanie pewnych części programu Praktycznie każdy program zbudowany jest z tych podstawowych "klocków". Dlatego programowanie można rozumieć jako proces rozkładania dużego, skomplikowanego zadania na coraz prostsze podzadania do momentu, aż te podzadania można wykonać w ramach jednego z powyższych elementów. Błędy w programach komputerowych (ang. bugs) Błędy składniowe (ang. syntax error) – błąd w składni ciągu znaków lub słów, które powinny po sobie następować zgodnie z zasadami języka programowania. Wykrywany przez kompilator lub interpreter języka, łatwy do poprawienia. Bardzo częsty u początkujących programistów. Błędy działania programu (ang. runtime error) błędy, które pojawiają się w trakcie wykonywania programu (np. próba odczytu danych z pliku, do którego nie ma dostępu lub dzielenie przez zero). Błędy znaczeniowe (ang. semantic error) – w przypadku tych błędów program zadziała, jednak z reguły nie jest to już program, który planowaliśmy napisać. Wykrycie błędów semantycznych stanowi często duże wyzwanie. Przykłady błędów In [8]: prit("Witaj świecie") -------------------------------------------------------------------------NameError Traceback (most recent ca ll last) <ipython-input-8-e201ead868f9> in <module>() ----> 1 prit("Witaj świecie") NameError: name 'prit' is not defined In [9]: print("Witaj świecie") Witaj świecie In [10]: infile = open('foo.txt') for line in infile: print(line) -------------------------------------------------------------------------FileNotFoundError Traceback (most recent ca ll last) <ipython-input-10-4e36f54a367f> in <module>() ----> 1 infile = open('foo.txt') 2 for line in infile: 3 print(line) FileNotFoundError: [Errno 2] No such file or directory: 'foo.txt' In [11]: def suma(a,b): print(a-b) #zwróć uwagę na błąd w działaniu!!! suma(10,6) 4 Etymologia słowa bug It has been just so in all of my inventions. The first step is an intuition, and comes with a burst, then difficulties arise — this thing gives out and [it is] then that "Bugs" — as such little faults and difficulties are called — show themselves and months of intense watching, study and labor are requisite before commercial success or failure is certainly reached. (Thomas Edison, 1878) In 1946, when Hopper was released from active duty, she joined the Harvard Faculty at the Computation Laboratory where she continued her work on the Mark II and Mark III. Operators traced an error in the Mark II to a moth trapped in a relay, coining the term bug. This bug was carefully removed and taped to the log book. Stemming from the first bug, today we call errors or glitches in a program a bug.(Sharon Ann Danis, Rear Admiral Grace Murray Hopper, 1997) Usuwanie błędów (ang. debugging) “Wyeliminuj wszystkie inne możliwości, a to, co ci zostanie, będzie prawdą.” (A. Conan Doyle, Znak Czterech) jedna z najważniejszych umiejętności związanych z programowaniem wyzwanie intelektualne potrafi być frustrujące przypomina naukę eksperymentalną dla niektórych programowanie to proces nieustannego debuggowania programu do momentu, aż program osiągnię żądaną funkcjonalność "Zawsze jest jeszcze jeden błąd" (prawo nieskończoności Lubarskiego) Języki naturalne i języki formalne Języki programowania są językami formalnymi stworzonymi do opisu obliczeń! język naturalny język stosowany przez ludzi do komunikacji interpersonalnej, powstały w drodze historycznego rozwoju określonych grup etnicznych wieloznaczny redundantny alegoryczny język formalny podzbiór zbioru wszystkich słów nad skończonym alfabetem, język wymyślony przez człowieka jednoznaczny zwięzły dosłowny Od poezji do programu komputerowego poezja wieloznaczna, używa słów nie tylko ze względu na ich znaczenie, lecz również brzmienie, utwór często ma wywołać reakcję emocjonalną proza ważniejsze od brzmienia jest znaczenie słów i struktura tekstu; łatwiejsza w analizie, jednak ciągle może być wieloznaczna program jednoznaczny i dosłowny, do jego zrozumienia wystarczy analiza tokenów i struktury Języki programowania Klasyfikacja języków programowania Języki programowania mogą być podzielone ze względu na: paradygmat programowania (np. programowanie proceduralne, strukturalne, funkcyjne, imperatywne, obiektowe) generację języka programowania sposób kontroli typów sposób wykonywania (kompilacja, interpretacja) poziom (języki niskiego poziomu są bardziej zbliżone pod względem budowy do działania sprzętu) przeznaczenie 20 najpopularniejszych języków według TIOBE (http://www.tiobe.com/tiobeindex/ (http://www.tiobe.com/tiobeindex/)) "Witaj świecie" w wybranych językach programowania C #include<stdio.h> int main() { printf("\nHello world in C!"); return 0; } C++ #include <iostream> int main () { std::cout << "Hello world in C++!" << std::endl; } C# namespace HelloWorld { class Program { static void Main(string[] args) { System.Console.WriteLine("Hello world in C#!"); } } } Fortran program hello print *, "Hello world in Fortran!" end program Java public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world in Java!"); } } Julia println("Hello world in Julia!") Pascal program byeworld; begin writeln('Hello world in Pascal!'); end. Perl use feature 'say'; say 'Hello world in Perl!'; PHP <?php echo "Hello world in PHP!\n"; ?> Python (wersja 2.7.X) print "Hello world in Python!" Python (wersja 3.X) print("Hello world in Python!") Ruby puts 'Hello world in Ruby' Interpretowane kontra kompilowane Języki interpretowane główne cechy zaprojektowane z myślą o interakcji z użytkownikiem (tryb interaktywny) przenośne osadzane w aplikacjach (np. Python w Blenderze) często używane do jednorazowych zadań (np. administracyjnych) niektóre nadają się do tworzenia samodzielnych aplikacji zwięzłe Python darmowy i przenośny interpretowany duża zwięzłość dynamiczna semantyka i elegancka składnia automatyczne zarządzanie pamięcią (ang. garbage collection) bogata biblioteka standardowa struktury wysokiego poziomu (m.in. listy, słowniki, liczby zespolone) wieloparadygmatowy (programowanie obiektowe, strukturalne, funkcyjne) łatwo integruje się z C/C++ i Fortranem oddana społeczność programistów bogata dokumentacja wbudowana i do znalezienia w Internecie dużo narzędzi do obliczeń naukowych idealny do tworzenia skryptów i tzw. błyskawiczego rozwijania aplikacji pełnoprawny język programowania o znacznych możliwościach Kilka (drobnych) wad mała wydajność duża modularność problemy z wcięciami kodu przy przenoszeniu źródeł między platformami wiele wersji brak kompatybilności między wersjami 2.x i 3.x Dlaczego mała wydajność nie jest (z reguły) wielkim problemem? przeciętny program większość czasu spędza na oczekiwaniu na operacje wejścia/wyjścia, opóźnienia związane z siecią i wypełnienie pamięci podręcznej programiści stosujący języki skryptowe okazują się prawie dwukrotnie wydajniejsi od tych używających tradycyjnych języków programowania (krótszy kod i mniej popełnionych błędów) sprzęt komputerowy jest tani, dlatego często lepszym wyborem z ekonomicznego punktu widzenia jest skrócenie czasu debuggowania i długoterminowa łatwość obsługi kodu Implementacje języka Python CPython (https://www.python.org/) standardowa implementacja w języku C; projekt Open Source zarządzany przez Python Software Foundation (https://www.python.org/psf/) Jython (http://www.jython.org/) implementacja napisana w Javie IronPython (http://ironpython.net/) Python dla platformy .Net CLPython (https://commonlisp.net/project/clpython/) implementacja w Common Lispie PyPy (http://pypy.org/) wersja Pythona napisana w... Pythonie, a w zasadzie w statycznym podzbiorze Pythona o nazwie Restricted Python, który następnie można skompilować do kodu bajtowego Javy, C lub CLR. Wersje języka Python 2.7.X w pewnym sensie przeszłość Pythona 3.X teraźniejszość i przyszłość języka https://wiki.python.org/moin/Python2orPython3 (https://wiki.python.org/moin/Python2orPython3) Instalacja Pythona pod Windowsem instalator ze strony https://www.python.org/downloads/ (https://www.python.org/downloads/) inne platformy (Unix, Linux, Mac OS) Python jest już najprawdopodobniej zainstalowany pakiety binarne systemowy manager oprogramowania kompilacja ze źródeł strona https://www.python.org/downloads/ (https://www.python.org/downloads/) Historia Pythona stworzył we wczesnych latach 90. holenderski programista Guido van Rossum: Ponad 6 lat temu, w grudniu 1989, szukałem hobbystycznego projektu programistycznego, który zająłby mnie w tygodniu przed świętami. Moje biuro miało być zamknięte, ale miałem domowy komputer. Zdecydowałem się napisać interpreter dla nowego języka skryptowego, nad którym wtedy myślałem: pochodną ABC, która przemawiałaby do hakerów Uniksa i C. Jako roboczy tytuł wybrałem Python, będąc wielkim fanem Latającego Cyrku Monty Pythona. (Wprowadzenie do Programming Python, Mark Lutz, wyd. O'Reilly). obecnie nad projektem pracuje cała grupa osób z racji kluczowej roli, jaką odgrywa van Rossum przy podejmowaniu ważnych decyzji projektowych, często określa się go przydomkiem Benevolent Dictator for Life (BDFL). In [12]: # Historia from IPython.display import YouTubeVideo YouTubeVideo("OgV4iBQVNyU") Out[12]: Monty Python - skecz o ministerstwi... Kto używa Pythona? Google (Youtube, aplikacje webowe) Yahoo (aplikacje webowe). Microsoft (IronPython: Python dla .NET) Disney (animacje 3D) Dropbox Instagram BitTorrent (poprzednie wersje) Spotify Reddit BitBucket Blender3D In [13]: ### Kto używa Pythona? from IPython.display import YouTubeVideo YouTubeVideo("Z8l8WNHwTOg") Out[13]: The best blender demo reel lm 2013 Filozofia Pythona In [14]: 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 i t. 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! Przykłady programów w Pythonie In [15]: %matplotlib inline import matplotlib.pyplot as plt import numpy as np t = np.arange(0.0,5.2,0.2) plt.plot(t,t,'ro',t,t**2,'bs',t,t**3,'g^') Out[15]: [<matplotlib.lines.Line2D at 0x7f22bf2e64a8>, <matplotlib.lines.Line2D at 0x7f22bf2e67f0>, <matplotlib.lines.Line2D at 0x7f22bf2f2048>] Wykresy 3D In [16]: import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d.axes3d import Axes3D alpha = 0.7 phi_ext = 2 * np.pi * 0.5 def flux_qubit_potential(phi_m, phi_p): return 2 + alpha - 2 * np.cos(phi_p)*np.cos(phi_m) - alpha * np.cos(phi_ext - 2*phi_p) #generujemy siatkę (meshgrid) i wyliczamy na niej wartości funkcji phi_m = np.linspace(0, 2*np.pi, 100) phi_p = np.linspace(0, 2*np.pi, 100) X,Y = np.meshgrid(phi_p, phi_m) Z = flux_qubit_potential(X, Y).T #wykres powierzchniowy z rzutami fig = plt.figure(figsize=(8,6)) ax = fig.add_subplot(1,1,1, projection='3d') ax.plot_surface(X, Y, Z, rstride=4, cstride=4, alpha=0.25) cset = ax.contour(X, Y, Z, zdir='z', offset=-np.pi, cmap=plt.cm.coolwarm) cset = ax.contour(X, Y, Z, zdir='x', offset=-np.pi, cmap=plt.cm.coolwarm) cset = ax.contour(X, Y, Z, zdir='y', offset=3*np.pi, cmap=plt.cm.coolwarm) ax.set_xlim3d(-np.pi, 2*np.pi); ax.set_ylim3d(0, 3*np.pi); ax.set_zlim3d(-np.pi, 2*np.pi); Gra w życie według Conwaya In [17]: import numpy as np from scipy.signal import convolve # do zliczania sąsiadów każdej komórki FILTER = np.array([[1, 1, 1], [1, 100, 1], [1, 1, 1]], dtype=np.uint8) def evolve(length, generations): """ Uruchom grę w życie. Stan początkowy jest losowy. Parametry ------|---length : int rozmiar liniowy planszy generations : int liczba generacji, dla których rozgrywa się gra """ current = np.random.randint(2, size=(length, length)) next = np.empty_like(current) current[length/2, 1:(length-1)] = 1 show_board(current) for _ in range(generations): advance(current, next) current, next = next, current show_board(current) def advance(current, next): """ Wyznacz kolejną iterację gry. Parametry ---------current : 2D array Aktualny stan planszy next : 2D array Stan planszy w kolejnym kroku. """ assert current.shape[0] == current.shape[1], \ 'Plansza powinna być kwadratowa' next[:] = 0 count = convolve(current, FILTER, mode='same') next[(count == 3) | (count == 102) | (count == 103)] = 1 In [18]: from IPython.display import clear_output, display_html import time def show_board(board): """ Rysuje planszę w tabeli HTML. Usuwa wszystko, co na wyjściu, przy pomocy `IPython.display.clear_output` w celu zrobienia animacji. Parametry ---------board : 2D array Plansza. """ clear_output(True) nx, ny = board.shape table = '<table style="border-color: black; border-width: 5px;">\n' for y in range(ny-1, -1, -1): table += '<tr>' for x in range(0, nx): if board[x, y]: table += '<td style="background: black; border-color: white;"></ td>' else: table += '<td style="border-color: white;"></td>' table += '</tr>\n' table += '</table>' display_html(table, raw=True) time.sleep(0.1) In [19]: evolve(40,100) Wahadło pojedyncze In [20]: from IPython.display import Image Image(filename='Pendulum.jpg', width=250) Out[20]: Równanie ruchu wahadła (przy odpowiednio dobranych l i g) ma postać: ¨ θ + sin θ = 0 Przekształcamy najpierw to równanie do układu równań różniczkowych pierwszego rzędu: dθ = v dt dv = −sinθ dt Chcemy rozwiązać to równanie dla warunku początkowego θ = 0, 3 i v = 0 : In [21]: import matplotlib.pyplot as plt import scipy as sp from scipy.integrate import odeint #wartości początkowe th0 = 0.3 v0 = 0.0 init = [th0,v0] #prawa strona układu równań: f(theta,v) def rhs(y,t): return [y[1],-sp.sin(y[0])] #czas ruchu t = sp.linspace(0, 10, 250) #rozwiązanie równania y = odeint(rhs,init,t) plt.plot(t,y[:,0],label="theta") plt.plot(t,y[:,1],label='v') plt.legend(loc="upper right") plt.xlabel("time [s]") Out[21]: <matplotlib.text.Text at 0x7f22b04e2ef0> Wahadło podwójne In [22]: Image(url='http://upload.wikimedia.org/wikipedia/commons/c/c9/Double-compound-pe ndulum-dimensioned.svg') Out[22]: (0, 0) ℓ θ1 (x1,y1) mg θ2 ℓ (x2,y2) mg Równania ruchu wahadła mają następującą postać (http://en.wikipedia.org/wiki/Double_pendulum (http://en.wikipedia.org/wiki/Double_pendulum)): ˙ θ1 = ˙ θ2 = 2p θ −3 cos(θ1 −θ2 )p θ 6 1 2 8p θ −3 cos(θ1 −θ2 )p θ 6 2 2 = − ṗ θ = − 2 1 2 16−9 cos (θ1 −θ2 ) mℓ ṗ θ 1 2 2 16−9 cos (θ1 −θ2 ) mℓ 1 2 1 2 mℓ mℓ 2 2 . ẋ 2 = 2 mℓ g ℓ sin θ 2 ] = [θ 1 , θ 2 , pθ , pθ ] . Wówczas: 1 2 16−9 cos (x1 −x2 ) 8x4 −3 cos(x1 −x2 )x3 6 2 mℓ ẋ 4 = − sin θ 1 ] 2x3 −3 cos(x1 −x2 )x4 6 ẋ 3 = − ℓ ˙ ˙ [−θ 1 θ 2 sin(θ 1 − θ 2 ) + Wprowadźmy zmienną wektorową x ẋ 1 = g ˙ ˙ [θ 1 θ 2 sin(θ 1 − θ 2 ) + 3 1 2 1 2 2 16−9 cos (x1 −x2 ) mℓ mℓ 2 2 [ẋ 1 ẋ 2 sin(x 1 − x 2 ) + 3 [−ẋ 1 ẋ 2 sin(x 1 − x 2 ) + g ℓ sin x 1 ] g ℓ sin x 2 ] 2 In [23]: g = 9.82 L = 0.5 m = 0.1 def dx(x, t): """ prawa strona układu RRZ dla wahadła podwójnego """ x1, x2, x3, x4 = x[0], x[1], x[2], x[3] dx1 = 6.0/(m*L**2) * (2 * x3 - 3 * sp.cos(x1-x2) * x4)/(16 - 9 * sp.cos(x1-x 2)**2) dx2 = 6.0/(m*L**2) * (8 * x4 - 3 * sp.cos(x1-x2) * x3)/(16 - 9 * sp.cos(x1-x 2)**2) dx3 = -0.5 * m * L**2 * ( dx1 * dx2 * sp.sin(x1-x2) + 3 * (g/L) * sp.sin(x1)) dx4 = -0.5 * m * L**2 * (-dx1 * dx2 * sp.sin(x1-x2) + (g/L) * sp.sin(x2)) return [dx1, dx2, dx3, dx4] # stan początkowy x0 = [sp.pi/4, sp.pi/2, 0, 0] # przedział czasu, dla którego rozwiązujemy równanie (od 0 do 10 s) t = sp.linspace(0, 10, 250) # rozwiązanie układu x = odeint(dx, x0, t) # kąty w funkcji czasu plt.plot(t, x[:, 0], 'r', label="theta1") plt.plot(t, x[:, 1], 'b', label="theta2") plt.legend(loc="upper right") plt.xlabel("time [s]") Out[23]: <matplotlib.text.Text at 0x7f22b0043e80> In [24]: # wykres w przestrzeni położeń x1 = + L * sp.sin(x[:, 0]) y1 = - L * sp.cos(x[:, 0]) x2 = x1 + L * sp.sin(x[:, 1]) y2 = y1 - L * sp.cos(x[:, 1]) plt.plot(x1, y1, 'r', label="pendulum1") plt.plot(x2, y2, 'b', label="pendulum2") plt.legend(loc="upper right") Out[24]: <matplotlib.legend.Legend at 0x7f22abc4c748> A teraz prosta animacja ruchu wahadła: In [25]: from IPython.display import clear_output, display import time fig, ax = plt.subplots(figsize=(4,4)) for t_idx, tt in enumerate(t[:200]): x1 = + L * sp.sin(x[t_idx, 0]) y1 = - L * sp.cos(x[t_idx, 0]) x2 = x1 + L * sp.sin(x[t_idx, 1]) y2 = y1 - L * sp.cos(x[t_idx, 1]) ax.cla() ax.plot([0, x1], [0, y1], 'r.-') ax.plot([x1, x2], [y1, y2], 'b.-') ax.set_ylim([-1.5, 0.5]) ax.set_xlim([1, -1]) display(fig) clear_output(True) time.sleep(0.1) In [ ]: