1 Pythoni sisseehitatud andmetüübid¶
1.1 Ülevaade¶
Pythoni sisseehitatud andmetüübid saab grupeerida järgmiselt:
- None
'NoneType'— Tühimärk, null - Numbrid
- Integer
'int'— Täisarv - Floats
'float'— Kümmnendmurdarv - Complex
'complex'— Kompleksarv - Boolean
'bool'— Tõeväärtus
- Integer
- Jadad
- String
'str'— Sõne - List
'list'— List, loend - Tuple
'tuple'— Korteež, ennik - Range
'range'— Vahemik
- String
- Set
'set'— Hulk - Map — Kujutus
- Dictionary
'dict'— Sõnastik
- Dictionary
1.2 Andmetüüpidega seotud konstruktorfunktsioonid¶
Pythoni sisseehitatud andmetüüpide objekte saab deklareerida/defineerida/luua ja teiste andmetüüpide objekte muuta/teisendada soovitud andmetüübi objektiks kasutades sisseehitatud funktsioone: int, float, complex, bool, str, list, tuple, range, set, dict.
Hoiatus: NB! Ära kasuta eelmainitud funktsiooninimesid enda loodud muutujate nimedena. Seda tehes kirjutad funktsiooni üle.
numbrid = 1, 2, 3 # Andmetüüp on korteež.
minu_list = list(numbrid) # Defineerin listi.
minu_list
[1, 2, 3]
tpl = (1, 2, 3)
list(tpl) # Teisendasime korteeži listiks.
[1, 2, 3]
list('Hello')
['H', 'e', 'l', 'l', 'o']
tuple([2, 3, 4])
(2, 3, 4)
tuple('Hello')
('H', 'e', 'l', 'l', 'o')
set('Hello') # Unikaalsus ja järjestuse puudumine.
{'H', 'e', 'l', 'o'}
set([1, 1, 2, 2]) # Unikaalsus.
{1, 2}
str(2)
'2'
int(2.8888) # NB! Ümardamist ei toimu.
2
float(2)
2.0
a = None
print(a)
None
Andmetüübi järgivaatamiseks kasuta sisseehitatud funktsiooni type:
type(a)
NoneType
print(type(a))
<class 'NoneType'>
Nime class kasutatakse siin kategooria (andmetüübi) tähenduses.
1.3.2 Kompleksarvud¶
z = (-2-3j)
z
(-2-3j)
z2 = 2.0 + 4.0j
z2
(2+4j)
1j
1j
z3 = 2.1 + 4.1 * 1j # Toetab ka süntaksit 1J.
z3
(2.1+4.1j)
z4 = complex(-1, -2) # Konstruktorfunktsioon.
z4
(-1-2j)
z5 = complex(22)
z5
(22+0j)
type(z)
complex
| Joonis 1: Programmeerimine Pythonis ja Pythoni programmi osad. |
Kompleksarvu reaal- ja imaginaarosa saab järgi vaadata järgmiselt:
z = (2-4j)
z.real # Objektimuutuja ehk atribuut. NB! Argumendi sulud puuduvad: reaalosa.
2.0
z.imag # Objektimuutuja ehk atribuut: imaginaarosa.
-4.0
#dir(z) # Funktsioon dir väljastab seotud meetodid ja ka atribuudid.
Süntaksi erinevus objektimuutuja ehk atribuudi (sarnaselt ka klassimuutuja) ja objekti meetodi vahel on järgmine. (Üldjuhul) meetodi nimele järgnevad argumendi sulud koos või ilma argumentideta ja atribuutidel sulud puuduvad kuna argumente pole võimalik atribuudile edastada.
Leia Jooniselt 1 objekti- ja klassimuutujad ning klassid (klassid defineerivad andmetüüpe).
1.3.3 Booli tõeväärtus¶
Booli tõeväärtusi on kaks: tõene (True) ja väär (False). Miks numbrite all? Omab numbrilist väärtust.
int(True) # Teisendan täisarvuks, et näha numbrilist väärtust.
1
int(False)
0
10 * False
0
10 + True
11
muutuja = True
print(type(muutuja), type(False))
<class 'bool'> <class 'bool'>
Sisseehitatud funktsiooni bool kasutamine, triviaalne ja mittetriviaalne argumendi väärtus:
bool(1) # Mittetriviaalne.
True
bool('Python') # Mittetriviaalne.
True
bool([]) # Triviaalne.
False
bool(0) # Triviaalne.
False
1.3.4 Vahemik¶
Sisseehitatud funktsioon range:
type(range(3))
range
list(range(10)) # Algab 0-st ja lõpeb 10-ga (mitte kaasa arvatud).
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
list(range(3, 10))
[3, 4, 5, 6, 7, 8, 9]
list(range(3, 10, 2)) # NB! Ei toeta murdarvulist sammu.
[3, 5, 7, 9]
list(range(10, 0, -2)) # Toetab negatiivset sammu.
[10, 8, 6, 4, 2]
2 Pythoni operaatorid¶
2.1 Ülevaade¶
- Arithmetic operators — aritmeetika operaatorid (tehtemärgid):
+,-,*,/,@,%,//- Operaatorit
-kasutame ka muutuja märgi muutmiseks:a = 3, siis-a = -3. - Maatrikskorrutis
@ei tööta ühegi Pythoni andmetüübiga (loodud kolmandate osapoolte teekides kasutamiseks).
- Operaatorit
- Assignment operators — omistuslaused:
=,+=,-=,*=,/=,@=,%=,//=,**=,&=,|=,^=,>>=,<<=,:=- Mitme väärtuse samaaegne omistamine:
x, y = 3, 5,a, b, c = [1, 2, 3],d = e = 4, jne.
- Mitme väärtuse samaaegne omistamine:
- Comparison operators — võrdlus operaatorid:
==,!=,>,<,>=,<= - Logical operators — loogika tehtemärgid:
and,or,not - Identity operators — identiteedi operaatorid:
is,is not - Membership operators — koosseisu operaatorid:
in,not in - Bitwise operators — bitioperatsioonide operaatorid:
&,|,^,~,<<,>>
2.1.1 Omistuslaused ja operaatorid: +=, *=, jne., := ning teised¶
Operaatori += tähendus:
x = 2
x = x + 1 # Võrdluseks, vt. alla.
x
3
x += 1 # Operaatori += kasutus: lühem kirjapilt.
x
4
x -= 1 # Operaatori -= kasutus: lühem kirjapilt.
x
3
Operaatori := tähendus. Seda operaatorit nimetatakse morsa operaatoriks. Kasutatakse muutujatele väärtuste omistamiseks teiste avaldiste sees, nii-öelda samalt realt.
print(x := 'Python') # Loob muutuja ja omistab väärtuse argumendi sulgude sees.
Python
2.1.2 Võrdlus operaatorid: ==, !=, >, <, >=, <=¶
5 == 5 # On võrdne.
True
5 != 2 # Mitte võrdne.
True
2 > 5 # Suurem kui.
False
2 < 5 # Väiksem kui.
True
5 >= 5 # Suurem või võrdne.
True
6 <= 5 # Väiksem või võrdne.
False
Python luban võrrelda sama tüüpi jadasid. Võrdlemisel kasutatakse leksikograafilist järjestust (see teemat eksamile ei tule). Eriveva pikkusega jadade võrdlemisel peetakse lühemat (ja võrdset) jada väiksemaks. Sõnede sümolite korral võrreldakse nende kodeeringu ordinaale (sisseehitatud funktsiooniga ord järgi vaadatav).
Märkus: NB! See teema pole eksami osa.
[1, 2, 3] == [1, 2, 3] # Element-element haaval ja vasakult paremale.
True
(1, 2, 3) != (1, 2, 4)
True
(1, 2, 3) < (1, 2, 3, -1)
True
(1, 2, 3) < (1, 2, 4)
True
'ABC' < 'C' < 'Pascal' < 'Python'
True
(1, 2, 3, 4) < (1, 2, 4)
True
(1, 2) < (1, 2, -1)
True
(1, 2, 3) == (1.0, 2.0, 3.0)
True
(1, 2, ('aa', 'ab')) < (1, 2, ('abc', 'a'), 4)
True
2.1.3 Loogika tehtemärgid: and ja or¶
Operaatoreid paigutame lisaks booli tõeväärtust tagastavete tehete, lausete ja avaldiste vahele, ka booli tõeväärtust omavate objektide vahel:
True=1või mittetriviaalsed andmetüübide väärtused (nt. mittetühi list, jt.).False=0või triviaalsed andmetüübide väärtused (nt. tühi list,None, jt.).
Allolevas tabelis on lisatud tehtemärgi ehk operaatori and tõeväärtustabel.
| x | y | Tulem: x and y |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
True and True
True
True and False
False
False and False
False
1 and 1
1
1 and 0
0
Allolevas tabelis on näidatud tehtemärgi or tõeväärtustabel.
| x | y | Tulem: x or y |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
True or True
True
True or False
True
False or False
False
1 or 1
1
1 or 0
1
Lausend not tähistab eitust:
not True
False
not False
True
2.1.4 Identiteedi operaatorid: is, is not¶
Kontrollib kas objektid jagavad sama mälukohta (aadressi).
x, y = 1000, 1000
x is y # Kaks muutujat viitavad samale väärtusele.
True
x = y = 1000
x is y # Kaks muutujat viitavad samale väärtusele.
True
Kontrollime saadud tulemust kasutades sisseehitatud funktsiooni id.
print(id(x), id(y), id(x) - id(y)) # Funktsioon mis tagastab argumendi identiteedi.
4423311856 4423311856 0
Lausendi not kasutamine antud kontekstis:
x is not y
False
2.1.5 Koosseisu operaatorid: in, not in¶
Kontrollib kas andmetüübi objekt sisaldab elementi.
s = 'Python'
'P' in s
True
'hon' in s
True
33 in [1, 2, 3]
False
Lausendi not kasutamine antud kontekstis:
'Q' not in [1, 2, 3, 4]
True
3 Numbrisüsteemid ja nendega seotud operaatorid¶
3.1 Erinevate numbrisüsteemide numbrite esitus ja nendevahelised teisendused¶
Pythoni standardteek toetab kahend- või binaar-, kaheksand-, kümmnend-, ja kuueteistkümnendiksüsteeme. Sisseehitatud funktsioonide bin, oct ja hex abil deklareerime või teisendame arve kahendsüsteemi arvuks, kaheksandiksüsteemi arvuks ja kuueteistkümnendiksüsteemi arvuks.
a = 7
bin(a) # Binaarsüsteemi ehk kahendsüsteemi arv.
'0b111'
oct(a) # Kaheksandsüsteemi arv.
'0o7'
a # Kümnendsüsteemi ehk detsimaalsüsteemi arv.
7
hex(a) # Kuueteistkümnendiksüsteemi arv.
'0x7'
Lisaks saame deklareerida ja opereerida erinevate süsteemide arvudega järgmiselt:
0b010010110101 # Binaarsüsteemi arv.
1205
0o123 # Kaheksandsüsteemi arv.
83
23 # Kümnendsüsteemi arv.
23
0x121b # Kuueteistkümnendiksüsteemi arv.
4635
0b01001 + 0b01001 # Proovi ka teisi operaatoreid.
18
0x121b / 0b01011 # Segatehe.
421.3636363636364
oct(0x121b) # Süsteemide vaheline teisendus.
'0o11033'
3.2.2 biti JA - bitwise and: &¶
Siin rakendame and tõeväärtustabelit (esitatud eespool) binaarsete arvude vastavatele bittidele paarikaupa.
Joonis 3: Tehte esitus kümnendsüsteemis 5 & 3 = 1. |
bin(0b0101 & 0b0011)
'0b1'
5 & 3
1
3.2.3 biti VÕI - bitwise or: |¶
Siin rakendame or tõeväärtustabelit (esitatud eespool) binaarsete arvude vastavatele bittidele paarikaupa.
Joonis 4: Tehte esitus kümnendsüsteemis 5 | 3 = 7. |
bin(0b0101 | 0b0011)
'0b111'
5 | 3
7
3.2.4 biti välistav VÕI - bitwise xor (exclusive or): ^¶
Tehtemärgi ^ tõeväärtustabel:
Allolevas tabelis on $0$ ja $1$ arvude $P$ ja $Q$ bittide väärtused.
| P bitt | Q bitt | Tulem |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
Näide kus $P = 0101_2 = 5_{10}$ ja $Q = 0011_2 = 3_{10}$:
Joonis 5: Tehe esitatuna kümnendsüsteemis $P$ ^ $Q = 6$ ehk 5 ^ 3 = 6. |
P = 0b0101
Q = 0b0011
bin(P ^ Q)
'0b110'
P = 5
Q = 3
P ^ Q
6
3.2.5 Täiend - complement: ~, bitwise NOT, bitwise inversion¶
Operaator muudab sellele järgneva arvu bitiväärtused vastupidisteks.
Joonis 6: Tehte esitus kümnendsüsteemis ~6 = -7. Negatiivsete kümnendarvude binaarne esitus erineb positiivsete omast. |
Seos kümnendsüsteemiga: ~x = -x - 1, kus x on täisarv.
bin(~0b0110) # Negatiivsete arvude bin. representatsioon erineb eelmainitust.
'-0b111'
~6
-7
3.2.6 Binaarne nihe vasakule - binary shift: <<¶
Operaator nihutab arvu bitid täisarv $n$ kohti vasakule.
Joonis 7: Tehte esitus kümnendsüsteemis 6 << 1 = 12, bitid nihestati 1 koha võrra vasakule. |
Seos kümnendsüsteemiga: $x << n = 2^n x$, kus arv $x$ ja nihe $n$ on täisarvud.
bin(0b0110 << 1) # 1d nihkuvad vasakule.
'0b1100'
6 << 1
12
3.2.7 Binaarne nihe paremale - binary shift: >>¶
Operaator nihutab arvu bitid täisarv $n$ kohti paremale.
Joonis 8: Tehte esitus kümnendsüsteemis 6 >> 1 = 3, bitid nihestati 1 koha võrra paremale. |
Seos kümnendsüsteemiga: $x >> n = x / 2^n$, kus arv $x$ ja nihe $n$ on täisarvud.
bin(0b0110 >> 1)
'0b11'
6 >> 1
3
4 Tehete ja avaldiste prioriteetsus¶
- Tehete aritmeetiline prioriteetsus määrab ära nende rakendamise järjekorra
- Prioriteetust saab hallata kasutades sulge
() - Võrdse prioriteetsuse korral määrab tehete tulemuse tehete järjekord, reeglina vasakult paremale, näiteks:
expr1, expr2, expr3, expr4
(expr1, expr2, expr3, expr4)
{expr1: expr2, expr3: expr4}
expr1 + expr2 * (expr3 - expr4)
expr1(expr2, expr3, *expr4, **expr5)
expr3, expr4 = expr1, expr2
Erand: Astendamise leidmise järjekord on paremalt vasakule. Näide:
a = 2**3**5 != (2**3)**5
Lisainfo: https://docs.python.org/3/reference/expressions.html#
Allolev tabel näitab kõigi Pythoni operaatorite ja avaldiste prioriteetsuse hierarhiat.
| Tehe, operaator, avaldis | Operatsioon |
|---|---|
(expressions...), [expressions...], key: value..., expressions... |
avaldised (konstruktorid) |
x[index], x[index:index], x(arguments...), x.attribute |
indekseerimine, funktsiooni väljakutsumine, atribuut |
await x |
võtmesõna await (ei käsitle) |
** |
astendamine |
+x, -x, ~x |
positiivne, negatiivne, biti NOT (täiend) |
*, @, /, //, % |
korrutamine, maatriksite korrutamine, jagamine, jääk |
+, - |
liitmine, lahutamine |
<<,>> |
biti nihked |
& |
bititehte AND |
^ |
bititehte XOR |
\| |
bititehte OR |
in, not in, is, is not, <, <=, >, >=, !=, == |
võrdlused, samasused, sisaldavused |
not x |
tõeväärtuslik MITTE |
and |
tõeväärtuslik JA |
or |
tõeväärtuslik VÕI |
if-else |
if tingimus avaldis |
lambda |
anonüümne funktsioon |
:= |
omistus avaldis (morsa operaator) |
5 Funktsioonid, enda kirjutatud¶
5.1 Lausend def ja konstruktsioon def-return¶
Pythoni funktsioon on alamprotseduur (subroutine) mida saab taaskasutada. Pythoni funktsioon on sarnane matemaatika tunnist tuntud funktsioonidega. Funktsioon on eeskiri või reeglite kogum mis seob valitud eeldused ja sisendid funktsiooni väljundiga, väljunditega või mingi tegevusega. Pythoni funktsioon võib omada argumente või mitte. Funktsioon saab argumendina vastu võtta kõiki Pythoni sisseehitatud ja muid objekte.
Laias laastus saab Pythoni funktsioone jagada kaheks:
- Funktsioonid mis väljastavad väärtuse või väärtusi (amdmetüübi objekti väärtusi) ja
- funktsioonid mis ei väljasta midagi vaid teostavad mingi tegevuse.
Pythoni funktsiooni defineerime kasutades lausendit def. Funktsiooni koosseisu kuuluv kood eristatakse taande abil. Taane defineerib nn. def bloki. Funktsiooni koodi sees saame teostada teiste funktsioonide väljakutseid.
def name(): # PEP8: Väikse tähaega nimi, kirjeldav.
print('Hello World!') # NB! TAANE.
name() # Funktsiooni/protseduuri väljakutse.
Hello World!
def function_name(argument):
print(argument) # Muutuja argument kehtib lokaalselt funktsiooni sees.
arg = 'Hello World!'
function_name(arg)
Hello World!
def function2(argument, argument2):
name() # Eelnevalt defineeritud funktsioon.
print(argument, argument2)
arg = 'Hello'
function2(arg, 'World!')
Hello World! Hello World!
Konkreetse tulemuse või tulemuste (erista komaga) väljastamiseks kasutame lausendit return. Lausendi return interpreteerimisel loetakse funktsioon töö tehtuks.
def function3():
return 2 + 5
function3()
7
def function4():
result = 2 + 5 # Muutuja on lokaalne.
return result, 77 # Kaks väljundit.
function4() # Vaikimisi väljastati tulemused ennikusse.
(7, 77)
def my_summation(a, b, c):
return a + b + c
summa = my_summation(4, 5, 6)
summa
15
Tulevastes loengutes laiendame funktsiooni argumendi mõistet. Pythoni funktsioonid toetavad erinevat tüüpi argumente.
Mõned autorid eristavad funktsioone mis väljastavad väärtusi nendest mis ei väljasta. Nimetades viimaseid protseduuriks. Seega kui funktsiooni defineerimisel kasutatakse lausendit return siis eelistatakse nime funktsioon ja kui see puudub siis eelistatakse nime protseduur.
5.2 Funktsiooni dokumentatsioon ja abiinfo (DocString)¶
DocString või docstring on inimloetav dokumentatsioon mida saame loodud funktsioonile lisada. See aitab programmi kasutajatel, k.a. sind ennast, sinu enda loodud funktsioone paremini taaskasutada. Docstring kirjutatakse alati kolme jutumärgi vahele olenemata sellest kas see on üherealine või mitmerealine. Docstringi vormistamise, hea tava ja soovituste kohta loe lisaks PEP 257.
def summation(a, b):
"""This is a quick summary.""" # Minimaalne näide.
return a + b
summation?
Signature: summation(a, b) Docstring: This is a quick summary. File: /var/folders/6f/s4mf78z90cb953k7l1fgw8mh0000gn/T/ipykernel_37574/4122679038.py Type: function
def my_summation(a, b, c):
'''Function that calculated sum of 3 numbers.
Additional info on arguments a, b, and c.
Returns a number (integer, float, complex)
'''
return a + b + c
help(my_summation)
Help on function my_summation in module __main__:
my_summation(a, b, c)
Function that calculated sum of 3 numbers.
Additional info on arguments a, b, and c.
Returns a number (integer, float, complex)
Docstringi lugemiseks võid ka vajutada: Shift+Tab.
6 Tingimuslaused ja programmivoo juhtimine¶
6.1 Lausendid ja konstruktsioonid: if, if-else ja if-elif-else¶
Tingimuslausete abil saame juhtida programmi käitumist sõltuvalt booli tõeväärtustehete tulemustele.
| Joonis 9: Neli põhilist vooskeemi elemendi mida kujutatake kasutades ovaali, rööpkülikut, nelinurka ja rombi ning nenede tähendused. |
Vooskeem või voodiagramm on programmis esinevate juhiste jada graafiline esitus. Diagrammi koostamisel kasutatakse neli põhilist kujundit millel on kindel tähendus. Need kujundid on kujutatud Joonisel 9. Nooled ühendavad põhikujundeid vooskeemis. Vooskeemi kujundid ja nooled kirjeldavad programmi kulgu selle algolekust lõppolekuni.
6.1.1 if blokk¶
Joonis 10: If bloki vooskeem. |
if True: # Tingimuslause siia.
print('Tingimus rahuldatud') # Tegevus, NB! TAANE.
Tingimus rahuldatud
if False:
print('Tingimus rahuldatud')
6.1.2 if-else blokk¶
Joonis 11: If-else bloki vooskeem. |
if True: # Sama mis not False.
print('Tegevus 1')
else:
print('Tegevus 2')
Tegevus 1
if False: # not True
print('Tegevus 1')
else:
print('Tegevus 2')
Tegevus 2
6.1.3 if-elif-else blokk/konstruktsioon¶
Joonis 12: If-elif-else bloki vooskeem. |
if False:
print('Tegevus 1')
elif False:
print('Tegevus 2')
elif True:
print('Tegevus 3') # Soovitud valik.
else:
print('Tegevus 4')
Tegevus 3
NB! Peale konkreetse elif lausendiga seotud tegevuse teostust ülejäänuid elif tingimuslauseid (alumisi) enam ei kontrollita, vt. Joonis 12.
6.1.4 if bloki näiteid¶
if 4 < 5 and 3 < 6:
print('Mõlemad tingimused.')
else:
print('Vähemalt üks tingimus.')
Mõlemad tingimused.
if len('Python') == 6: # Funktsioon len leiab erinevate jadade elemendid.
print('Kuus tähte.')
Kuus tähte.
num = 6
if num % 2 == 0:
print(f'{num} on paaris.')
else:
print(f'{num} on paaritu.')
6 on paaris.
7 Algoritmi mõiste¶
Algoritm ( = lahenduseeskiri) on fikseeritud juhiste jada, millega teisendatakse algoritmi sisendandmed algoritmi väljundandmeteks. Algoritmi esitatakse kas juhiste loendina või graafiliselt kasutades voodiagrammi. Algoritmi rakendatakse probleemi lahendamiseks.