Loeng 3: Ülevaade: andmetüübid ja operatorid, numbrisüsteemid, tehete ja avaldiste prioriteetsus; lausend def, if laused, voodiagramm, algoritm¶

Viimati uuendatud 21.09.2024.

Koodinäited¶

Pythoni sisseehitatud andmetüübid¶

  • None 'NoneType' — Tühimärk, null
  • Numbrid
    • Integer 'int' — Täisarv
    • Floats 'float' — Kümmnendmurdarv
    • Complex 'complex' — Kompleksarv
    • Boolean 'bool' — Tõeväärtus
  • Jadad
    • String 'str' — Sõne
    • List 'list' — List, loend
    • Tuple 'tuple' — Korteez, ennik
    • Range 'range' — Vahemik
  • Set 'set' — Hulk
  • Map — Kujutus
    • Dictionary 'dict' — Sõnastik

Andmetüüpidega seotud funktsioonid

Pythoni sisseehitatud andmetüüpe saab deklareerida/luua või teisi andmetüüpe muuta/teisendada soovitud andmetüübiks kasutades sisseehitatud funktsioone: int, float, complex, bool, str, list, tuple, range, set, dict. NB! Ära kasuta neid funktsiooninimesid enda loodud muutujate nimedena.

In [1]:
tpl = (1, 2, 3)
list(tpl)
Out[1]:
[1, 2, 3]
In [2]:
list('Hello')
Out[2]:
['H', 'e', 'l', 'l', 'o']
In [3]:
tuple([2, 3, 4])
Out[3]:
(2, 3, 4)
In [4]:
tuple('Hello')
Out[4]:
('H', 'e', 'l', 'l', 'o')
In [5]:
set('Hello')  # Unikaalsus ja järjestus.
Out[5]:
{'H', 'e', 'l', 'o'}
In [6]:
set([1, 1, 2, 2])  # Unikaalsus.
Out[6]:
{1, 2}
In [7]:
str(2)
Out[7]:
'2'
In [8]:
int(2.2)
Out[8]:
2
In [9]:
float(2)
Out[9]:
2.0

Tühimärk

In [10]:
a = None
print(a)
None

Andmetüübi järgivaatamiseks kasuta sisseehitatud funktsiooni type:

In [11]:
type(a)
Out[11]:
NoneType

Kompleksarvud

In [12]:
z = 2 + 4j
z
Out[12]:
(2+4j)
In [13]:
1j
Out[13]:
1j
In [14]:
z2 = (-2-3j)
z2
Out[14]:
(-2-3j)
In [15]:
z3 = complex(-1, -2)
z3
Out[15]:
(-1-2j)
In [16]:
z4 = complex(22)
z4
Out[16]:
(22+0j)
In [17]:
type(z)
Out[17]:
complex
No description has been provided for this image
Joonis 1: Programmeerimine Pythonis ja Pythoni programmi osad.
In [18]:
z.real  # Atribuut, argumendi sulud puuduvad: reaalosa.
Out[18]:
2.0
In [19]:
z.imag  # Atribuut: imaginaarosa.
Out[19]:
4.0
In [20]:
#dir(z)  # dir funktsioon väljastab seotud meetodid ja atribuudid.

Süntaksi erinevus atribuudi ja 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.

Booli tõeväärtus

Miks numbrite all? Omab numbrilist väärtust.

In [21]:
int(True)
Out[21]:
1
In [22]:
int(False)
Out[22]:
0
In [23]:
10 * False
Out[23]:
0
In [24]:
10 + True
Out[24]:
11
In [25]:
type(True)
Out[25]:
bool

Sisseehitatud funktsiooni bool kasutamine, triviaalne ja mittetriviaalne argument:

In [26]:
bool(1)  # Mittetriviaalne.
Out[26]:
True
In [27]:
bool('Python')  # Mittetriviaalne.
Out[27]:
True
In [28]:
bool([])  # Triviaalne.
Out[28]:
False
In [29]:
bool(0)  # Triviaalne.
Out[29]:
False

Vahemik

Sisseehitatud funktsioon range:

In [30]:
type(range(3))
Out[30]:
range
In [31]:
list(range(10))  # Algab 0-st ja lõpeb 10-ga (mittekaasaarvatud).
Out[31]:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
In [32]:
list(range(3, 10))
Out[32]:
[3, 4, 5, 6, 7, 8, 9]
In [33]:
list(range(3, 10, 2))  # NB! Ei toeta murdarvulist sammu.
Out[33]:
[3, 5, 7, 9]
In [34]:
list(range(10, 0, -2))  # Toetab negatiivset sammu.
Out[34]:
[10, 8, 6, 4, 2]

