Lihtandmetüübid ja muutujad

From Wikiversity

< 2. nädala teemad

Muutuja (ingl variable) on programmeerijale antud väga võimas abivahend, millega programmi töö jooksul igasuguseid väärtusi ja andmeid meeles pidadada ning nendega arvutada. Muutujaga on seotud mitu iseloomustavat näitajat: nimi, aadress, andmetüüp ja väärtus. Lihtsamalt võib mõelda ka nii, et muutuja on nimi, mis viitab väärtusele.

Nimi

Nime abil saab programmeerija muutujaga „suhelda“, st muutujasse väärtust kirjutada (omistada) või seal hoitavat väärtust küsida-kasutada. Nime kaudu suhtleb programmeerija tegelikult arvuti muutmälus (operatiivmälus, RAM) olevate mälupesadega, kus muutuja väärtust programmi töö vältel hoitakse. Muutuja nime ja tema asukoha (mälupesa aadessi) vahelised seoed tekitatakse siis, kui konkreetne muutuja kasutusele võetakse (sõltuvalt programmeerimiskeelest, kas muutuja deklareeritakse või talle väärtus omistatakse).

Aadress

Tegelikult paikneb muutuja väärtus programmi töö ajal arvuti muutmälus muutujale eraldatud mälupesades. Mitmetes programmeerimiskeeltes on võimalik ka aadressi kaudu muutuja väärtusele ligi pääseda, kuid see on üsna ebaturvaline lähenemine, eriti algajal, kes täpselt ise ka ei tea, mida ta teeb. Mõistlikum on nime ja aadressi vahelise seose „meeles pidamine“ jätta arvuti hooleks.

Andmetüüp

Programmi abil töödeldavad andmed on erinevat tüüpi. Üldisema jaotusena võiks välja tuua tekstandmed ja arvandmed. Kui eesmärgiks on arvutada, tuleb kasutada arvandmeid; kui aga tekste meeles pidada ja nendega mingeid operatsioone teha, siis on tegemist tekstiliste andmete ehk stringidega. Kui muutuja luuakse, siis otsustatakse ka ära, mis tüüpi see muutuja olema saab (arv, tekst). Sellest aga omakorda oleneb, mida vastava muutujaga teha saab. Täpsem andmetüüpide valik sõltub juba konkreetsest programmeerimiskeelest.

Lihtandmetüüp

Lihtandmetüüpi muutujas saab korraga hoida ühte väärtust. Muutujale uue väärtuse omistamisel eelmine väärtus kaob (võrdluseks - eksisteerivad ka struktuursed andmetüübid ning vastavat tüüpi muutujad, kus korraga mitut väärtust talletada saab, aga nendest edaspidi).

