PPy3/PierwszeKroki
Spis treści
Pierwsze kroki
Podstawowe cegiełki
- Program w Pythonie to tekst, stanowiący ciąg instrukcji; są one wykonywane przez interpreter (zasadniczo) kolejno jedna po drugiej.
- Prosta instrukcja to (zasadniczo) jedna linijka, kończy się wraz z przejściem do kolejnej linii.
- Instrukcja złożona, to linijka otwierająca zawsze zakończona dwukropkiem, a po niej - blok wcięty, tj. ciąg instrukcji (prostych i/lub złożonych) pisanych z dodatkowym wcięciem w stosunku do linijki otwierającej; mogą to być dodatkowe (np. dwie lub cztery) spacje, lub kod tabulacji, na początku każdej linijki. Koniec instrukcji złożonej następuje wraz z powrotem do poprzedniego poziomu wcięcia.
- W tekście programu można umieszczać komentarze; komentarz zaczyna się od znaku #, a kończy się wraz z końcem bieżącej linii. Komentarze nie są częścią programu, tzn. są ignorowane przy jego wykonaniu.
- Wyjątki od podanych reguł, istnienie których sygnalizuje słowo zasadniczo, będą przedstawione później.
- Należy się raz zdecydować, jak dokładnie będziemy tworzyć poziomy wcięcia, i konsekwentnie się tego trzymać. Najlepiej po dwie lub cztery spacje (wg. upodobań), i ustawić w opcjach edytora kodu, żeby wciśnięcie klawisza Tab skutkowało odpowiednią liczbą spacji. Mieszanie w tekście kodu spacji i tabulacji zawsze prowadzi do kłopotów.
Przykłady instrukcji prostych:
x = 1 + 2
y = 2 * x
x = x + 1
print(x, y)
Przykłady instrukcji złożonych:
if x > 0:
print(x)
def dodaj1(x):
return x + 1
Ważnym elementem są komentarze:
# a teraz, powiększę x o 1
x = x + 1
- Instrukcje budowane są z wyrażeń, a wyrażenia - z nazw, stałych i operatorów.
- Nazwa może składać się z liter, cyfr i znaku podkreślenia (_). Nie może zaczynać się od cyfry. Litery małe i wielkie są rozróżniane.
- Przykładem stałych są liczby - całkowite i ułamki dziesiętne. Zamiast przecinkiem, część ułamkową oddziela się kropką.
- Inny rodzaj stałych to napisy. Można je budować na kilka sposobów:
'to jest napis'
"to jest drugi napis"
'''a to jest...
jeszcze jeden napis'''
- Ostatni przypadek to wyjątek od zasady że koniec linii kończy instrukcję. Napis podany w pierwszych dwóch postaciach nie może zawierać przejścia do nowej linii.
- Nazwy są po to, aby oznaczać nimi wartości. Wartościami mogą być np. liczby i napisy:
pi = 3.14159
komunikat = 'Uwaga!!!'
UWAGA: znak równości to nie porównanie, a operator przypisania. Powoduje on, że nazwa po jego lewej stronie będzie odtąd oznaczać wartość zapisaną po prawej. W szczególności, po lewej stronie znaku równości nie może występować np. stała liczba.
- Więcej o stałych i nazwach na następnej stronie, na razie tyle nam wystarczy.
- Inne operatory, to w szczególności arytmetyka:
+ - * / // % **
'*' to mnożenie, '//' to dzielenie całkowitoliczbowe, '%' to reszta z dzielenia (na ogół stosowana do liczb całkowitych, ale niekoniecznie), '**' to potęgowanie.
- Napisy też można "dodawać":
imie = 'Jacek'
powitanie = 'witaj ' + imie
print(powitanie)
Czemu właściwie operację ,,sklejania" napisów oznaczono plusem? W matematyce zazwyczaj plus stosuje się na oznaczenie operacji przemiennych, tzn. takich, których wynik nie zależy od kolejności składników — a sklejanie napisów ewidentnie taką operacją nie jest. Ale cóż, tak się przyjęło.
Używanie linii poleceń interpretera
Interpreter to aplikacja, która potrafi czytać tekst kodu w języku Python i wykonać zapisane w nim polecenia. Może on być używany jako samodzielne polecenie, wywoływane w oknie terminala, lub zintegrowany z środowiskiem programistycznym w rodzaju Spyder lub Visual Studio Code.
Zanim zaczniemy pisać "poważne" programy, nauczymy się korzystać z trybu interaktywnego interpretera, który pozwala na wpisywanie po jednym poleceniu i natychmiastowe uzyskanie wyniku jego wykonania. Można go używać do podręcznych rachunków - zamiast kalkulatora -- i do eksperymentowania z kodem w Pythonie. Do pracy interaktywnej warto używać "wzbogaconej" wersji interpretera, wywoływanej poleceniem
$ ipython3
w najprostszych zastosowaniach niewiele się on różni od "zwykłego" interpretera, wywoływanego przez python3, ale posiada pewne dodatkowe możliwości, które niedługo się nam przydadzą.
UWAGA: polecenie ipython (bez 3) wywoła domyślną wersję Pythona — aktualnie wersję 3. Podobnie, python wywoła domyślną wersję (3) "zwykłego" interpretera. Natomiast - python2 wywołuje starszą wersję "zwykłego" interpretera, z której nie należy już aktualnie korzystać. Jeszcze parę lat temu wersja 2 była domyślną, więc działało to odwrotnie.
Wykonywanie rachunków
$ ipython3
Python 3.5.1+ (default, Mar 30 2016, 22:46:26)
Type "copyright", "credits" or "license" for more information.
IPython 2.4.1 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]: 7 * (3 + 5)
Out[1]: 56
In [2]: 2.81 / (1.25 - .33)
Out[2]: 3.054347826086957
In [3]: 2**128
Out[3]: 340282366920938463463374607431768211456
In [4]: 1/9
Out[4]: 0.1111111111111111
In [5]: 11//9, 11%9
Out[5]: (1, 2)
Zapis wyrażeń arytmetycznych raczej nie zaskakuje. Drobne uwagi:
- spacje w zapisie wyrażenia, pomiędzy liczbami a operatorami (lub ich brak), nie mają znaczenia
- reguły pierwszeństwa operatorów (najpierw potęgowanie, potem mnożenie i dzielenie, potem odejmowanie i dodawanie,...) są w zasadzie takie, jak należy się spodziewać; kolejność operacji możemy narzucić nawiasami - ale tylko okrągłymi, które można wielokrotnie zagnieżdżać
- pisząc ułamek dziesiętny (liczbę z kropką), można pominąć część całkowitą lub ułamkową, o ile ma ona być zero (nie można jednak pominąć obu);
- liczby całkowite mogą być dowolnie duże (w ramach fizycznych ograniczeń komputera)
- operacje na ułamkach należy zawsze traktować jako przybliżone - w operacjach na liczbach ułamkowych komputer może ogarnąć tylko skończoną liczbę cyfr
- zwykłe dzielenie da zawsze wynik ułamkowy; istnieje jednak operator // dzielenia całkowitego, który odrzuca resztę
- gdy chcemy zakończyć "rozmowę" z interpreterem, piszemy exit(); jeżeli pracujemy w Linuxie, zadziała również dwukrotne Ctrl-D (tzn. trzymając naciśnięty klawisz Ctrl stukamy dwukrotnie w klawisz D)
Jak uzyskać pomoc
W programie IPython mamy w każdej chwili dostęp do pomocy na temat poleceń, funkcji itd. Pythona:
In [8]: print?
Type: builtin_function_or_method
String form: <built-in function print>
Namespace: Python builtin
Docstring:
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
flush: whether to forcibly flush the stream.
W tym przykładzie uzyskaliśmy szczegółowy opis zastosowania funkcji wbudowanej print. Wprawdzie po angielsku, ale mam nadzieję, że nie jest to przeszkoda nie do przeskoczenia. Już niedługo będziemy dokładnie rozumieli to, co jest tu napisane.
Jeżeli tekst pomocy jest dłuższy, to będzie wyświetlany w trybie pozwalającym m. in. na jego przewijanie z użyciem klawiszy strzałek czy PgUp, PgDn. Aby wyjść z tego trybu i powrócić do interpretera, wystarczy nacisnąć q.
Najprostszy program
Za pomocą ulubionego edytora tekstowego stwórzmy plik o nazwie hello.py i następującej treści:
#! /usr/bin/python3
print('Witaj świecie!')
Zgodnie z tradycją, będzie to program wykonujący jedno banalne zadanie: wypisanie komunikatu o ustalonej treści. Zgodnie z zasadą, że programowanie w Pythonie ma być maksymalnie proste - jedynym niezbędnym elementem tego programu jest linijka wywołująca funkcję print. W tym przykładzie, uzupełniłem treść programu o pierwszą linijkę, zaczynającą się od znaku kratki (#) - istotne jest, aby była to dokładnie pierwsza linijka w pliku, i by zaczynała się od pierwszej pozycji w wierszu. Czyli, aby #! były dokładnie dwoma pierwszymi znakami w treści pliku. Z punktu widzenia Pythona, linijka ta jest komentarzem, i przy uruchamianiu pliku jest ignorowana. Pozwala ona jednak, by plik ten był automatycznie rozpoznawany przez system operacyjny (Linux) jako zawierający program w języku Python. Jaki z tego pożytek, dowiemy się za chwilę.
Aby ten program uruchomić, jest parę sposobów. Najprościej:
$ python3 hello.py
powyższe polecenie wpisujemy w terminalu, w trybie powłoki systemowej (nie w programie IPython!). Tutaj musieliśmy jawnie wywołać interpreter Pythona i wskazać mu plik hello.py jako zawierający kod do uruchomienia.
Zamiast tego, możemy nadać plikowi hello.py atrybut pliku wykonywalnego, czyli programu, i uruchomić go bezpośrednio:
$ chmod +x hello.py
$ ./hello.py
- Polecenie z pierwszej linijki wystarczy wykonać raz dla danego pliku
- Zamiast z linii poleceń, można w okienku Właściwości pliku znaleźć odpowiednie pole do kliknięcia
- Postać drugiej linijki tłumaczy się tym, że nasz program hello.py nie jest zainstalowany w systemie i nie zostanie odnaleziony przez przeszukanie standardowych lokalizacji programów na dysku. Należy wyraźnie wskazać, że chodzi o plik znajdujący się w bieżącym folderze - i to tu robimy.
- Plik z kodem w Pythonie nie musi mieć nazwy kończącej się na .py - jest to jednak wygodne, bo np. edytory tekstu traktują to jako sugestię co do zawartości pliku, i mogą dostosować do tego swoje działanie (np. gedit)
Ćwiczenia
Rachunki w linii poleceń
- Ile wynosi reszta z dzielenia 2999 przez 7?
- Która z tych liczb mniej się różni od pierwiastka kwadratowego z 2: 721/510 czy 722/510?
- Oblicz pierwiastek kwadratowy z 2, a następnie - podnieś go do kwadratu; ile wynosi względny błąd wyniku?
CDN