Pythoni operaatorid, ü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).

  • Assignment operators — omistuslaused: =, +=, -=, *=, /=, @=, %=, //=, **=, &=, |=, ^=, >>=, <<=, :=

    Mitme väärtuse samaaegne omistamine: x, y, z = 3, 5, 6, a, b, c = [1, 2, 3] jne.

  • 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: &, |, ^, ~, <<, >>

Omistuslaused ja operaatorid: += ja teised, :=¶

+= tähendus

In [35]:
x = 2
x = x + 1  # Võrdluseks, vt. alla.
x
Out[35]:
3
In [36]:
x += 1  # += kasutus: lühem kirjapilt.
x
Out[36]:
4

Morsa operaator :=

Kasutatakse muutujatele väärtuste omistamiseks teiste avaldiste sees, nii öelda samalt realt.

In [37]:
print(x := 'Python')  # Loob muutuja ja omistab väärtuse avaldiste sees.
Python

Võrdlus operaatorid: ==, !=, >, <, >=, <=¶

In [38]:
5 == 5  # On võrdne.
Out[38]:
True
In [39]:
5 != 2  # Mitte võrdne.
Out[39]:
True
In [40]:
2 > 5  # Suurem kui.
Out[40]:
False
In [41]:
2 < 5  # Väiksem kui.
Out[41]:
True
In [42]:
5 >= 5  # Suurem või võrdne.
Out[42]:
True
In [43]:
6 <= 5  # Väiksem või võrdne.
Out[43]:
False

Python luban võrrelda sama tüüpi jadasid. Võrdlemisel kasutatakse leksikograafilist järjestust (seda 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). NB! See teema pole eksami osa.

In [44]:
[1, 2, 3] == [1, 2, 3]  # Element-element haaval ja vasakult paremale.
Out[44]:
True
In [45]:
(1, 2, 3) != (1, 2, 4)
Out[45]:
True
In [46]:
(1, 2, 3) < (1, 2, 3, -1)
Out[46]:
True
In [47]:
(1, 2, 3) < (1, 2, 4)
Out[47]:
True
In [48]:
'ABC' < 'C' < 'Pascal' < 'Python'
Out[48]:
True
In [49]:
(1, 2, 3, 4) < (1, 2, 4)
Out[49]:
True
In [50]:
(1, 2) < (1, 2, -1)
Out[50]:
True
In [51]:
(1, 2, 3) == (1.0, 2.0, 3.0)
Out[51]:
True
In [52]:
(1, 2, ('aa', 'ab')) < (1, 2, ('abc', 'a'), 4)
Out[52]:
True

Loogika tehtemärgid: and ja or¶

True = 1 või mittetriviaalsed andmetüübid (nt. mittetühi list, jt.).

False = 0 või triviaalsed andmetüübid (nt. tühi list, None, jt.).

Tehtemärgi and tõeväärtustabel:

x y Tulem: x and y
0 0 0
0 1 0
1 0 0
1 1 1
In [53]:
True and True
Out[53]:
True
In [54]:
True and False
Out[54]:
False
In [55]:
False and False
Out[55]:
False
In [56]:
1 and 1
Out[56]:
1
In [57]:
1 and 0
Out[57]:
0

Tehtemärgi or tõeväärtustabel:

x y Tulem: x or y
0 0 0
0 1 1
1 0 1
1 1 1
In [58]:
True or True
Out[58]:
True
In [59]:
True or False
Out[59]:
True
In [60]:
False or False
Out[60]:
False
In [61]:
1 or 1
Out[61]:
1
In [62]:
1 or 0
Out[62]:
1

Lausend not tähistab eitust:

In [63]:
not True
Out[63]:
False
In [64]:
not False
Out[64]:
True

Identiteedi operaatorid: is, is not¶

Kontrollib kas objektid jagavad sama mälukohta (aadressi).

In [65]:
x, y = 1000, 1000
x is y  # Kaks muutujat viitavad samale väärtusele.
Out[65]:
True

Kontrollime saadud tulemust kasutades sisseehitatud funktsiooni id.

In [66]:
id(x)  # Funktsioon mis tagastab argumendi identiteedi.
Out[66]:
4393474288
In [67]:
id(y)
Out[67]:
4393474288

