Jeszcze przed pierwszymi zajęciami¶
Ankieta¶
Szanowny czytelniku, przed rozpoczęciem zajęć prosimy o przystąpienie do ankiety ewaluacyjnej.
Serwer Jupyter¶
Pod adresem: http://omega.smcebi.us.edu.pl dostępna jest spersonalizowana platforma do ćwiczeń. Detale logowania otrzymacie na pierwszych zajęciach.
Lekcja 1. Co to takiego język Python. Zmienne oraz typy zmiennych.¶
Języki programowania, budowa i podział¶
Z wyjątkiem całkowicie niezrównoważonego zachowania, każda ludzka decyzja sprowadza się do wyboru jednej z dwóch możliwości
(Jeff Dunteman, Zrozumieć Asembler)
Program komputerowy to przepis jak coś zrobić. Nieco bardziej technicznie możemy powiedzieć, że jest to skończona ilość instrukcji prostych. Aby napisać program komputerowy posługujemy się pewnym schematem leksykalnym, który nazywamy językiem programowania. Kiedyś programy “pisało się”, dziurkując karty, dzisiaj zwykle otwieramy edytor tekstowy i wpisujemy komendy.
Wybór konkretnego języka programowania to wybór pewnego zestawu instrukcji prymitywnych, składni, semantyki, itp. Decydując się na dany język, musimy wybrać jak blisko/daleko chcemy być od języka maszyny. Języki programowania możemy dzielić na kilka sposobów:
- języki wysokiego poziomu
posiadają duży zestaw instrukcji prymitywnych, przykładowo możemy od razu mieć dostępną instrukcję, obliczającą pierwiastek, nie musimy poświęcać czasu na jej zaprogramowanie (Python, C, C++, .Net)
- języki niskiego poziomu
za ich pomocą przesuwamy części pamięci między konkretnymi rejestrami (asembler)
- języki mieszane
niejako hybryda dwóch powyższych.
Ze względu na zastosowanie możemy wyróżnić:
- języki ogólnego zastosowania
bardzo bogate w instrukcje prymitywne (C, C++, Python)
- języki szczególnego zastosowania
instrukcje prymitywne zorientowane na konkretne zastosowania (Matlab, R)
W końcu z powodów technicznych istnieją:
- języki interpretowane (Python, HTML, PHP)
operuje bezpośrednio na kodzie źródłowym, wykonanie programu przebiega w stadiach źródło - checker - interpreter - wyjście (wynik)
- języki kompilowane (C, C++, Fortran)
kod kompiluje się wstępnie do kodu obiektowego. Daje to lepszą kontrolę nad błędami jeszcze przed uruchomieniem programu oraz zwyczajowo bardziej sprawną sekwencję końcową. Stadia uruchomienia programu to:
źródło - kompilator + checker - kod obiektowy - intepreter - wyjście
Informacja
Język Python jest interpretowanym językiem wysokiego poziomu i ogólnego zastosowania.
Na język programowania składają się:
konstrukcje prymitywne
- literał - jednostka leksykalna reprezentująca określoną wartość,
np: 1, ‘Ala’, 3.1415. Możemy wyróżnić cały ich szereg. W zasadzie
wszystko zależy od wybranego przez nas języka programowania. Pewne
podstawowe literały to
- literał bitowy
- literał liczbowy
- literał łańcuchowy
- literał logiczny
- literał znakowy
- literał pusty
- literał tablicowy
- literał wyliczeniowy
- literał zbiorowy
- literał zespolony
- operator - takie jak
+
,-
, itp.
- literał - jednostka leksykalna reprezentująca określoną wartość,
np: 1, ‘Ala’, 3.1415. Możemy wyróżnić cały ich szereg. W zasadzie
wszystko zależy od wybranego przez nas języka programowania. Pewne
podstawowe literały to
- składnia (syntaks)
mówi nam o tym, jak poszczególne znaki możemy ze sobą łączyć, które symbole są legalne
>>> 2 + 2 # zapis legalny >>> 2 2 + # zapis nielegalny
Język Python ma bardzo dobrą kontrolę nad poprawnością składni.
- semantyka statyczna i pełna
pierwsza mówi o tym które połączenia operatorów oraz literałów mają sens. Druga zapewnia jednoznaczny sens każdemu zdaniu.
Wprowadzenie do składni języka Python¶
Pracować z językiem Python możemy co najmniej na dwa sposoby:
- W trybie interaktywnym, w powłoce.
W typowej instalacji domowej, na lokalnym komputerze, aby zacząć korzystać z tego trybu należy uruchomić program
python
. Powłoka języka powinna zwrócić, tak zwany znak zachęty:>>>
Aby zakończyć pracę w tym środowisku, można użyć funkcji:
>>> exit()
- Poprzez skrypty.
Skrypty zawierają, w formie pliku tekstowego, sekwencję funkcji, wyrażeń, itp. Do ich tworzenia użyć można dowolnego edytora tekstów. Skrypty te powinny mieć rozszerzenie
.py
Typowy skrypt Pythona, w środowisku GNU/Linux rozpoczyna się linią:#!/usr/bin/python
Komentarze¶
Komentarze w języku Python poprzedzone są znakiem #
.
Wszystkie znaki następujące po #
, a ciągnące się do końca linii, są
ignorowane.
>>> # pierwsza linia komentarza
>>> print "Witaj Swiecie" # druga linia komentarza
Dodatkowo, istnieją tak zwane komentarze blokowe, obejmujące dowolny tekst wpisany w potrójne cudzysłowy lub apostrofy.
""" ten tekst, poprzedzony jest,
oraz zakończony
trzema cudzysłowami,
zatem potraktowany zostanie jako komentarz
"""
Jest to w istocie tak zwany literał znakowy, jego szersze użycie skomentowane jest w dalszej części kursu.
Wcięcia¶
W języku Python istotne są tak zwane wcięcia. To one definiują logiczne
bloki kodu. Poprzez bloki, rozumiemy na przykład instrukcje sterujące
takie jak: if
, for
, itp. Instrukcje sterujące, są tematem
drugiej lekcji kursu.
Bloki kodu, nie są ograniczone żadnymi nawiasami, klamrami, czy słowami
kluczowymi, tak jak to ma miejsce w innych językach programowania.
>>> owoce = 'gruszka'
>>> if owoce == 'gruszka': # jeśli warunek jest spełniony, to
>>>print('Bardzo lubie gruszki!') #wykonaj
>>>print('I moglbym to powiedziec 100 razy...') # ciąg kolejnych
>>>print(100 * (owoce + '! ')) # poleceń ...
W tym języku, jedynym separatorem innym niż wcięcia jest :
. Wstawiając
wcięcie, zaczynamy blok, a kończymy go zmniejszając wielkość wcięcia do
poprzedniej wartości. Wcięciami mogą być wszystkie białe znaki, czyli w
szczególności spacje i tabulatory. Należy zapamiętać
W jednym bloku ilość znaków wcięcia musi być taka sama.
Dzielenie linii¶
Wyrażenia w Pythonie kończą się wraz ze znakiem nowej linii. Jeśli chcemy
je kontynuować to fakt ten musimy zaznaczyć poprzez \
.
>>> suma = skladnik_pierwszy + \
>>> skladnik_drugi + \
>>> skladnik_trzeci
Wyjątkiem od tej reguły dzielenia wyrażeń, są te, które zawarte są w
nawiasach: ()
, []
, {}
.
Aby w jednej linii wprowadzić wiele wyrażeń, należy się posłużyć ;
(zupełnie jak w języku C).
>>> napis = "Witaj Swiecie"; print(napis)
Witaj Swiecie
Słowa zarezerwowane:¶
Poniżej, w formie tabeli, wymienione są tak zwane słowa zarezerwowane. Nie mogą być one używane jako nazwy zmiennych, stałych czy funkcji.
and | exec | not |
assert | finally | or |
break | for | pass |
class | from | |
continue | global | raise |
def | if | return |
del | import | try |
elif | in | while |
else | is | with |
except | lambda | yield |
False | None | True |
Uwaga, należy pamiętać, że w Pythonie wielkość liter ma znaczenia.
Wyrazenie
oraz wyrazenie
to dwie różne zmienne.
Typy i operatory¶
Powłoka Python jako kalkulator¶
Powłoka języka Python, może być używana jako mniej lub bardziej zaawansowany kalkulator. Zastosowanie to jest tylko pozornie trywialne. Opanowanie, podstawowych technik oferowanych przez tę funkcję, jest dobrym ćwiczeniem, przed bardziej zaawansowanymi tematami. Jest to również dobre miejsce, by zapoznać się z tak zwanymi typami danych, na których można pracować w języku Python.
Poszczególne typy danych różnią się między sobą zbiorami dozwolonych wartości oraz zestawem dozwolonych operacji, które można na nich wykonać.
W dużym uproszczeniu, w języku Python istnieją dwa podstawowe typy liczbowe:
- typ całkowity
int
: Stowarzyszone są z nim następujące operatory:
+, -, *, /, //, %
. Ten typ danych, możesz utożsamiać z liczbami całkowitymi. Reprezentowane są jako liczby niezakończone kropką.>>> 2 + 2 4
Proszę pamiętać, że odstępy między symbolami działania a jego argumentami (zwanymi dalej operandami) nie są istotne, wprowadzono je dla lepszej czytelności.
- typ całkowity
- typ zmiennoprzecinkowy
float
: Stowarzyszone są z nim następujące operatory:
+, -, *, /, //
. Ten typ danych, możesz utożsamiać z liczbami rzeczywistymi. Część dziesiętna jest oddzielona od części całkowitej za pomocą znaku kropki.>>> 4.0 - 1.0 3.0
- typ zmiennoprzecinkowy
Prócz tego, w języku Python istnieją:
- typ danych tekstowych
str
: związany jest on z obsługą napisów i pojedynczych znaków. Stowarzyszone są z nim następujące operatory:
+, *
- typ danych tekstowych
- typ logiczny
bool
, przyjmować może dwie wartości:
True
iFalse
. Więcej o tym typie danych dowiecie się na lekcji drugiej.
- typ logiczny
- typ NoneType:
None
Wartość używana do wyrażania braku sensownej wartości, nieistnienia danej, itp.
- typ NoneType:
Żeby sprawdzić jakiego typu jest dany obiekt, można użyć funkcji type()
,
przykładowo:
>>> type(3)
<type 'int'>
>>> type(7.5)
<type 'float'>
>>> type("a")
<type 'str'>
Poznajmy podstawowe operacje matematyczne zaimplementowane w powłoce:
- Suma,
a + b
: realizowana jest za pośrednictwem operatora
+
:>>> 5 + 6 11 >>> 5.0 + 1.2 6.2 >>> -3.4 + 6 2.6 >>> type(-3.4 + 6) <type 'float'>
Zwrócić należy uwagę na możliwość wykonywania operacji na dwóch różnych typach danych! W takim przypadku dokonane zostanie rzutowanie typów. Jest to konwersja, zmiana do wartości pewnego typu na odpowiadającą jej wartość innego typu. Nie każde rzutowanie jest możliwe do wykonania!
- Suma,
- Różnica,
a - b
: realizowana jest za pośrednictwem operatora
-
:>>> 5 - 6 -1 >>> 5.0 - 1.2 3.8 >>> -3.4 - 6 -9.4
- Różnica,
- Iloczyn,
a * b
: realizowane jest za pośrednictwem operatora
*
:>>> 5 * 6 30 >>> 5.0 * 1.2 6.0 >>> - 3.4 * 6 -20.4
- Iloczyn,
- Iloraz,
a / b
oraza // b
: realizowany jest za pośrednictwem operatorów
/
oraz//
:>>> 9 / 2 4 >>> 9.0 / 2.0 4.5 >>> 9.0 // 2 4.0 >>> 9 // 2 4
W przypadku działań na liczbach typu
float
,a // b
oznacza dzielenie całkowite, z odrzuceniem części ułamkowej.
- Iloraz,
- Reszta z dzielenia,
a % b
: realizowane jest za pośrednictwem operatora
%
:>>> 9 % 2 1 >>> 9.0 % 2.0 1.0 >>> 9.0 % 2 1.0
- Reszta z dzielenia,
- Potęgowanie,
a ** b
: realizowane jest za pośrednictwem operatora
*
:>>> 2 ** 3 8 >>> 2 ** -2 0.25
- Potęgowanie,
Wymienione powyżej +, -, *,**, /, //, %
noszą nazwę operatorów
arytmetycznych.
Kolejność wykonywania działań jest zgodna z tradycyjnie przyjętą.
Dozwolone jest stosowanie nawiasów okrągłych. Mogą one być zagnieżdżane.
Należy pamiętać, że jeśli zapis liczby zaczyna się od:
0b
to oznacza to liczbę w zapisie dwójkowym,0x
to oznacza to liczbę w zapisie szesnastkowym,0
to oznacza to liczbę w zapisie ósemkowym.
Bardziej zaawansowane funkcje matematyczne dostępne są po zaimportowaniu
modułu math
.
Więcej o modułach dowiesz się z dodatku 1 (moduły).
Operatory - ciąg dalszy¶
- Operatory logiczne:
and
zwraca wartośćTrue
wtedy i tylko wtedy, gdy oba operandy są prawdziwe,
>>> False and True 0
or
zwraca wartośćTrue
, gdy którykolwiek z operandów jestTrue
,
>>> False or false 0
not
operator używany do zamiany wartości logicznej operandów.
>>> not (True and True) False
- Operatory porównania:
==
- jeśli wartość dwóch operandów jest równa to wyrażenie jest prawdziwe, jeśli nie to jest fałszywe,
>>> 2 + 2 == 4 True >>> 5.0 == 5 # porównywanie w ramach dwóch róznych typów - automatyczna konwersja True >>> >>> "e" == "f" # przy sprawdzaniu napisów obowiązuje porządek słownikowy False
<>
- jeśli wartość dwóch operandów nie są równie to wyrażenie jest prawdziwe,
>>> 2 + 2 <> 5 True >>> 5.0 <> 5 False >>> >>> "e" <> "f" True
>
- jeśli wartość lewego operandu jest większa niż wartość prawego, to wyrażenie jest prawdziwe,
>>> 2 + 2 > 5 False >>> 5.0 > 4 True >>> >>> "e" > "f" False
<
- jeśli wartość lewego operandu jest mniejsza niż wartość prawego, to wyrażenie jest prawdziwe,
>>> 2 + 2 < 5 True >>> 5.0 < 4 False >>> >>> "e" < "f" True
>=
- jeśli wartość lewego operandu jest większa lub równa niż wartości prawego, to wyrażenie jest prawdziwe,
>>> 2 + 2 >= 5 False >>> 5.0 >= 5 True >>> >>> "e" >= "f" False
<=
- jeśli wartość lewego operandu jest mniejsza lub równa wartości prawego, to wyrażenie jest prawdziwe
>>> 2 + 2 < 5 True >>> 5.0 < 4 False >>> >>> "e" < "f" True
- specyficznym sposobem przyrównywania jest sprawdzenie, czy dwa obiekty są tożsame - czyli czy są tym samym obiektem. Służą do tego operatory
is
orazis not
.
>>> 19998889998 is 19998889997 + 1 False >>> 19998889998 == 19998889997 + 1 True
- Operator przypisania
=
ten operator przypisuje wartość prawego operandu do operandu lewego. Najczęstszym jego użyciem jest deklaracja zmiennych. Nową zmienną inicjujemy, zapamiętując pewną wartość pod nowo nadaną nazwą:nazwa = wartosc
Przyjmuje się pewną konwencję dla nazw zmiennych:
>>> x = 0 >>> X = 0 >>> zmienna = 0 # zalecane dla nazw modułów >>> ZMIENNA = 0 >>> pewna_zmienna = 0 # zalecane dla nazw funkcji i metod >>> PEWNA_ZMIENNA = 0 # zalecane dla stałych >>> pewnaZmienna = 0 # zmienne >>> PewnaZmienna = 0 # zalecane dla nazw klas
Nazwa powinna być słowem składającym się wyłącznie z liter łacińskich, cyfr i znaku podkreślenia, nie może rozpoczynać się cyfrą. Nazwa nie może też być słowem kluczowym języka Python. Nie może zawierać spacji. Jeszcze raz należy podkreślić, że wielkie i małe litery są w nazwach rozróżniane. Jedna wartość może być przypisana jednocześnie kilku zmiennym:
>>> x = y = z = 0 # Zero x, y i z >>> x 0 >>> y 0 >>> z 0
W innym wariancie można:
>>> u, v = 100, 200 >>> u 100 >>> v 200
w jednej instrukcji przypisać jedną wartość pierwszej zmiennej, a inną drugiej. Jest to bezpośrednie wykorzystanie nieco innego typu danych zwanego krotką. O nim powiemy w lekcji drugiej. Korzystając z tej konwencji można zamienić wartości między zmiennymi:
>>> u, v = 100, 200 >>> u, v = v, u >>> u 200 >>> v 100
Można zmiennej, modyfikować przypisaną wartość:
>>> x = 10 >>> x = x + 10 >>> x 20 >>> x = x * 2 >>> x 40
Aby usunąć przypisaną zmiennej wartość (niejednokrotnie w praktyce, usuwając przez to samą zmienną) należy odwołać się do funkcji
del
.>>> zmienna = 33.0 >>> zmienna 30.0 >>> del zmienna >>> zmienna Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'zmienna' is not defined
+=
operator ten przypisuje lewemu operandowi wartość sumy lewego i prawego
>>> k = 20 >>> l = 30 >>> k += l >>> k 50
-=
operator ten przypisuje lewemu operandowi wartość różnicy lewego i prawego
>>> k = 20 >>> l = 30 >>> k -= l >>> k -10
*=
operator ten przypisuje lewemu operandowi wartość iloczynu lewego i prawego
>>> k = 20 >>> l = 30 >>> k *= l >>> k 600
/=
operator ten przypisuje lewemu operandowi wartość ilorazu lewego i prawego
>>> k = 20.0 >>> l = 30.0 >>> k /= l >>> k 0.6666666666666666
Literały liczbowe¶
liczba_int = 2
liczba_float = 3.2
liczba_complex = 2.0 + 3.0j
Literały znakowe¶
str1 = ‘ala’
str2 = “ala”
str3 = ‘’’ala’’’
str4 = “””ala”””
Istnieje specjalna konstrukcja ciągu znaków zaczynająca i kończąca się
trzema cudzysłowami “””. Jest to ciąg znaków charakterystyczny dla
języka Python i może on ciągnąć się przez wiele linii. Odstępy użyte w
środku zostaną zachowane. Ponadto możemy w takim środowisku używać pojedynczych
apostrofów i cudzysłowów w zasadzie dowolnie. Przed literałem łańcuchowym
takim jak powyżej “ala ma kota” możemy użyć prefiksów r,u,b
. Oznaczają one
odpowiednio:
r
(raw, raw string literał) w tak oznaczonym literale łańcuchowym wszystkie znaki traktowane będą dosłownie, np. ukośnik wsteczny traktowany będzie jak zwykły ukośnik wsteczny np: r”ala ma kota”, r’sin to komenda LaTeX{}a’
u
(unicode) napis w Unikodzie np: u”ala ma kota”, u’zażółć gęślą jaźń’
b
napis w ASCII np: b”ala ma kota”, b’A quick brown fox jumps over the lazy dog’
Instrukcje wejścia i wyjścia¶
Instrukcja print¶
Formatowanie proste
>>> imie = ‘Ala’
>>> wiek = 13
>>> print imie, "ma", wiek, "lat"
>>> print "liczba pi =", 3.1415, "a jej kwadrat to", 3.1415 ** 2
oraz złożone (podobnie jak w C)
>>> print "%s ma %d lat" % (imie, wiek)
>>> print "liczba pi = %f, a jej kwadrat to %f" % (3.1415, 3.1415 * 3.1415)
lub w nowym (choć już nie takim nowym) typie, poprzez metodę format
>>> print '{0}, {1}, {2}'.format('a', 'b', 'c')
>>> print '{}, {}, {}'.format('a', 'b', 'c')
>>> print '{2}, {1}, {0}'.format('a', 'b', 'c')
>>> print '{2}, {1}, {0}'.format(*'abc')
>>> print '{0}{1}{0}'.format('abra', 'cad')
>>> print 'Coordinates: {latitude}, {longitude}'.format(latitude='37.24N', longitude='-115.81W')
Polecenie print drukuje na ekran ciąg znaków - wszystko, co zawarte jest
pomiędzy cudzysłowami (lub apostrofami). Pomiędzy nimi występują specjalne
znaki, zaczynające się od znaku %
. W ich miejsce podstawiane są odpowiednio
interpretowane wartości zmiennych (bądź literały) występujące za identycznym
znakiem, znajdującym się za ciągiem zawartym w cudzysłowach. Pierwsza wartość
z nawiasu podstawiana jest w miejsce pierwszego wystąpienia %f
.
Analogicznie druga wartość podstawiana jest w miejsce drugiego wystąpienia %f
.
Znak f
, występujący po procencie wymusza interpretację argumentu jako
liczby zmiennoprzecinkowej (float). Inne możliwe formatowania print
%s
ciąg znaków%d
liczba całkowita%0Nd
liczba całkowita poprzedzona zerami w taki sposób, że otrzymujemy N cyfr na wyjściu (pod warunkiem, że N ¡ liczby cyfr danej liczby)%f
liczba zmiennoprzecinkowa%e
notacja naukowa (e przy eksponencie)%E
notacja naukowa (E przy eksponencie)%g,%G
notacja dziesiątkowa%Xz
formatowanie liczby z do prawej dla pola o szerokościX
print "%31f" % 0.0123412
%-Xz
formatowanie liczby z do lewej dla pola o szerokościX
print "%-31f" % 0.0123412
%.Yz
formatowanie liczby zY
miejscami po przecinku%X.Yz
formatowanie liczby zY
miejscami po przecinku w polu o szerokościX
%%
znak procenta
Instrukcje input oraz raw_input¶
Pobranie wartości odbywa się za pośrednictwem jednej z dwóch funkcji:
raw_input(komunikat)
- wartość przekazana przez tę funkcję jest zawsze tekstem.>>> imie = raw_input("Jak masz na imię? ") Jak masz na imię? Marian >>> imie 'Marian'
input(komunikat)
- tekst wprowadzony przez użytkownika jest interpretowany, a typ wartości wynikowej jest ustalany w czasie interpretacji>>> x = input('Ile godzin ma doba? ') Ile godzin ma doba? 24 >>> print 'Doba ma', x, 'godziny' Dobra ma 24 godziny >>> x = input('Ile minut ma godzina? ') Ile minut ma godzina? 60.0 >>> print 'Godzina ma', x, 'minut.' godzina ma 60.0 minut.