Muuttujat versus muistipaikka
Info
Tietokone tekee monenlaisia asioita ohjelman ohjaamana; esim.
se lukee lämpötila-anturin arvoja,
muuttaa tuon arvon laskemalla Celsius-asteiksi,
vertaa sitä ennalta annettuun raja-arvoon ja jos arvo ylittää sen,
kytkee transistorikytkimen kautta tuulettimen moottorin pyörimään.
Näiden tehtävien suorittamiseen tietokone tarvitsee ohjelmakoodin lisäksi tietoa,
dataa eli numeroita ja merkkejä ja vielä paikan jonne data tallennetaan.
Työstettävälle tiedolle pitää olla jokin varastopaikka.
Tämä varastopaikka on nimeltään muuttuja.
Tässä Python-kurssin osiossa käsittelemme muuttujista mm seuraavia asioita:
- RAM-muistin rakenne ja muuttuja
- numero- ja merkkijono-muuttujat, tyyppi, nimi, nimeäminen,
- erilaista laskentaa ja muuta muuttujien manipulointia
- lopuksi vielä tiedon lukeminen käyttäjältä
Muuttuja, variable
Muuttuja on yksittäisen tiedon varastopaikka.
Kun tieto, data, tallennetaan muuttujaan, se oikeasti talletetaan tietokoneen
RAM-käyttömuistin muistipaikkaan (Random Access Memory).
Teknisesti ajatellen muuttuja on viittaus käyttömuistiin tiettyyn lokeroon johon arvo on tallennettu.
Muuttujaksi tuota muistipaikkaa nimitetään koska datatieto voi olla joko pysyvää tai muuttuvaa.
Muuttujiin talletetaan ohjelmassa tarvittavia lukuarvoja, numeroita, merkkejä, jne.
Jotta muuttujaa voisi ohjelmassa käyttää, se tarvitsee nimen.
Muuttujalle annetaan nimi aina kun se otetaan ensimmäistä kertaa käyttöön.
Nimi ei voi olla mikä tahansa vaan sen määrittämiseen on omat ohjeet.
Käsite muuttuja on käytössä kaikissa ohjelmointikielissä, joten nyt ollaan tekemisissä perimmäisten kysymysten kanssa.
RAM-muisti
Katsotaan ennen muuttujiin tarkemmin perehtymistä, millainen on tietokoneen RAM-käyttömuistin rakenne.
Opit muistin koostumuksen, siis miten se on organisoitu ja miten itse muuttuja toimii.
Koska ohjelmoinnin perusteiden jälkeen tehdään laiteläheistä koodia, tutkitaan muistin rakenne perusteellisesti.
Näin käsitteet muuttuja - muistipaikka selviää.
SRAM-muistisolu (Static RAM) on rakennettu transistoreista joista on koostettu kiikku, flip-flop ja
kukin tällainen kiikku-solu voi säilöä yhden bitin, ykkösen tai nollan.
Muistisolu/kiikku/flip-flop asettuu joko 1- tai 0-tilaan kun käyttösähköt kytketään.
Eli muistipaikalla on jokin satunnainen arvo ennen sen käyttöä, ellei sitä nollata tai aseteta siihen jotain arvoa.
Kun lopetat työt ja katkaiset tietokoneen käyttösähköt, niin nuo bitit siirtyvät "bittien taivaaseen".
Muistisääntö: kiikun lähtötila on “kiikun tai kaakun”, 1 tai 0.
RAM-muistin rakenne ja muuttuja
Muistia käsitellään 8-bitin palikkoina, joista saadaan 256 erilaista versiota (0000 0000 – 1111 1111).
Se riittää numeroiden ja aakkosten ja erikoismerkkien määrittelyyn ja jää vielä ylikin.
CPU, prosessori, pääsee muistin kuhunkin kahdeksan bitin säilöön käsiksi osoiteväylän kautta.
Osoiteväylä on 16/32/64-rinnakkaista johdinta, joissa voi olla joko ykkönen tai nolla, +5V (+3,3 V) jännite tai 0V.
Bittikuvion perusteella muistin sisällä oleva osoitekooderi pääsee kiinni jokaiseen muistiriviin (tässä 8-bitin pakettiin).
Jos osoiteväylä on 16-johdinta, muistipaikkoja voidaan osoittaa 2 potenssiin 16 eli 65536 ja
jos osoiteväylä on 32-johdinta, niin muistipaikkoja on yli 4 miljoonaa.
Mikroprosessori, CPU, Central Processing Unit, määrää millainen bittikuvio pannaan väylälle, se
ohjaa WR-write-kirjoitus- ja RD-read-lukulinjoja joilla määrätään datan kulkusuunta,
luetaanko (kopioidaan) muistipaikan sisältö vai kirjoitetaanko se uusiksi.
RasPi-tietokoneen RAM-työmuisti on kooltaan 1 GB. Mitä se tarkoittaa?
Siinä on miljoonia sähköisiä kiikkuja joiden tilaa kutsutaan biteiksi, binary digit,
ja joita voidaan ohjata jännitteellä olemaan joko high eli ON eli 1 tai low eli OFF eli 0.
Tarkkaan sanoen 1 GB (yksi giga-tavu) sisältää kaikkiaan 8’589’934’592 bittiä.
Eikä tämä ole vielä edes kovin iso muistitila.
Tietokoneen rakenteesta syvällisemmin linkistä: 112233
Muuttujan nimeäminen
Muistipaikalle annetaan nimi, jolloin sitä on helpompi käyttää.
Python (yhdessä käyttöjärjestelmän kanssa) tietää nimen perusteella mikä bittikuvio pitää osoiteväylälle
CPU:n toimesta asettaa jotta ko. muistipaikka = muuttuja löytyy.
Muuttuja säilyttää arvonsa kunnes siihen asetetaan toinen arvo, tai katkaistaan käyttösähköt.
Muuttujan määritys eli nimen anto, varaa sille tilaa RAM-keskusmuistista ja yhdistää nimen varattuun tilaan.
Muistipaikan koko ja se mitä muuttujalle voidaan tehdä, määräytyy tietotyypin perusteella.
Muuttujien nimeäminen kannattaa heti opiskelun alussa ottaa vakavasti ja opetella järkevä ja
sääntöjen mukainen nimeämiskäytäntöä.
Muuttujien nimiä ei kannata pitää liian lyhyinä (ei pelkkä kirjain), ei kryptisinä eikä myöskään liian pitkinä.
Pythonin muuttujien nimeäminen on melko vapaata, mutta opi ainakin seuraavat asiat:
- Nimen kelvolliset merkit ovat a - z, A - Z, numerot ja alaviivat.
- Ääkköset (ä, ö, å, Ä, Ö, Å) eivät ole sallittuja.
- Python ymmärtää isot ja pienet kirjaimet eri merkeiksi, case sensitive, käytä mieluusti vain pieniä.
- Muuttujan nimessä ei saa olla tiettyjä erikoismerkkejä, kuten huutomerkkejä (!).
- Välilyönti (tyhjä) ei ole sallittu, sillä se erottaa komentojen osat toisistaan.
- Muuttujien nimien ensimmäinen kirjain kirjoitetaan aina pienellä!
- Nimi ei saa koostua pelkistä numeroista, eikä se saa alkaa numerolla.
- Käytä muuttujan nimenä jotain sen merkitystä tai tehtävää kuvaavaa nimeä, esim. tasavirta.
- Käytä alaviivaa jos nimi on kaksiosainen, ovi_kytkin, valo_tunnistin.
- Hyvin valittu nimi säästää kommenttirivin, se kertoo heti mistä on kysymys.
Python-tulkki on varannut ison joukon sanoja joita se käyttää vain tiettyyn tarkoitukseen ja
niitä ei saa käyttää muuttujien eikä funktioiden niminä.
Näistä sanoista käytetään nimeä varatut sanat tai avainsanat, keywords.
Muuttujan tyyppi
Kun muuttuja otetaan käyttöön sillä tulee olla nimi, arvo ja tyyppi. Muuttuja otetaan käyttöön ja
esitellään samalla kun sille annetaan ensimmäinen arvo. Erillistä esittelyä tai tyypin määrittelyä ei
Pythonilla tarvita. Tyyppi määrittelee kuinka suuri muistitila tiedolle on varattava ja mitä kaikkea
tuolle tiedolle voidaan tehdä. Muuttuja säilyttää arvonsa kunnes siihen asetetaan toinen arvo.
Muuttujan arvo muuttuu, tai saattaa muuttua, ohjelman ajon aikana.
Pythonin kolme tärkeintä tyyppiä:
Tietotyypit: tärkeimmät numerotyypit
Tietotyypit | Toiminto | Miten käytetään |
Kokonaisluku, Integer, int, | tallentaa kokonaislukuja, luku jossa ei ole desimaalipistettä |
1, 222, 333 |
Desimaaliluku, Liukuluku, float, | tallentaa desimaalilukuja, luku jossa on desimaalipiste |
3.14, 5.55, 66.777, 2E8 |
Tietotyypit: merkkijonomuuttuja
Tietotyypit | Toiminto | Miten käytetään |
Merkkijonomuuttuja, String, str | Merkkijono koostuu yhdestä tai useammasta merkistä = tekstiä |
mjono = ’raspberry’ mjono = "raspberry" |
Näillä tyypeillä päästään jo pitkälle.
Laiteläheisessa koodauksessa on käyttöä myös bool-tyypille, sitä käytetään totuusarvojen esittämiseen. Niistä myöhemmin lisää.
Perehdytään ensin numerotyyppiin ja sitten merkkijonomuuttujaan.
Numerotyypeistä
Desimaaliluku, float, ei ole matemaattisessa mielessä reaaliluku.
Desimaaliluvun tarkkuus riippuu käytettävissä olevan keskusmuistin koosta. Josta voi seurata pyöristysvirheitä.
Tämä on vaarana esim silloin kun lasketaan yhteen hyvin suuria ja hyvin pieniä desimaalilukuja.
Pahimmassa tapauksessa voi käydä niin, että pienempi ei luku vaikuta lopputulokseen lainkaan.
Tämän saa aikaan se, että summan tarkkuus ei riitä kattamaan pienemmän luvun vaikutusta.
Numerotyypeistä on hyvä tietää että int- ja float-tyyppiset arvot tallennetaan tietokoneen muistissa erilaisissa muodoissa
ja myös jotkut operaatiot (summa, erotus, jne) toimivat niillä eri lailla.
Kun muuttujaan asetetaan arvo, se päättelee oman tyyppinsä asetetun arvon perusteella.
Muuttujan tyyppi ei python-kielessä ole pysyvä.
Eli kun tyyppi on asetettu, voidaan sitä muuttaa asettamalla sen arvo uudestaan.
Sijoitusoperaattori
Muuttujalla tulee olla nimi ja arvo ennen kuin sitä voidaan käyttää.
Jos alkuarvolla ei ole merkitystä, niin silloin sille on annettava arvo nolla.
Ohjelmointikielen ehkä tärkein komento on sijoitusoperaattori. Sillä asetetaan muuttujalle arvo.
Sijoitusoperaattori on (=).
Luodaan muuttuja luku ja annetaan sille arvo, vaikkapa 2, käyttämällä sijoitusoperaattoria näin:
luku = 2
Sijoitusoperaattorin oikealla puolella oleva arvo (numero tai merkki) sijoitetaan
vasemmalle puolella olevan muuttujan arvoksi.
Pythonissa ei tarvita erillistä muuttujan esittelyä (tyypin määrittelyä),
eikä komennon loppuun tarvitse kirjoittaa erillistä loppumerkkiä, kuten on muissa kielissä.
Enterin painallus riittää rivin lopetukseen.
Sitten tehdään pieni harjoitus. Käynnistä Thonny ja kirjoita kuvassa oleva koodi.
Numeromuuttujat
Käytä koodipohjana ed. osiossa esitettyä mallipohjaa pohja.py, muuta nimi, päiväys ja muut.
Ensin luodaan kaksi muuttujaa, luku_1 ja luku_2. Kun muuttujille annetaan arvo,
toiselle kokonaisluku 2, jolloin muuttuja saa tyypikseen integer, int, ja
toisen muuttujan arvoksi annetaan 5.0, joka merkitsee että sen tyyppi on desimaaliluku, liukuluku, float.
Analyysi:
Rivi 14: print-funktio
print on Pythonin sisäinen, aina käytössä oleva, tulostusfunktio, jonka tuntee kaarisulkeista ().
Älä pelästy, käytämme print-funktiota vaikka emme tiedä vielä funktioista yhtään mitään.
Niistä kerrotaan omassa osiossa perusteellisesti.
Tässä vaiheessa riittää kun tietää, että kaarisulkeiden välissä on tulostettavan muuttujan nimi.
Talleta, valitse valikosta File, Save as… tai painamalla talletus-nappia.
Aja ohjelma painamalla funktionäppäintä F5, tai painamalla ajo-nappia.