Lausendi not kasutamine antud kontekstis:

In [68]:
x, y = 500, 500
x is not y
Out[68]:
False

Koosseisu operaatorid: in, not in¶

Kontrollib kas andmetüübi objekt sisaldab elementi.

In [69]:
s = 'Python'
'P' in s
Out[69]:
True
In [70]:
'hon' in s
Out[70]:
True
In [71]:
33 in [1, 2, 3]
Out[71]:
False

Lausendi not kasutamine antud kontekstis:

In [72]:
'Q' not in [1, 2, 3, 4]
Out[72]:
True

Numbrisüsteemid¶

Erinevate numbrite esitamine ja numbrisüsteemide vahelised 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.

In [73]:
a = 7
bin(a)  # Binaarsüsteemi arv, kahendsüsteem.
Out[73]:
'0b111'
In [74]:
oct(a)  # Kaheksandsüsteemi arv.
Out[74]:
'0o7'
In [75]:
a  # Kümnendsüsteemi arv, detsimaalsüsteem.
Out[75]:
7
In [76]:
hex(a)  # Kuueteistkümnendiksüsteemi arv.
Out[76]:
'0x7'

Lisaks saame deklareerida ja opereerida erinevate süsteemide arvudega järgmiselt:

In [77]:
0b010010110101  # Binaarsüsteemi arv.
Out[77]:
1205
In [78]:
0o123  # Kaheksandsüsteemi arv.
Out[78]:
83
In [79]:
23  # Kümnendsüsteemi arv.
Out[79]:
23
In [80]:
0x121b  # Kuueteistkümnendiksüsteemi arv.
Out[80]:
4635
In [81]:
0b01001 + 0b01001  # Proovi ka teisi operaatoreid.
Out[81]:
18
In [82]:
0x121b / 0b01011  # Segatehe.
Out[82]:
421.3636363636364
In [83]:
oct(0x121b)  # Süsteemide vaheline teisendus.
Out[83]:
'0o11033'

Bitioperatsioonide operaatorid: &, |, ^, ~, <<, >>¶

Binaarne süsteem:

No description has been provided for this image
Joonis 2: Kümnendsüsteemi arv 6 kahendsüsteemis (neljabitine esitus).

biti JA - bitwise and: & Siin rakendame and tõeväärtustabelit binaarsete arvude vastavatele bittidele paarikaupa.

No description has been provided for this image
Joonis 3: 5 & 3 = 1.
In [84]:
bin(0b0101 & 0b0011)
Out[84]:
'0b1'
In [85]:
5 & 3
Out[85]:
1

biti VÕI - bitwise or: | Siin rakendame or tõeväärtustabelit binaarsete arvude vastavatele bittidele paarikaupa.

No description has been provided for this image
Joonis 4: 5 | 3 = 7.
In [86]:
bin(0b0101 | 0b0011)
Out[86]:
'0b111'
In [87]:
5 | 3
Out[87]:
7

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:

No description has been provided for this image
Joonis 5: 5 ^ 3 = 6.
In [88]:
bin(0b0101 ^ 0b0011)
Out[88]:
'0b110'
In [89]:
5 ^ 3
Out[89]:
6

Täiend - complement: ~, bitwise NOT, bitwise inversion Muudame arvu bitiväärtused vastupidisteks.

No description has been provided for this image
Joonis 6: ~6 = -7. Negatiivsete kümnendarvude binaarne esitus erineb positiivsete omast.

Seos kümnendsüsteemiga: ~x = -x - 1, kus x on täisarv.

In [90]:
bin(~0b0110)  # Negatiivsete arvude bin. representatsioon erineb eelmainitust.
Out[90]:
'-0b111'
In [91]:
~6
Out[91]:
-7

Binaarne nihe vasakule - binary shift: <<

No description has been provided for this image
Joonis 7: 6 << 1 = 12.

Seos kümnendsüsteemiga: $x << n = 2^n x$, kus $x$ ja $n$ on täisarvud.

In [92]:
bin(0b0110 << 1)  # 1d nihkuvad vasakule.
Out[92]:
'0b1100'
In [93]:
6 << 1
Out[93]:
12

Binaarne nihe paremale - binary shift: >>

No description has been provided for this image
Joonis 8: 6 >> 1 = 3.

Seos kümnendsüsteemiga: $x >> n = x / 2^n$, kus $x$ ja $n$ on täisarvud.

