Języki programowania
Komputery mają swój własny język, zwany językiem maszynowym. Kompletny zestaw znanych poleceń nazywa się listą instrukcji, czasami skracaną do IL (ang. Instruction List). Różne typy komputerów mogą się różnić w zależności od wielkości ich IL, a instrukcje mogą być całkowicie różne w różnych modelach. IL jest w rzeczywistości alfabetem języka maszynowego. Jest to najprostszy i najbardziej podstawowy zestaw symboli, jaki możemy wykorzystać do wydawania komputerowi poleceń.
Język, w którym ludzie mogą pisać swoje programy i język, którym mogą posługiwać się komputery, aby wykonać programy, o wiele bardziej skomplikowanego niż język maszynowy, nazywamy językiem programowania wysokiego poziomu. Program napisany w języku programowania wysokiego poziomu nazywany jest kodem źródłowym (w przeciwieństwie do kodu maszynowego wykonywanego przez komputery). Podobnie plik zawierający kod źródłowy nazywamy plikiem źródłowym.
Kompilacja a interpretacja
Programowanie komputerowe jest aktem komponowania wybranych elementów języka programowania w kolejności, która pozwala uzyskać pożądany efekt. Efekt może być inny w każdym konkretnym przypadku – zależy od wyobraźni programisty, jego wiedzy i doświadczenia.
Oczywiście taka kompozycja musi być poprawna pod wieloma względami:
- alfabetycznym - program musi być napisany w rozpoznawalnym systemie znaków, takim jak alfabet łaciński, cyrylica, itp.
- leksykalnym - każdy język programowania ma swój słownik i trzeba go opanować; na szczęście jest znacznie prostszy i mniejszy niż słownik jakiegokolwiek języka naturalnego,
- syntaktycznym - każdy język ma swoje zasady i należy ich przestrzegać,
- semantycznym - program musi mieć sens.
Istnieją dwa różne sposoby przekształcania programu z języka programowania wysokiego poziomu na język maszynowy:
KOMPILACJA - program źródłowy jest tłumaczony jeden raz (jednak czynność ta musi zostać powtórzona za każdym razem, gdy modyfikujemy kod źródłowy) poprzez pobranie pliku (np. pliku .exe, jeśli kod ma być uruchamiany przez MS Windows) zawierającego kod maszynowy; program wykonujący to tłumaczenie jest nazywany kompilatorem,
INTERPRETACJA - możemy tłumaczyć program źródłowy za każdym razem, gdy ma zostać uruchomiony; program realizujący ten rodzaj transformacji jest nazywany interpreterem, ponieważ interpretuje kod za każdym razem, gdy ma być wykonany; oznacza to również, że nie można po prostu dystrybuować kodu źródłowego takim, jaki jest, ponieważ użytkownik końcowy również potrzebuje interpretera, aby go wykonać.
Ze względów historycznych języki zaprojektowane do użycia w trybie interpretacji są często nazywane językami skryptowymi, a programy źródłowe zakodowane za ich pomocą nazywane są skryptami.
Python to interpretowany, obiektowy, język programowania wysokiego poziomu z dynamiczną semantyką, używany do programowania powszechnego użytku.
Wszystkie wersje języka Python, wychodzące spod skrzydeł PSF (Python Software Foundation) napisane są w języku „C”. Dlatego implementacje języka Python wywodzące się od PSF znane są również pod nazwą CPython.
Skąd wziąć „Pythona”?
Użytkownicy systemu Linux najprawdopodobniej mają już zainstalowany język Python - infrastruktura tego języka jest w bardzo dużym stopniu wykorzystywana przez liczne komponenty samego systemu operacyjnego Linux.
Niektórzy dystrybutorzy mogą na przykład połączyć wybrane narzędzia z systemem, a z kolei wiele z tych narzędzi, takie jak menedżer pakietów, jest często napisanych w języku Python. Niektóre części środowisk graficznych dostępnych w systemach Linux mogą również wykorzystywać język Python. Wystarczy w konsoli tekstowej wpisać polecenie: python3. Jeżeli zwrócony zostanie komunikat podobny do poniższego, oznacza to, że mamy już zainstalowanego Pythona
Python 3.4.5 (default, Jan 12 2017, 02:28:40)
[GCC 4.2.1 Compatible Clang 3.7.1 (tags/RELEASE_371/final)] on linux
Type "help", "copyright", "credits" or "license" for more information.
Jeśli jednak nie posiadasz języka Python 3, zerknij do dokumentacji swojej dystrybucji systemu Linux, żeby odnaleźć informacje dotyczące wykorzystania menedżera pakietów do ściągnięcia i instalacji nowego pakietu – pakiet, którego będziesz potrzebować nosi nazwę python3 albo jego nazwa właśnie tak się rozpoczyna. Jeżeli korzystamy z innych systemów operacyjnych, Pythona możemy pobrać stąd: https://www.python.org/downloads/.
Po zainstalowaniu języka Python 3 w standardowej konfiguracji otrzymujemy dostęp nie tylko do wielu użytecznych komponentów tej implementacji, ale również do bardzo prostej aplikacji zwanej IDLE (Integrated Development and Learning Environment).
Typy danych, zmienne, podstawowe operacje wejścia/wyjścia
Funkcja print()
Słowo print jest nazwą funkcji. Nie znaczy to, że zawsze, gdy pojawia się to słowo, będzie ono nazwą funkcji. Znaczenie słowa wynika z kontekstu, w którym zostało ono użyte. Funkcje języka Python są bardziej elastyczne i mogą zawierać więcej treści niż te matematyczne. Funkcje mogą pochodzić z samego języka Python, mogą pochodzić z jednego lub większej liczby rozszerzeń nazywanych modułami; niektóre moduły pochodzą z samego języka Python, inne mogą wymagać osobnej instalacji. Możemy też pisać je sami.
Funkcje mogą posiadać efekt, wynik oraz argumenty.
print("Witaj świecie!")
Nawiasy okrągłe są bezwzględnie wymagane, niezależnie od liczby przekazywanych parametrów. Argumenty oddzielamy przecinkami. Łańcuchy znaków są ograniczone cudzysłowami. Język Python może używać apostrofu zamiast cudzysłowu. Każdym z tych znaków możesz odseparować ciągi znaków, ale musisz być konsekwentny. W łańcuchach znaków może znaleźć się znak ucieczki "\", zmieniający znaczenie znaku po nim występującego np. "\n" wprowadza znak nowej lini.
Jak działają funkcje?
- Po pierwsze Python sprawdza czy podana przez nas nazwa funkcji jest dozwolona, przegląda swoje wewnętrzne dane, aby znaleźć istniejącą funkcję pożądanej nazwy; jeśli to wyszukiwanie nie powiedzie się, język Python przerwie nasz kod,
- po drugie, język Python sprawdza, czy wymagania funkcji co do liczby argumentów pozwalają nam wywołać funkcję w nasz sposób,
- po trzecie, język Python na chwilę zostawia kod i przeskakuje do funkcji, którą chcemy wywołać; oczywiście, bierze też argument lub argumenty i przekazuje je funkcji,
- po czwarte, funkcja wykonuje swój kod, wywołuje pożądany efekt (jeśli występuje), ocenia pożądany wynik(i) (jeśli istnieje) i kończy swoje zadanie,
- w końcu, język wraca do kodu (do miejsca zaraz po wywołaniu) i wznawia jego wykonywanie tak, jakby nic się nie wydarzyło.
Najczęściej spotykanym sposobem przekazywaniem argumentów w języku Python jest przekazywani pozycyjne (nazwa pochodzi od tego, że znaczenie argumentów jest podyktowane ich pozycją. Na przykład drugi argument zostanie wyświetlony po pierwszym, a nie odwrotnie).
W Pythonie istnieje jeszcze inny sposób przekazywania parametrów. Ten mechanizm nazywamy przekazywaniem argumentów za pomocą słów kluczowych. Nazwa tego sposobu wywodzi się od tego, że znaczenie argumentów nie jest określane na podstawie ich lokalizacji (pozycji), ale przez specjalne słowo (słowo-klucz), które jest wykorzystywane do identyfikacji argumentu.
Funkcja print()
posiada dwa argumenty w postaci słów-kluczy, które możemy użyć do własnych celów. Pierwszy z nich nazywa się end
. argument w postaci słowa kluczowego end
. Określa on znaki, jakie funkcja print()
przekazuje do wyniku kiedy dotrze już do ostatniego z argumentów pozycyjnych.
print("Nazywam sie", "Python.", end=" ")
Funkcja print() oddziela domyślnie spacją argumenty stanowiące wynik działania tejże funkcji. Zachowanie to można zmienić. Argument w postaci słowa kluczowego, który to potrafi, nazywa się sep (jak separator).
print("Nazywam", "sie", "Monty", "Python.", sep="-")
Argument w postaci słowa kluczowego składa się z trzech elementów: słowa kluczowego identyfikującego argument (w tym przypadku jest to end
); znaku równości (=
); oraz wartości przypisanej do tego argumentu;
Jakiekolwiek argumenty w postaci słów kluczowych muszą być umiejscowione po ostatnim argumencie pozycyjnym (to bardzo ważne)
Literały
Literał to dane, których wartości są określone przez sam literał. Literałów używamy do kodowania danych i umieszczania ich w kodzie.
Charakterystyka wartości numerycznej, która określa jej rodzaj, zakres i zastosowanie, nazywana jest typem. Jeśli zakodujesz literał i umieścisz go w kodzie języka Python, forma literału określa reprezentację (typ), którego język Python użyje do przechowania go w pamięci.
Liczby całkowite (int) są jednym z rodzajów literałów liczbowych obsługiwanych przez język Python. Są to liczby zapisane bez elementu ułamkowego, np. 256
lub -1
(liczby całkowite ujemne).
Jeśli liczba całkowita jest poprzedzona prefiksem 0O
lub 0o
(zero-o), to będzie potraktowana jako wartość ósemkowa. Oznacza to, że liczba musi zawierać cyfry wyłącznie z zakresu [0..7].
Druga konwencja pozwala nam na zapis liczb w postaci szesnastkowej. Liczby takie powinny być poprzedzone prefiksem 0x
lub 0X
(zero-x).
Kropka dziesiętna jest istotna dla rozpoznawania liczb zmiennoprzecinkowych (ang. floats) w języku Python.
4 4.0
4
jest liczbą całkowitą, a 4.0
jest liczbą zmiennoprzecinkową. To kropka sprawia, że liczba jest jest zmiennoprzecinkowa.
Gdy chcesz użyć dowolnych liczb, które są bardzo duże lub bardzo małe, możesz użyć notacji naukowej.
3E8
4e12
Za każdym razem, gdy pytamy języka Python, czy jedna cyfra jest większa od drugiej, pytanie powoduje utworzenie pewnych określonych danych – wartości boolowskich (prawda, fałsz). Dwie wartości boolowskie mają ścisłe oznaczenia w języku Python:
True False
Operatory arytmetyczne
Znak **
(podwójna gwiazdka) oznacza potęgowanie. Argument stojący po lewej stronie tego znaku to podstawa potęgi, a ten po prawej to wykładnik. Jeśli oba argumenty operatora **
są liczbami całkowitymi, to wynik działania jest również liczbą całkowitą; Jeśli choć jeden argument operatora **
jest liczbą zmiennoprzecinkową, to wynikiem jest liczba zmiennoprzecinkowa.
Znak *
(gwiazdka) jest operatorem mnożenia.
Znak /
(ukośnik) jest operatorem dzielenia. W wyniku operacji z użyciem operatora oznaczającego dzielenie zawsze otrzymujemy liczbę zmiennoprzecinkową.
Podwójny ukośnik //
to operator dzielenia całkowitego. Różni się on od standardowego operatora /
dwoma szczegółami:
- wynik takiej operacji pozbawiony jest części dziesiętnej – nie ma jej wcale (w przypadku liczb całkowitych) albo zawsze wynosi zero (w przypadku liczb rzeczywistych). Oznacza to, że wynik zostaje zawsze zaokrąglony do liczby całkowitej o mniejszej wartości. Dzielenie całkowite można również nazwać dzieleniem z zaokrągleniem w dół.
- zachowanie takie jest zgodne z zasadą liczba całkowita vs. liczba zmiennoprzecinkowa.
Wynikiem operacji z wykorzystaniem takiego operatora % (modulo) jest reszta pozostała z dzielenia liczby całkowitej.
Operatorem dodawania jest znak +
(plus), który zachowuje się tutaj zgodnie z wszelkimi zasadami matematycznymi.
Operatorem odejmowania jest oczywiście znak -
(minus), chociaż należy zauważyć też, że operator ten ma również inne znaczenie - potrafi zmienić znak liczby.
Język programowania jakim jest Python dokładnie określa priorytet (pierwszeństwo) danego operatora i zakłada, że operatory z wyższym priorytetem są wykonywane przed operatorami z niższym priorytetem (tak, jak w matematyce).
Łączenie operatorów determinuje szyk, wedle którego wykonywane są obliczenia w przypadku gdy pewne operatory o tym samym priorytecie zostaną zestawione ze sobą w jednym wyrażeniu.
Większość operatorów wykorzystywanych przez język Python posiada łączenia lewostronne, co w praktyce oznacza, że działania wykonywane są od lewej strony do prawej. Wyjątkiem od tej zasady jest operator potęgowania, który wykorzystuje łączenie prawostronne.
Przykład
print((5 * ((25 % 13) + 100) / (2 * 13)) // 2)
Wynikiem będzie 10.0
Zmienne
Język Python umożliwiać kodowanie literałów zawierających wartości liczbowe i tekstowe. Każda zmienna w Pythonie ma nazwę i wartość.
- nazwa zmiennej musi składać się z wielkich lub małych liter, cyfr i znaku
_
(podkreślnika) - nazwa zmiennej musi zaczynać się od litery;
- podkreślnik jest literą;
- wielkie i małe litery traktowane są jako różne;
- nazwa zmiennej nie może być żadnym ze słów zastrzeżonych w języku Python (słów kluczowych).
Zmienna powstaje w wyniku przypisania jej wartości. W przeciwieństwie do innych języków, nie musisz zadeklarować jej w żaden szczególny sposób. Jeśli przypiszesz jakąś wartość do nieistniejącej zmiennej, zmienna zostanie utworzona automatycznie. Python jest językiem o typowaniu dynamicznym.
var = 1 stan_konta = 1000.0 klient = 'Jan Kowalski' a = 3.0 b = 4.0 c = (a ** 2 + b ** 2) ** 0.5 x *= 2 owca += 1
Komentarze
Komentarze mogą być użyte w celu zostawienia w kodzie dodatkowych informacji. Są pomijane w czasie wykonywania programu. Informacje pozostawione w kodzie źródłowym są adresowane do innych osób przeglądających nasz kod. W Pythonie komentarz jest fragmentem tekstu zaczynającym się od znaku #
. Komentarz rozciąga się do końca linii.
Funkcja input()
Funkcja input()
potrafi odczytać dane wprowadzone przez użytkownika i przekazuje je do uruchomionego programu.
print("Powiedz mi cokolwiek...") cokolwiek = input() print("Hmm...", cokolwiek, "... Serio?")
Funkcja input()
zostaje wywołana bez argumentów (to najprostszy sposób wykorzystania funkcji). Następnie, funkcja przełącza konsolę w tryb wprowadzania danych wejściowych, sygnalizowany przez migający kursor. Teraz można wprowadzić znaki, pisząc na klawiaturze komputera, aby następnie zwieńczyć wszystko naciśnięciem klawisza Enter. W tym momencie wszelkie wprowadzone dane zostają przesłane do programu przy pomocy wyniku funkcji;
cokolwiek = input("Powiedz mi cokolwiek...") print("Hmm...", cokolwiek, "...Serio?")
Rezultatem funkcji input()
jest ciąg znaków.
Konwersja typu
Funkcja int()
przyjmuje jeden argument (np. ciąg znaków: int(string)
) próbuje dokonać jego konwersji na liczbę całkowitą; jeśli próba zakończy się porażką, cały program również ulegnie awarii (jest sposób, by poradzić sobie i z tym problemem, ale zademonstrujemy go nieco później),
Funkcja float()
przyjmuje jeden argument (np. ciąg znaków: float(string)
) i próbuje przeprowadzić konwersję tego argumentu na liczbę rzeczywistą (dalej logika działania jest taka sama jak wyżej).
bok_a = float(input("Wprowadz dlugosc pierwszego boku: "))
Operatory ciągów znaków
Znak +
(plus), wstawiony między dwa ciągi znaków, pełni rolę operatora konkatenacji (połączenia) dwóch ciągów znaków w jeden. Operator ten nie jest komutatywny, czyli przemienny.
Znak *
(gwiazdka) w połączeniu z ciągiem znaków i liczbą (albo liczbą i ciągiem znaków, bo w tym wypadku możliwe jest zamienne stosowanie) staje się operatorem replikacji.
"Janek" * 3
daje"JanekJanekJanek"
3 * "an"
daje"ananan"
5 * "2"
(lub"2" * 5
) daje"22222"
(ale nie10
!)
Operatory relacji
Operator ==
(operator równości) porównuje wartości dwóch argumentów. Jeśli są równe, wynikiem porównania jest True
. Jeśli nie są równe, wynikiem porównania jest False
.
Operator !=
(nie równa się) również porównuje wartości dwóch argumentów. Oto różnica: jeśli są równe, wynikiem porównania jest False
. Jeśli nie są równe, wynikiem porównania jest True
.
Możesz również zadać pytanie porównawcze za pomocą operatora >
(większe niż).
Operator większe niż ma jeszcze jeden specjalny, nieprecyzyjny wariant, ale jest on oznaczany inaczej niż w klasycznej notacji arytmetycznej: >=
(greater than or equal to).
Oczywiście przez analogię mamy również operatory mniejszy (<) oraz mniejszy równy (<=).
Warunki i wykonywanie warunkowe
if prawda_lub_fałsz: zrob_to_i_tamto
Jeżeli wyrażenie prawda_lub_fałsz
reprezentuje prawdę (tj. jego wartość nie jest równa zeru), wykonany zostanie fragment kodu umieszczony we wcięciu;
Jeżeli wyrażenie prawda_lub_fałsz
nie reprezentuje prawdy (tj. jego wartość jest równa zeru), fragment kodu umieszczony we wcięciu zostanie pominięty (zignorowany), a następną wykonaną instrukcją będzie ta, która wystąpi po pierwotnym poziomie wcięcia.
Język Python pozwala nam wyrazić takie alternatywne plany. Odbywa się to za pomocą drugiej, nieco bardziej złożonej formy instrukcji warunkowej - instrukcji if-else:
if prawda_lub_falsz: zrob_to_i_tamto else: zrob_cos_innego
Jeśli warunek zostanie uznany jako True (jego wartość jest różna od zera), wykonywana jest instrukcja zrob_to_i_tamto
, a instrukcja warunkowa zostaje ukończona;
Jeśli warunek zostanie uznany jako False (jego wartość jest równa zero), wykonywana jest instrukcja zrób_coś_innego
, a instrukcja warunkowa zostaje ukończona.
Oczywiście instrukcję if lub if-else można zagnieżdżać.
if ladna_pogoda: if znajdziemy_dobra_restauracje: zjemy_lunch() else: zjemy_kanapki() else: if bilety_dostepne: pojdziemy_do_kina() else: pojdziemy_na_zakupy()
Instrukcję można również rozbudować o wariant z instrukcją elif
if ladna_pogoda: pojdziemy_na_spacer() elif bilety_dostepne: pojdziemy_do_kina() elif dostaniemy_stolik: zjemy_kolacje() else: zagramy_w_szachy_w_domu()
Zapętlanie kodu za pomocą instrukcji while
while wyrazenie_warunkowe: instrukcja_1 instrukcja_2 instrukcja_3 : : instrukcja_n
Jeśli chcesz wykonać więcej niż jedną instrukcję w pętli while
, musisz (tak jak przy if
) umieścić we wcięciach wszystkie instrukcje w taki sam sposób;
Instrukcja lub zestaw instrukcji wykonywanych wewnątrz pętli while
nazywa się ciałem pętli (ang. loop body);
Jeśli warunek jest oceniony jako False
(równy zeru) już w momencie pierwszego testu, ciało pętli nie jest wykonywane ani razu (zauważ analogię braku konieczności wykonania czynności, jeśli nie ma nic do zrobienia),
Ciało pętli powinno być zdolne do zmiany wartości warunku, ponieważ jeśli na początku warunek jest oceniony jako True
, ciało pętli może być wykonywane nieprzerwanie do nieskończoności – zauważ, że zrobienie czegoś zwykle zmniejsza liczbę rzeczy do zrobienia).
counter = 5 while counter != 0: print("W petli.", counter) counter -= 1 print("Poza petla.", counter)
Zapętlanie kodu za pomocą instrukcji for
for i in range(100): # zrob_cos() pass
Słowo kluczowe for otwiera pętlę for
; uwaga – po nim nie ma warunku; nie musisz myśleć o warunkach, ponieważ są one sprawdzane wewnętrznie, bez żadnej interwencji,
Dowolna zmienna po słowie kluczowym for jest zmienną kontrolną zmienną kontrolną pętli; zlicza powtórzenia pętli i robi to automatycznie,
Słowo kluczowe in wprowadza element składni opisujący szereg możliwych wartości przypisanych zmiennej kontrolnej,
Funkcja range()
(jest to bardzo specjalna funkcja) jest odpowiedzialna za generowanie wszystkich pożądanych wartości zmiennej kontrolnej; w naszym przykładzie funkcja utworzy (możemy nawet powiedzieć, zasili pętlę) kolejne wartości z następującego zestawu: 0, 1, 2 .. 97, 98, 99; uwaga: w tym przypadku funkcja range()
rozpoczyna swoje zadanie od 0 i kończy je jeden krok (jedną liczbę całkowitą) przed wartością jej argumentu,
Zauważ słowo kluczowe pass w ciele funkcji – ono nic nie robi; to pusta instrukcja - umieszczamy ją tutaj, ponieważ składnia pętli for
wymaga co najmniej jednej instrukcji wewnątrz ciała pętli.
for i in range(2, 8): print("Wartosc i wynosi obecnie", i)
W tym przypadku pierwszy argument funkcji range()
określa początkową (pierwszą) wartość zmiennej kontrolnej.
Ostatni argument pokazuje pierwszą wartość, która zmiennej kontrolnej nie zostanie przypisana.
Uwaga: funkcja range()
akceptuje tylko liczby całkowite jako argumenty i generuje sekwencję liczb całkowitych.
Funkcja range()
może również przyjąć trzy argumenty. Trzeci argument jest przyrostem - jest to wartość dodana do kontrolowania zmiennej przy każdym rozpoczęciu pętli (jak można podejrzewać, domyślna wartość tego przyrostu to 1).
for i in range(2, 8, 3): print("Wartosc i wynosi obecnie", i)
Instrukcje break oraz continue
break
- natychmiast wychodzi z pętli i bezwarunkowo kończy działanie pętli; program zaczyna wykonywać instrukcję najbliższą ciału pętli,continue
- zachowuje się tak, jakby program nagle dotarł do końca ciała pętli; rozpoczyna się kolejna pętla, a wyrażenie warunku jest natychmiast testowane.