4. muuttujat ja funktiotlaki1/syksy-2019/luennot/... · − esimerkiksi lausekkeen 4 / 2 arvo on...
TRANSCRIPT
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:")