In [94]:
bin(0b0110 >> 1)
Out[94]:
'0b11'
In [95]:
6 >> 1
Out[95]:
3

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

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)

Funktsioonid: lausend def ja konstruktsioon def-return¶

Pythoni funktsioon (protseduur) on alamprotseduur (subroutine). Funktsiooni saab taaskasutada. Funktsioon defineerib reeglite kogumi mis seob argumendi/argumentide väärtused funktsiooni väärtusega/väärtustega. Argumendina võetakse vastu kõiki andmetüüpe. Pythoni funktsiooni defineerime kasutades lausendit def. Funktsiooni koosseisu kuuluv kood eristatakse taande abil.

In [96]:
def name():                # PEP8: Väikse tähaega nimi, kirjeldav.
    print('Hello World!')  # NB! TAANE.

name()                     # Funktsiooni/protseduuri väljakutse.
Hello World!
In [97]:
def function_name(argument):
    print(argument)

arg = 'Hello World!'
    
function_name(arg)
Hello World!
In [98]:
def function2(argument, argument2):
    print(argument, argument2)
    
arg = 'Hello'
    
function2(arg, 'World!')
Hello World!

Konkreetse tulemuse või tulemuste (erista komaga) väljastamiseks kasutame lausendit return.

In [99]:
def function3():
    return 2 + 5

function3()
Out[99]:
7
In [100]:
def function4():
    result = 2 + 5
    return result, 77  # Kaks väljundit.

function4()  # Vaikimisi väljastati tulemused ennikusse.
Out[100]:
(7, 77)
In [101]:
def my_summation(a, b, c):
    return a + b + c

my_summation(4, 5, 6)
Out[101]:
15

Tulevastes loengutes laiendame funktsiooni argumendi mõistet. Pythoni funktsioonid ja protseduurid toetavad erinevat tüüpi argumente.

Kuidas eristada funktsiooni protseduurist? Kui kasutame lausendit return siis eelistatakse nime funktsioon ja kui see puudub eelistame nime protseduur.

Funktsiooni 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.

In [102]:
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/zj/x7zjlmt54ds1474pvcr76vk80000gn/T/ipykernel_2864/4122679038.py
Type:      function
In [103]:
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

# Või help(my_summation)
my_summation?
Signature: my_summation(a, b, c)
Docstring:
Function that calculated sum of 3 numbers.

Additional info on arguments a, b, and c.
Returns a number (integer, float, complex)
File:      /var/folders/zj/x7zjlmt54ds1474pvcr76vk80000gn/T/ipykernel_2864/1939052527.py
Type:      function

Docstringi lugemiseks võid ka vajutada: Shift+Tab.

Lausendid ja konstruktsioonid: if, if-else ja if-elif-else¶

Tingimuslausete abil saame juhtida programmi käitumist sõltuvalt booli tõeväärtustehete tulemustele.

No description has been provided for this image
Joonis 9: Neli põhilist vooskeemi kuju: ovaal, rööpkülik, nelinurk ja romb.

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.

if blokk¶

No description has been provided for this image
Joonis 10: If bloki vooskeem.
In [104]:
if True:                          # Tingimuslause
    print('Tingimus rahuldatud')  # Tegevus, NB! TAANE.
Tingimus rahuldatud
In [105]:
if False:
    print('Tingimus rahuldatud')

if-else blokk¶

No description has been provided for this image
Joonis 11: If-else bloki vooskeem.
In [106]:
if True:  # Sama mis not False.
    print('Tegevus 1')
else:
    print('Tegevus 2')
Tegevus 1
In [107]:
if False:  # not True
    print('Tegevus 1')
else:
    print('Tegevus 2')
Tegevus 2

if-elif-else blokk/konstruktsioon¶

No description has been provided for this image
Joonis 12: If-elif-else bloki vooskeem.
In [108]:
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.

if bloki näiteid¶

In [109]:
if 4 < 5 and 3 < 6:
    print('Mõlemad tingimused.')
else:
    print('Vähemalt üks tingimus.')
Mõlemad tingimused.
In [110]:
if len('Python') == 6:  # Funktioon len loendab jada elemendid.
    print('Kuus tähte.')
Kuus tähte.
In [111]:
num = 6
if num % 2 == 0:
    print(f'{num} on paaris.')
else:
    print(f'{num} on paaritu.')
6 on paaris.

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.

















☻   ☻   ☻