4. muuttujat ja funktiotlaki1/syksy-2019/luennot/... · − esimerkiksi lausekkeen 4 / 2 arvo on...

22
4.1 4. Muuttujat ja funktiot

Upload: others

Post on 08-Jul-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

4.1

4. Muuttujat ja funktiot

Sisällys

• Imperatiivinen laskenta.

• Muuttujat.

− Nimi ja arvo.

− Muuttujan nimeäminen.

− Muuttujan tyyppi.

• Operaattorit.

− Operandit.

− Arvon sijoitus muuttujaan.

− Aritmeettiset operaattorit.

• Funktiot.

− Nimeäminen.

− Parametrit.

− Paluuarvo.

• Esimerkkejä.

− Yksikkömuunnos.

4.2

4.3

Muuttujat ja funktiot• Lausekielinen ohjelma on algoritmin toteutus, jossa käytetään

tarkasti säännellyn kielen lisäksi ja jotain laskentamallia (ohjelmointi-paradigma).

• Eräs tapa laskea ohjelmallisesti on

− esitellä äärellinen joukko muuttujia ja

− käyttää funktioita (aliohjelma, operaatio, metodi jne.) muuttujien arvojen lukemiseen ja muuttamiseen.

• Muuttujien arvot algoritmin tietyssä vaiheessa määrittävät algoritmin tilan (state).

− Algoritmi siirtyy tilasta toiseen suorituksensa aikana.

• Tällainen laskenta on luonteeltaan imperatiivista ja on käytössä useimmissa ohjelmointikielissä Python mukaan lukien.

4.4

Muuttujat• Muuttuja (variable) koostuu nimestä (tunnuksesta) ja nimeen

liittyvästä arvosta.

• Muuttuja ei ole matematiikasta tuttu käsite, jolla symboloidaan usein tuntematonta arvoa.

− Esimerkiksi yhtälössä x + 1 = 0 tuntematon arvo on x.

• Algoritmissa muuttujan arvo on yleensä tunnettu ja erityisesti erona on se, että arvo voi muuttua algoritmin edetessä vaiheesta toiseen.

− Muuttuja muistuttaa hieman suuretta eli mitattavaa ominaisuutta. Esimerkiksi lämpötila (T) on suure, jolla mitataan aineen lämpöenergian määrää.

• Muuttuja nimetään sen tarkoitusta kuvaavasti.

− Algoritmien ymmärrettävyyden kannalta on tärkeää, että nimistä nähdään minkä tiedon säilyttämiseen muuttujia käytetään.

4.5

Muuttujat• Yleensä hyvä nimi on riittävän pitkä nimi.

− Esimerkiksi pituuden sisältävälle muuttujalle on parempi antaa nimeksi pituus

kuin p, joka voi sekaantua vaikkapa painoon.

• Pythonissa muuttujien nimissä voidaan käyttää kirjaimia, numeroita ja alaviivaa.

− Nimessä käytetään pieniä kirjaimia.

− Nimen sanat erotetaan toisistaan alaviivalla.

− Nimissä voi käyttää skandinaavisia kirjaimia å, ö ja ä.

− Nimi ei voi alkaa numerolla.

• Toisin kuin useissa ohjelmointikielissä, Pythonissa ei ole erillistä muuttujan esittelyä, jossa määritellään erikseen muuttujan tietotyyppi.

− Python päättelee muuttujan tyypin sen alkuarvon avulla.

4.6

Operaattorit

• Operaattoreiksi (operator) kutsutuille funktioille on annettu omat symbolit.

• Operaattorin käsittelemät arvot ovat operandeja.

− Operandit voivat olla arvoja sellaisenaan (literaaleja), muuttujien arvoja tai muiden funktioiden palauttamia arvoja.

− Useimmat operaattorit ovat kaksioperandisia.

• Operaattoreista tärkein onsijoitus, joka korvaa muuttujan nykyisen arvon uudella.

− Myös Pythonissa symbolina yhtäsuuruusmerkki =.

− Arvojen yhtäsuuruuden vertailuun käytetään kahta yhtäsuuruusmerkkiä (==).

− Ensimmäinen (vasen) operandi on muuttujan nimi.

− Toinen (oikea) operandi on uusi arvo.

4.7

Operaattorit

• Sijoituslause:

muuttujan_nimi = uusi_arvo

on algoritmin vaihe.

• Ensimmäistä sijoitusta kutsutaan muuttujan alustukseksi (initialisation).

− Muuttujan tyyppi päätellään sen alkuarvon avulla.

− Muuttuja täytyy alustaa ennen sen myöhempää käyttöä ohjelmassa.

• ikä = 42

− Ikä-nimisen muuttujan arvoksi asetetaan 42.

− Muuttujan tyypiksi kiinnitetään kokonaisluku(int).

• ikä = 50

− Uusi arvo 42 korvaa muuttujan vanhan arvon 50. Sijoitusta ei voi peruuttaa.

4.8

Operaattorit

• paino = 80.5− Reaaliluvuissa (float)

käytetään desimaali-erottimena pistettä.