Pythoni lihtandmetüübid jaotatakse tekstandmeteks (string) ja arvandmeteks. Arvulised andmetübid omakorda jagunevad järgmiselt:

  • int (signed integer) - täisarv (muutujas saab talletada arve, millel puuduvad komakohad: näiteks 15)
  • float (floating point real number) - ujukomaarv (muutujas saab talletada arve, millel võivad olla, kuid ei pea olema komakohad: näiteks 3.14, 15.0)
  • bool (boolean value) - loogikaväärtus (täisarvu erijuht, kus võimalikke väärtuseid n ainult kaks: 0 ja 1, mida tõlgendatakse ka kui tõene (True) ja väär (False)
  • complex (complex number) – kompleksarv (reaal- ja imaginaarosast koosnev arv)

Muutujad on Pythonis dünaamiliselt tüpiseeritud (ingl dynamically typed), st eelnevat muutujate deklareerimist ei nõuta. Muutuja "tekib" siis, kui talle antakse väärtus ning muutuja tüübi määramisel lähtub interpretaator omistatud väärtusest. Sel põhjusel võib sama muutujat ühes programmis algväärtustada korduvalt ka erinevat tüüpi väärtustega ehk muutuja tüüp saab programmi töö vältel muutuda. Sellist võimalust on parem siiski mitte kasutada.

Kommentaariks: muutujate deklareerimine tähendab programmis muutujanimede ja vastavate andmetüüpide loetlemist, ilma et nendega rohkem midagi tehtaks. Tihti on võimalik deklareerimise käigus ka muutuja algväärtustada ehk anda talle esimene sobilik väärtus. Mitmed programmeerimiskeeled nõuavad muutujate deklareerimist enne kasutamist. Arvuti poolt vaadatuna on muutuja deklareerimisele reaktsiooniks talle mälupesade eraldamine, mida hiljem programmis muutuja väärtuse salvestamiseks kasutatakse.

Väärtus

Väärtus on suurus/väärtus, mida muutuja "sees" meeles peetakse; väärtus peab sobima kokku andmetüübiga. Muutuja kasutusele võtmiseks tuleb muutujale omistada tema tüübiga sobiv väärtus. Näiteks soovides kasutada muutujat ujukomaarvude hoidmiseks, tuleb talle alguses ka ujukomaarv väärtuseks anda: arv = 1.0 Dklareerimist kasutavates keeltes tuleb muutujale samuti midagi omistada enne tema kasutuselevõttu. Vastasel juhul on üsna juhuslik, millise väärtuse muutujast leiame.

Muutujate nimed[edit]

Nime kaudu saab programmeerija pöörduda muutuja väärtuse poole, seda kasutada. Muutuja nime jaoks kasutatakse ka mõistet identifikaator (identifier). Muutujatele sobivate nimede määramine on programmeerija jaoks oluline osa programmi kavandamisel. Ühelt poolt seab kasutatav programmeerimiskeel tehnilised piirangud, teisalt on mitmesuguseid soovitusi, mida järgida tuleb. Soovitused võivad erineda nii keeleti (keelte kasutuse kohta on koostatud üldisi stiiliraamatuid (style guide)) kui ka firmade lõikes. Tarkvarafirma võib kehtestada ühtsed mängureeglid muutujanimedele. Selliste reeglite eesmärk ei ole kedagi ahistada, vaid tõsta programmikoodi inimloetavust kõigi töötajate-programmeerijate jaoks.

Pythonis kehtivad muutujanimedele järgmised reeglid (mis on üsna tüüpilised ja levinud ka teistes keeltes):

  • nimes võib kasutada tähti [a..z], [A..Z], numbreid [0..9] ja allkriipsu _
  • nimi algab tähe või allkriipsuga (alphabetic)
  • sellele võivad järgneda nii allkriipsud, tähed kui numbrid (alphanumeric)
  • Python on tõstutundlik (case sensitive), st suur- ja väiketähed on erinevad.

Ehkki võimalik on nimedes kasutada ka nt tähti õ, ü, ö, ä, ei ole seda soovitav teha, sest igal platvormil ja kultuuriruumis ei pruugi need sobida.

Üldine keelest sõltumatu soovitus nimede kohta on nende arusaadavus. Pane muutujale selline nimi, mis annab märku ka sellest, mis andmeid seal hoitakse. St ära kasuta nimesid aaa, bbb ja ccc, vaid palk, maks, nimi jne. Ühetähelised nimed on tavaliselt sobimatud. Loomulikult võime teha erandeid matemaatilistele üldlevinud tähistustele jms. Kõige tähtsam tingimus on siiski arusaadavus. Ja seda mitte ainult koodi kirjutaja jaoks, vaid ka teistele inimestele.

Kindlasti ei tohi muutujale nimeks panna mõnda keelesõna (nt else, import jne). Samas Pythonis on lubatud kasutada funktsioonide nimesid. Niimoodi on näiteks print või sqrt kasutatavad nimed muutujatele. Kuid sellest võib tekkida suuremat sorti segadus - nimelt ei tunne Pythoni interpretaator pärast enam print käsku ära ja juhtub midag sellist:

>>> print = 12
>>> print
12
>>> print("Tere kool!")
Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    print("Tere kool!")
TypeError: 'int' object is not callable 


Kui vihjata veel tüüpilisematele vigadele, siis number nime alguses ei ole lubatud, samuti tühik nime keskel. Mitmest sõnast koosneva nime võib esitada näiteks allkriipsu kasutades (nt lapse_vanus, kuuli_kiirus

Nimesid (identifikaatoreid) ei kasutata vaid muutujate tähistamiseks, vaid ka mitmete teiste programmi osade jaoks (nt alamprogrammide nimed, konstandid jms). Nime üldisemalt kutsutakse identifikaatoriks (identifier) ja tema kasutamise reeglid ühtivad eelneva jutuga.

Omistamine[edit]

Muutujad saavad oma väärtusi kas sisendlausest (ingl input statement) (klaviatuurilt trükituna või failist loetuna) või omistuslausetest (assignment). Omistusmärgiks on Pythonis =.

Näiteid Pythoni omistuslausetest:

arv = -12
sona = „kaalikas“
komaga_arv = -3.1415 * (5.0 ** 2)
uus_string = "politsei" + "koer"

Python toetab ka nn täiendatud omistamist (ingl augmented assignment), kus omistusmärgile lisatud tehtemärk näitab muutust sama muutuja väärtuses.

Näiteks:

n = n + 1   # hetkel kehtiva n-i väärtust suurendatakse 1 võrra
n += 1      # on täiendatud omistamine ja tähendab seda sama.

Enim kasutatavad täiendatud omistustehted on järgmised:

+ =  -=  *=  /=  %=  **=

Lubatud on ka mitmene omistamine (ingl multiple assignment). See tähendab, et mitmele muutujale omistatakse korraga sama väärtus.

Näide

x = y = z = 1

Seda võimalust ei tasuks üleekspluateerida, kuna selle all programmi loetavus kannatab ja tegemist ei ole programmeerimiskeele jaoks tüüpilise võimalusega. Abimuutujate (ei sisalda olulisi andmeid) algväärtustamiseks võib seda siiski sobivaks pidada.

Andmetüübid[edit]

Eespool oli juba mainitud, et lihtandmetüübid võib jaotada kahte suuremasse klassi: arvandmed ja tekstandmed. Arvandmetega saab reeglina arvutada ja tekstandmeid teisel moel töödelda. Arvude hulgas eristatakse täisarve (integer) ja ujukomaarve (floating point numbers).

Täisarvud
on teisisõnu komakohtadeta arvud. Teisendusfunktsioon, mida peale sisestamist (või ka muul puhul) kasutada, on int().
Ujukomaarve
salvestatakse tüvenumbreid ja nn kümneastmeid kasutades. Teisendusfunktsiooniks on float().
Kompleksarvud
Lisaks on võimalik Pythonis kasutada kompleksarve (complex). Sellist tüüpi muutujas salvestatakse reaalosa ja imaginaarosa eraldi ujukomaarvudena. Imaginaarosa tähistamiseks kasutatakse sufiksit j.

Näide kompleksarvu omistamisest:

a = 1.5+0.5j

Reaal- ja imaginaarosa saab kompleksarvust a kätte järgmiselt: a.real ja a.imag.

Täpsemalt sellest, kuidas täis- ja ujukomaarve arvuti mälus talletatakse, on juttu vastavates materjalides.

String
on andmetüüp, mis lubab salvestada suvalist teksti, suvalisi märgijadasid.

Stringieraldajatena (alguse ja lõpu märkidena) kasutatakse ülakomasid ('Maali') või jutumärke ("Maali"). Kui stringi sees on vaja kasutada ülakoma, siis kasutatakse tema varjestamiseks paomärki (ingl escape character) \. Näiteks: et trükkida välja Maali't tuleks string esitada nii: 'Maali\'t'. Erisümbolina võib stringi sees kasutada ka reavahetuse märki, milleks on \n, nagu tavaks C-tüüpi keeltes.

Stringe saab liita + märgiga ja korrata * märgiga. Näiteks (-> märgiga on näidatud tekkiv väärtus, see ei kuulu Pythoni sümbolite ja hulka):

"politsei" + "koer" -> "politseikoer" 
4 * "hiir" -> "hiirhiirhiirhiir"

Stringis olevatele sümbolitele saab indeksi abil ligi. Esimese sümboli indeksiks on 0. Näiteks

sona = 4 * "hiir"
sona[4] -> "h"

Samal viisil saab kätte ka mitu järjestikust sümbolit:

sona[0:2] -> "hi"

Standardfunktsioon len() annab tagasi stringi pikkuse:

len(sona) -> 16

< 2. nädala teemad