TI/Wstep

Z Brain-wiki

Python

Stworzony dla Was kurs Pythona jest dostępny pod adresem Programowanie z Pythonem 3. Na wykładzie omówimy tylko ogólne kwestie, i powtarzać będziemy najważniejszą dla Was informację:

Programowania nie da się nauczyć — nawet z najlepszych materiałów — na dzień przed egzaminem czy kolowkwium. Programowanie to nie tylko wiedza o składni i regułach języka, ale przede wszystkim umiejętność ich stosowania w praktyce, którą można posiąść tylko pisząc programy.

Dlatego właśnie zachęcamy Was do zainstalowania Pythona na Waszych komputerach — abyście mieli możliwość ćwiczenia nie tylko w czasie zajęć.

W odróżnieniu od niektórych pakietów stosowanych w obliczniach naukowych, jak np. Matlab(R) czy Mathematica(R), intepretery języka Python dostępne są na otwartych licencjach — czyli również za darmo — dla wszystkich ważniejszych systemów operacyjnych. O tym jak to możliwe, że najwyższej jakości Wolne Oprogramowanie (ang. Free Software) dostępne jest dla wszystkich za darmo i z kodem źródłowym, i dlaczego podkreślamy wolne jak w słowie 'wolność' ("free as in "freedom", not "free as in free beer") dowiecie się z rozdziału Otwarte Źródła, GNU i wolność oprogramowania. Na razie wystarczy wiedza, że Pythona dla Windows, macOS czy GNU/Linuksa możemy ściągnąć z Internetu legalnie i za darmo. Warto tylko pamiętać, że używać będziemy wersji 3.xx Pythona. Nieważne, co stoi po "3" — może być 3.2, 3.4 czyli 3.x. Ważne, że w poprzednich wersjach różniących się głównym numerem, czyli 2.xx (ostatnią stabilną wersją była 2.7) różni się trochę składnia języka, więc nie wszystkie polecenia których uczycie się na ćwiczeniach będą działać tak samo.

Te informacje powinny Wam wystarczyć do zainstalowania Pythona na swoim komputerze domowym, w Waszym ulubionym systemie operacyjnym. Na ćwiczeniach będziemy używać Pythona w systemie GNU/Linux. Linux to również Wolne Oprogramowanie, które możecie ściągnąć i legalnie za darmo zainstalować na swoim komputerze.

Wartości logiczne

Jak wiadomo, logika rządzi się swoimi prawami. Pozwalają one na ścisłe wyliczanie wartości logicznej zdań — czyli po prostu określenie, czy zdanie złożone z prostszych zdań jest prawdziwe czy też fałszywe. Ponieważ występują tylko dwie wartości i można dla nich pisać równania, to zasady logiki nazywamy algebrą dwuwartościową, lub częściej [algebrą Boole'a], od nazwiska osoby która pierwsza sformalizowała ten rachunek.

Dwie wartości, prawdę i fałsz, oznaczamy często jako 1 i 0. W Pythonie jako wartość oznaczającą prawdę można użyć liczby 1 albo specjalnego obiektu True, natomiast fałsz — liczby 0 lub obiektu False. Te specjalne obiekty nazywane są po angielsku booleans, co należy rozumieć jako wartości Boole'a. Nie są niezbędne i zostały wprowadzone po to, by podkreślić kiedy używamy algebry dwuwartościowej, a kiedy zwykłej.

Operacje logiczne

Różne oznaczenia
Suma Iloczyn Negacja
[math]\cup[/math] [math]\cap[/math] [math]\sim[/math]
[math]+[/math] [math]\cdot[/math] [math]\overline{a}[/math]
[math]+[/math] [math]\cdot[/math] [math]-[/math]
[math]\lor[/math] [math]\land[/math] [math]\lnot[/math]
[math]|[/math] [math]\&[/math] [math]![/math]
[math]OR[/math] [math]AND[/math] [math]NOT[/math]

Koniunkcja

Jeśli mamy dwa zdania a oraz b, ich koniunkcją nazywamy wyrażenie, które jest prawdziwe gdy obywa zdania są prawdziwe. W matematyce oznacza się to przez [math]a \wedge b[/math]. W Pythonie operatorem koniunkcji jest and.

Możemy wypisać działanie operatora na każdą możliwą parę wartości logicznych:

wartości zdań wartość ich koniunkcji
a b a and b
True True True
True False False
False True False
False False False

Koniunkcję nazywa się często iloczynem logicznym, bo jeśli oznaczymy prawdę i fałsz przez 1 i 0, to zwykłe mnożenie tych dwóch liczb daje taki sam wynik jak koniunkcja.

Alternatywa

Jeśli mamy dwa zdania a oraz b, ich alternatywą nazywamy wyrażenie, które jest prawdziwe gdy przynajmniej jedno z tych zdań jest prawdziwe. W matematyce oznacza się to przez [math]a \vee b[/math]. W Pythonie operatorem alternatywy jest or.

Ponownie, najłatwiej przedstawić działanie operatora w tabelce ze wszystkimi możliwymi parami wartości logicznych:

wartości zdań wartość ich alternatywy
a b a or b
True True True
True False True
False True True
False False False

Alternatywę nazywa się często sumą logiczną, bo jeśli ponownie oznaczymy prawdę i fałsz przez 1 i 0, to zwykłe dodawanie tych dwóch liczb daje taki sam wynik jak koniunkcja, za wyjątkiem 1 + 1. W wypadku sumy logicznej dwóch zdań prawdziwych wynik i tak jest 1, bo w algebrze Boole'a po prostu nie ma większej liczby.

Zaprzeczenie

Jeśli mamy zdanie a, jego zaprzeczeniem nazywamy wyrażenie, które jest prawdziwe tylko gdy to zdanie jest fałszywe.

Tutaj tabelka możliwości jest krótsza, bo mamy tylko jedno zdanie:

wartość zdania wartość jego zaprzeczenia
a not a
True False
False True

Wartość logiczna wyrażeń w Pythonie

Kiedy używamy operatorów przyrównania (==, !=, <=, >=, <, >), w wyniku otrzymujemy jedną z dwóch wartości logicznych True / False. Większość innych wyrażeń nie jest prawdziwa lub fałszywa w sensie matematycznym. Na przykład napis "Hello, World" nie ma wartości logicznej w sensie matematycznym. Niemniej w Pythonie, jak też w wielu innych językach programowania, wszystkie obiekty mają wartość logiczną określaną zgodnie z pewnymi ustalonymi regułami. Pozwala to wykorzystać dowolne wyrażenie jako warunek w poleceniu sterujących wykonaniem programu, jak if czy while, bo każde wyrażenie zwraca jakiś obiekt.

W przypadku obiektów które nie są po prostu True ani False, to czy dany obiekt zostanie zinterpretowany jako prawdziwy, czy też jako fałszywy, rządzi się paroma prostymi regułami:

  1. w przypadku liczb, liczba 0 jest fałszywa, wszystkie pozostałe są prawdziwe
  2. w przypadku sekwencji (np. napisów) i innych kolekcji, tylko te puste, o długości 0, są fałszywe
  3. pozostałe obiekty są prawdziwe (o ile ich twórca nie podjął specjalnych działań by mogły mieć różne wartości logiczne)


Obliczanie wartości wyrażeń logicznych w Pythonie

Jeśli napiszemy wyrażenie zawierające operatory and lub or, często możemy określić wartość logiczną całego wyrażenia bez znajomości wartości logicznej drugiego operandu. Pozwala to na pominięcie części obliczeń, tzw. wykonanie warunkowe (ang. short-circuiting). Mówiąc bardziej konkretnie,

  • w przypadku operatora and, jeśli pierwszy wyraz jest fałszywy, to drugi nie jest obliczany bo wiadomo, że całe wyrażenie jest fałszywe,
  • w przypadku operatora or, jeśli pierwszy wyraz jest prawdziwy, to drugi nie jest obliczany, bo wiadomo, że całe wyrażenie jest prawdziwe.

W przedstawionych powyżej tabelkach przedstawiającej działanie operatorów and lub or na wartości logiczne True i False argumentami były wszystkie możliwe kombinacje tych dwóch wartości. Później zostały przedstawione reguły pozwalająca na nadanie wartości logicznej każdemu wyrażeniu. W przypadku gdy jako argumentu w koniunkcji lub alternatywie użyje się obiektu, który nie jest wartością logiczną True albo False, to wynik wyrażenia logicznego też może nie być wartością logiczną.

Tabelki działania operatorów pozostają w mocy, ale aby uwzględnić działanie na nie-booleans i wykonanie warunkowe, do wykonywania operatorów logicznych używa się następujących reguł:

x and y — jeżeli x jest fałszem, zwraca x, w przeciwnym wypadku zwraca y
x or y — jeżeli x jest prawdą, zwraca x, w przeciwnym wypadku zwraca y

Wyniki działania tych reguł dla wartości True i False dają to co powinny. Natomiast w innych przypadkach pozwalają na budowanie pseudo-zdań logicznych. Np. jeśli prosimy użytkownika o wpisanie pewnego napisu, ale w przypadku gdy wpisał napis pusty chcemy użyć wartości domyślnej, możemy wykorzystać alternatywę:

print (napis or "(podałeś pusty napis)")
# napis o długości 0 jest fałszywy,
#     w takim wypadku zostanie użyty drugi operand

Przedstawione powyżej reguły obliczania koniunkcji i alternatywy są równoważne następującemu przepisowi:

  1. Zaczynamy od obliczenia wartości lewego operandu.
  2. Jeśli wartość logiczna lewego operandu nie pozwala na rozstrzygnięcie wartości logicznej całego wyrażenia, obliczamy wartość prawego operandu.
  3. Jako wynik zwracamy ostatni obliczony operand, czyli ten który rozstrzyga o wartości logicznej całego wyrażenia.


Terminal

...to okienko, w którym wpisujemy komendy intepretowane przez system operacyjny, a konkretnie powłokę systemową (shell). Te okienka to formalnie emulatory terminali, bo historycznie terminal to było urządzenie (najczęściej monitor i klawiatura), za pomocą którego można się było komunikować z komputerem wyłącznie w trybie tekstowym. Pomimo tego, że współczesne komputery oferują w pełni graficzny interfejs, wiersz poleceń to wciąż w wielu przypadkach najefektywniejszy i najnaturalniejszy sposób komunikacji z systemem operacyjnym i uruchamiania programów.

Emulator terminala (urxvt) do którego użytkownik wpisał komendy uname (podaje wersję systemu), uptime (podaje czas jaki upłynął od startu komputera) i fortune (emuluje ciasteczko w chińskiej knajpie). Po wykonaniu każdej komendy jest wyświetlany czerwono-niebieski znak gotowości (ang. prompt).

W przypadku systemów Uniksowych — do których należy GNU/Linux — podstawowe polecenia pozostają niezmienione od zarania dziejów (tzn. od zarania dziejów Uniksa), czyli od roku 1969. I wszystko wskazuje na to, że pozostaną z nami jeszcze przez wiele lat, więc wiedza na ich temat nie zdeaktualizuje się za szybko. Jest to ciekawe samo w sobie w świecie, w którym interfejs programów (nie tylko systemów operacyjnych) zmienia się czasami znacząco nawet z wersji na wersję.

Co to za zaklęcia?

Listę ważniejszych poleceń Uniksa znajdziesz np. w Wikipedii. Ogólnie:

  • Na początku zawsze musimy wpisać nazwę programu albo polecenia systemowego. Po wciśnięciu Enter program — jeśli takowy jest w systemie zainstalowany, a dostęp do katalogu w którym się znajduje jest uwzględniony w tzw. ścieżce (PATH) — powinien się uruchomić.
  • Po spacji — przed wciśnięciem Enter — możemy też wpisać:
    • argment(y), czyli np. nazwę pliku którą ma od razu otworzyć wywołany program, oraz
    • opcje, czyli przełączniki dla programu (np. wpisanie ls -l wywołuje polecenie systemowe ls, wypisujące zawartość bieżącego katalogu, z opcją -l, dającą dokładniejszy (czyli długi, ang long) listing.
  • W większości powłok Uniksowych możemy w trakcie wpisywania polecenia wcisnąć klawisz tabulatora Tab, wtedy system inteligentnie dopełni wpisany tekst do pełnej nazwy zainstalowanego programu lub polecenia systemowego, lub, jeśli dopełnienie nie jest jednoznaczne, wyświetli listę opcji.

Jak to się ma do klikania?

  • Jeśli klikamy ikonę symbolizującą program, system po prostu ten program uruchomi. Nie mamy możliwości od razu podać np. w jakim trybie program chcemy uruchomić, czy jaki plik powinien być od razu wczytany.
  • Jeśli klikamy ikonę pliku, system stara się odnaleźć program "właściwy" dla otwarcia danego pliku. Normalne kliknięcie otwiera plik w programie, który znajduje się na pierwszym miejscu systemowej listy programów "potrafiących" wyświetlić dany plik. Kliknięcie prawym guzikiem otwiera zwykle menu kontekstowe, z którego możemy wybrać do otwarcia pliku jeden z programów zarejestrowanych w systemie.

Nie tylko GNU/Linux

  • W MS Windows konsolę można uruchomić poleceniem "Wykonaj program", wpisując jako program cmd — zapewne skrót od command line. Polecenia powłoki Windows różnią się od poleceń Uniksa, wywodzą się z systemu MS DOS.
  • MacOS od wersji X jest, wbrew pozorom, pełnokrwistym systemem Uniksowym, i "Terminal" jest jego częścią.

Środowiska zintegrowane (IDE)

Jest wiele różnych środowisk programistycznych (ang. Integrated Developpment Environmet, IDE) wspomagających programowanie w Pythonie; niektóre z nich mogą być nawet komercyjnymi nakładkami na wolnego Pythona, czyli ich użycie może wymagać uiszczenia opłaty licencyjnej. Niektóre ze środowisk używanych przez profesjonalistów (jak na przykład Eclipse) mogą też być nadmiernie skomplikowane w użyciu na początek, dlatego polecamy rozwiązania prostsze, jak na przykład Idle, Spyder czy PyCharm(wyszukiwać go najlepiej razem z hasłem "python").