• paino = 80,5− Pilkkua on helppo käyttää

vahingossa desimaali-erottimena, koska pilkuilla toisistaan erotetuista arvoista muodostuu automaattisesti tupla, joka on eräs Pythonin sekvensseistä.

• Reaalityyppiä kutsutaan esitystapansa vuoksi myös liukuluvuksi.

• Liukuluvut ovat likiarvoja.

− Esimerkiksi �

��=

0.09090909090909091.

4.9

Operaattorit

• sukunimi = "Simpson"

sukunimi = 'Simpson'

− Merkkijonotyyppiset (string) literaalit suljetaan joko yksin- tai kaksinkertaisiin lainausmerkkeihin.

− Luentomateriaalissa käytetään pääosin kaksinkertaista lainausta.

− Valitse oma tyylisi lainausmerkkien suhteen ja seuraa tyyliäsi johdonmukaisesti.

• Merkkijono voidaan alustaa tyhjällä, nollan merkin mittaisella arvolla "" tai ''.

• Huomaa, että "sukunimi" on literaali eikä muuttujan nimi.

− Merkkijonoksi katsotaan myös pelkistä numeroista koostuvat jonot. Esimerkiksi "42" on merkkijono.

4.10

Operaattorit

• Python sallii muuttujan tyypin vaihdon sijoituksen kautta.

• pituus = 150

pituus = 150.7

− Muuttujan tyyppi vaihtuu kokonaisluvusta liukuluvuksi sijoituksen seurauksena.

• On oltava tarkkana ettei tyyppi vaihdu vahingossa vääräksi.

• pituus = "165"

− Tämäkin sijoitus on sallittu, vaikka loogista olisi käyttää edelleen vain lukuarvoja.

• Pythonissa on saatavilla lukujen ja merkkijonojen lisäksi useita muita tyyppejä.

− Kurssin edetessä tutustutaan uusiin tyyppeihin.

4.11

Operaattorit

• Koulusta tutut aritmeettiset operaattorit lukujen yhteen-, vähennys-, kerto- ja jakolaskuun ovat käytettävissä Pythonissa.

− Symbolit +, - ja / ovat tuttuja, kertomerkkinä käytetään tähteä * eli asteriskia.

− Laskujärjestys on tuttu.

− Sulkuja voidaan käyttää järjestyksen muuttamiseen.

• Aritmeettiset operaattorit ovat sijoitusoperaattoria vahvempia.

− Aritmeettisia lausekkeita(lauseen osia) lasketaan, kunnes saadaan yksittäinen arvo sijoitettavaksi.

− Sijoitus muodostaa algoritmin vaiheen myös, kun lauseessa on muuta laskentaa ennen sijoitusta.

4.12

Operaattorit

• tulosumma = 1 * 2 + 2 * 2

− Ensin lasketaan tulolausekkeet 1 * 2 ja 2 *2, toiseksi summalause 2 + 4 ja lopuksi sijoitetaan summa (6) muuttujan arvoksi.

− Sijoitus muodostaa algoritmin vaiheen, vaikka ennen sijoittamista lasketaan aritmeettisilla operaattoreilla.

• Laskennan aikana voi tapahtua automaattisia (implisiittisiä) tyyppi-muunnoksia.

− Kokonaislukua kokonaisluvulla jaettaessa tulos on reaaliluku.

− Esimerkiksi lausekkeen 4 / 2 arvo on 2.0, vaikka jako menee tasan.

− Aritmeettinen operaattori palauttaa reaalilukutyyppisen arvon, jos jompikumpi operandi on reaaliluku.

Operaattorit

• Muuttujan nykyistä arvoa täytyy toisinaan kasvattaa tai vähentää, jolloin saman muuttujan tunnus esiintyy molemmin puolin sijoitusoperaattoria.

− Erityisesti silmukoihin liittyvät kokonaisluku-arvoiset laskurit (counter) muuttuvat usein yhden arvon verran.

• Tällaisissa tapauksissa muuttujan nykyistä arvoa käytetään vasemmalla puolella ja muuttuja saa uuden arvon vasta, kun oikea puoli on laskettu.

• ikä = ikä + 1

− Ensin haetaan iän vanha arvo (50 + 1) ja sitten lasketaan summa (51) ja lopuksi sijoitetaan summa muuttujan uudeksi arvoksi.

4.13

Funktiot• Operaattoreita moni-

mutkaisemmat funktiot ovat algoritmeja, joita kutsutaan(call) nimen avulla.

− Tunnuksen lopussa on aina kaarisulkeiden pari.

• Funktion tarvitsemat tiedot eli parametriarvot (parameter values) välitetään funktiolle kirjoittamalla arvot kaarisulkeiden sisään.

− Arvot erotetaan pilkuilla.

• Parametriarvo on operandin tapaan literaali, muuttujan arvo jne.

• Funktion parametrien lukumäärä, tyypit ja järjestys selviää funktion dokumentaatiosta.

• help()

− Lause käynnistää Python-tulkin ohjetoiminnon, kun tulkkia käytetään interaktiivisessa tilassa.

4.14

Funktiot

• Funktiolla voi olla paluuarvo (return value).

− Operaattori palauttaa aina arvon, mutta funktio voi palauttaa arvon tai jättää sen palauttamatta.

− Paluuarvo voidaan jättää huomiotta tai hyödyntää.

− Paluuarvo sijoitetaan usein muuttujaan, jotta sitä voidaan käyttää myöhemmin ohjelmassa. Paluuarvon säilövä muuttuja voi myös selkeyttää ohjelmaa.

• luku1 = 42

luku2 = 13

suurempi = max(luku1, luku2)− Python hakee luku1- ja luku2-

muuttujien arvot ja käyttää niitä funktion kutsussa.

− Funktio päättelee kumpi parametriarvoista 42 ja 13 on suurempi ja palauttaa suuremman arvon (42), joka sijoitetaan muuttujaan.

− Kutsu ja sijoitus muodostavat yhdessä lauseen.

4.15

Funktiot• neliö = pow(3, 2)

− Funktio korottaa luvun kolme toiseen potenssiin.

− Pow-funktion kutsussa on tärkeää huomioida arvojen järjestys: ensimmäinen parametriarvo on kantaluvulle, toinen eksponentille.

4.16

Funktiot

• Funktioiden avulla voidaan kommunikoida käyttäjän kanssa.

• Print-funktio tulostaa parametriarvonsa näytölle.

− Parametriarvoja voi olla yksi tai useampia. Funktio tulostaa parametriarvojen väliin yhden välilyönnin.

− Tulosteen jälkeen vaihdetaan riviä.

• print(″Hello, World!″)

− Näytölle tulostetaan merkkijonolla ″Hello, World!″ alkava rivi ja vaihdetaan riviä.

• print(″Tulos on″, suurempi)

− Python välittää funktiollesuurempi-muuttujan arvon.

− Funktio muodostaa merkkijonon ″Tulos on 42″, joka koostuu välilyönnillä erotetuista parametriarvoista ja tulostaa merkkijonon näytölle.

4.17

Funktiot

• Input-funktio palauttaa käyttäjän näppäimistöltä antaman arvon merkkijonona.

− Funktiota voidaan kutsua ilman parametria tai antamalla parametriksi käyttäjää avustava kehote.

− Kurssilla input-funktiota kutsutaan aina ilman parametria, jotta automaattinen tarkistus olisi helpompaa.

• etunimi = input()

− Ohjelman pysähtyy odottamaan syötettä funktiossa.

− Ohjelman suoritus jatkuu vasta, kun käyttäjä kirjoittaa syötteen ja painaa Enter-näppäintä.

− Funktion palauttama merkkijono sijoitetaan muuttujaan.

4.18

Funktiot

• Numeerinen merkkijono voidaan muuttaa ohjelmoijan toimesta (eksplisiittisesti) halutuksi lukutyypiksi int- tai float-funktiolla.

• Ohjelma pysähtyy ajonaikaiseen virheeseen (runtime error), jos muunnos ei onnistu.

− Kurssilla oletetaan, että käyttäjä osaa antaa aina oikean tyyppisen syötteen.

− Syöte voi kuitenkin olla virheellinen esimerkiksi siten, että annettu luku ei kuulu syötteeksi hyväksyttyjen lukujen välille.

4.19

Funktiot

• ikä = int(input())

− Luetaan merkkijono, muunnetaan se kokonaisluvuksi ja sijoitetaan muunnoksen tuloksena saatava merkkijono muuttujan arvoksi.

− Sisäkkäisissä funktiokutsuissa sisempää funktiota kutsutaan ensin, jolloin ulompi funktio saa sisemmän kutsun paluuarvo parametriarvokseen.

• Int-funktion kanssa on oltava tarkkana, koska sillä voi myös poistaa reaaliluvun desimaalit.

• pituus = float(input())

pituus = int(pituus)

− Poistetaan reaalilukuna saadun syötteen desimaalit. Ohjelma kadottaa tietoja, jos jälkimmäinen muunnos on vahinko.

4.20

Yksikkömuunnos

4.21

Alku

jaardit = float(input())

print(metrit)

Loppu

metrit = 0.9144 * jaardit

• Mahdollisimman suora muunnos luonnollisella kielellä esitetystä muodosta Python-kielelle.

• Algoritmissa on selkeyden vuoksi omat muuttujat pituudelle lähtö- ja tulos-yksiköissä.

− Yhdeksi toiminnoksi (lauseeksi) tiivistettynä ohjelma on hankala ymmärtää.

Yksikkömuunnos

• Ohjelmasta saadaan käyttäjäystävällisempi lisätulosteilla.

− Ilman toisena toimintona tulostettavaa kehotetta käyttäjän täytyy arvata, että ohjelma odottaa syötettä.

− Muunnoksen tulos esitetään paremmin ymmärrettävässä muodossa antamalla print-funktiolle kaksi parametria.

4.22

Alku

jaardit = float(input())

print(metrit, "metriä.")

Loppu

metrit = 0.9144 * jaardit

print("Moi! Muunnan jaardit metreiksi.")

print("Anna jaardit:")