Termbank
  1. A
    1. Absolute Path
    2. Ajonaikainen
      konseptit
    3. Alkio
      listat arvot
    4. Alustaminen
      muuttujat arvot
    5. Argumentti
      funktiot arvot
    6. Arvo
      arvot
    7. Assignment
      muuttujat arvot
    8. Assignment Operator
      muuttujat arvot operaattorit
    9. Attribute
      objektit
    10. Attribuutti
      Attribute
    11. Avainsana
      nimet
    12. Avausmoodi
      tiedostot
    13. Ajaminen
      Execution
    14. Aliohjelma
      Function
  2. B
    1. Boolean
      ohjausrakenteet tyypit
    2. Boolean Operator
      ohjausrakenteet
    3. Boolen operaattori
      Boolean Operator
    4. Branch
      ehtorakenteet try-rakenteet
    5. Builtin Function
      funktiot
    6. Bugi
      Ohjelmointivirhe
    7. break
      avainsanat toistorakenteet
  3. C
    1. Carriage return
      merkkijonot tiedostot pakeneminen windows
    2. Code Block
      funktiot ohjausrakenteet
    3. Code File
      konseptit
    4. Comparison Operator
      operaattorit ohjausrakenteet
    5. Condition
      ohjausrakenteet
    6. Conditional Statement
      ohjausrakenteet
    7. Conditional Structure
    8. Constant
      muuttujat arvot
    9. Ctrl + C
      Näppäimistökeskeytys
    10. Callback
      Takaisinkutsu
    11. continue
      avainsanat toistorakenteet
  4. D
    1. Data
    2. Data Structure
      konseptit listat sanakirjat
    3. Debugging
    4. Default Value
      funktiot arvot parametrit
    5. Dictionary
      tietorakenteet
    6. Dokumenttimerkkijono
      dokumentointi
  5. E
    1. Elementti
      Alkio
    2. Epätosi
      arvot
    3. Erotin
      merkkijonot listat tiedostot syöte
    4. Error Message
      ongelmanratkaisu
    5. Escape
      merkkijonot
    6. Evaluointi
      arvot lausekkeet
    7. Exception
      poikkeukset ohjaurakenteet
    8. Execution
      konseptit lausekkeet
    9. enumerate
      toistorakenteet listat
  6. F
    1. False
      Epätosi
    2. File Extension
      tiedostot
    3. Format
      merkkijonot tulostus
    4. Function
      funktiot
    5. Function Call
      funktiot lauseet
    6. Function Definition
    7. for
  7. G
    1. Generaattori
      objektit toistorakenteet
    2. Globaali muuttuja
      muuttujat arvot
    3. Global Scope
  8. H
    1. Hyppy
      ohjausrakenteet
    2. Hardkoodaus
      Kovakoodaus
  9. I
    1. if-lause
      Conditional Statement
    2. if-rakenne
      Conditional Structure
    3. Identifier
      muuttujat funktiot
    4. Indeksi
      listat arvot
    5. Indeksiosoitus
      listat arvot
    6. Indentation
      konseptit
    7. Infinite Loop
      toistorakenteet
    8. Input
      konseptit merkkijonot
    9. Interface
      konseptit funktiot moduulit
    10. import
      moduulit
  10. J
    1. Jäsenfunktio
      Metodi
  11. K
    1. Koodilohko
      Code Block
    2. Kutsu
      Function Call
    3. Key
      arvot sanakirjat
    4. Keyword Argument
      funktiot
    5. Kierros
      toistorakenteet
    6. Kirjasto
      moduulit
    7. Komentoriviargumentti
      terminaali
    8. Kommentti
      dokumentointi virheenetsintä
    9. Kovakoodaus
      arvot
    10. Kutsupyyntö
      funktiot
    11. Käsittelijä
      funktiot konseptit
    12. Käyttöliittymäelementti
    13. KeyboardInterrupt
      Näppäimistökeskeytys
    14. Koodi
      Source Code
    15. Komentorivi
      Terminal
    16. Komentokehote
      Terminal
    17. Kahva
      Tiedostokahva
  12. L
    1. Lause
      konseptit
    2. Lauseke
      konseptit
    3. Leikkaus
      listat
    4. Lista
    5. Literal
      arvot
    6. Liukuluku
      arvot tyypit
    7. Local Variable
  13. M
    1. Muotoilu
      Format
    2. Main Program
      konseptit
    3. Merkki
    4. Merkkijono
      arvot tyypit
    5. Method Call
      lausekkeet objektit
    6. Metodi
      objektit funktiot
    7. Module
    8. Monikko
      tietorakenteet listat
    9. Mutable
      konseptit listat arvot
    10. Muuntumaton
      konseptit merkkijonot arvot
    11. Määrittely
      konseptit
  14. N
    1. Name Conflict
    2. Namespace
      konseptit funktiot moduulit
    3. Nimeämätön vakio
      vakiot arvot
    4. Näppäimistökeskeytys
      poikkeukset
  15. O
    1. Objekti
      konseptit
    2. Olio
      Objekti
    3. Ohjausrakenne
      ehtorakenteet toistorakenteet try-rakenteet
    4. Ohjelmointityyli
    5. Ohjelmointivirhe
      ongelmanratkaisu
    6. Ominaisuus
      objektit
    7. Operand
    8. Operation
      lausekkeet
    9. Operator
    10. Optional Argument
      funktiot arvot parametrit
  16. P
    1. Paikanpidin
      merkkijonot tulostus
    2. Parameter
      funktiot
    3. Parametrization
    4. Poikkeus
      ongelmanratkaisu try-rakenteet
    5. Poikkeusten käsittely
      ohjausrakenteet poikkeukset
    6. Polku
    7. Precedence
    8. Printing
      konseptit merkkijonot
    9. Programming Problem
      ongelmanratkaisu
    10. Python Console
      työkalut
    11. Python Interpreter
      työkalut
    12. Presedenssi
      Sidontajärjestys
  17. R
    1. Referring
      muuttujat arvot objektit
    2. Rekursio
      funktiot konseptit
    3. Relative Path
    4. Return
      funktiot arvot
    5. Return Value
    6. Rivinvaihtomerkki
      merkkijonot tiedostot
  18. S
    1. Sapluuna
      merkkijonot konseptit
    2. Scope
      lohkot konseptit
    3. Sekvenssi
      tietorakenteet toistorakenteet konseptit
    4. Sidontajärjestys
      konseptit lausekkeet
    5. Suoritusjärjestys
      Sidontajärjestys
    6. Silmukkamuuttuja
      toistorakenteet muuttujat
    7. Solution Model
      ongelmanratkaisu
    8. Source Code
      konseptit
    9. Stub
      funktiot ongelmanratkaisu
    10. Syntaksi
      konseptit
    11. Syntax Error
      poikkeukset
    12. Silmukka
      Toistorakenne
    13. Stacktrace
      Traceback
  19. T
    1. Taikaluku
      Nimeämätön vakio
    2. try-rakenne
      Poikkeusten käsittely
    3. Takaisinkutsu
      funktiot
    4. Tallennusformaatti
      tiedostot merkkijonot
    5. Tapahtuma
      konseptit
    6. Tekstitiedosto
      tiedostot
    7. Terminal
      työkalut
    8. Testaaminen
      konseptit ongelmanratkaisu
    9. Tiedostokahva
      tiedostot objektit
    10. Tiedostonimi
      tiedostot merkkijonot
    11. Tila
      konseptit
    12. Toistorakenne
      ohjausrakenteet
    13. Tosi
      arvot
    14. True
      Tosi
    15. Traceback
      ongelmanratkaisu
    16. Type Conversion
      tyypit arvot funktiot
    17. Tyylisääntö
    18. Tyyppi
      arvot konseptit
  20. U
    1. User Interface
      konseptit
  21. V
    1. Variable
      konseptit arvot
    2. Vertailuarvo
  22. W
    1. while
      toistorakenteet
    2. with
      tiedostot
Completed: / exercises

Palautevastauksia

Tällä sivulle kootaan viikottain vastauksia/vastineita palautteisiin joita on kertynyt tehtäväkohtaisiin palautteisiin sekä noihin palautelaatikoihin.

Syksy 2019

Viikko 6 (3. kertaustehtävät ja harjoitukset)

Kiitos jälleen palautteista, niiden perusteella on kirjailtu muutamia pieniä juttuja minkä lisäksi syksyn toisesta kuumasta aiheesta eli Pylintistä kirjoitin pari kommenttia. Kertaustehtävistä on aika lailla käyty läpi kaikki, joten niistä ei sen enempää. Kaikki asiallinen palaute on huomioitu niiden seuraavassa inkarnaatiossa, joka on tällä hetkellä työn alla - itse arkkitehtuuri on aika hyvällä mallilla, mutta kaikki tarkistimet pitää myös kirjoittaa uusiksi.

Pylint ja Turtle-tehtävä

Tämän tehtävän Pylint-tarkistus aiheutti ihmettelyä ja syystäkin. Aiemmissa Turtlea käyttävissä tehtävissä ei ole ollut tarkistusta, mutta tähän se on laitettu. Lovelaceen oli kuitenkin päätynyt tarkistimesta sellainen versio, jossa tiettyjä huomautuksia ei oltu käännetty pois päältä - pääasiassa siis ne importista aiheutuvat. Syy siihen miksi normaali import aiheuttaa huomautuksia puuttuvista nimistä liittynee tarkistimen toteutukseen jossa siis turtle-moduulin päälle kirjoitetaan ulospäin samalta näyttävä mutta sisuskaluiltaan hyvin erilainen moduuli, jotta tarkistimen ylipäätään olisi jotenkin mahdollista. Johtuen siitä miten tuo moduuli on implementoitu, Pylint ei näe noiden nimien olemassaoloa (koska ne luodaan moduulia käynnistettäessä).

Muuta Pylintistä

Ensinnäkin on mahtavaa että Pylint herättää keskustelua sekä Mattermostista että palautteissa. Opiskelijoiden kiinnostuminen koodin laadusta sen toimivuuden lisäksi lämmittää mieltä. Palautteissa oli myös kyselty pitäisikö tyyliseikkoja käydä laajemmin läpi materiaalissa. Toisaalta kyseessä on tärkeä asia, mutta toisaalta kuitenkin alkeiden näkökulmasta varsin vapaaehtoinen asia. Tämän hetken lähetysmistapa on lähinnä opettaa tyyliä esimerkkien kautta, eli materiaalissa olevat koodit on yleensä tarkistettu - niillä asetuksilla joita tarkistinpalvelin käyttää (tai siis piti käyttää, ks alempi otsikko). Jos löydätte esimerkin josta tulee huomautuksia niin hypätkää haukkana kimppuun. Esim tällä viikolla oli huomautettu Anomisen automagiaa -tehtävän pääohjelmassa olevista liian pitkästä rivistä. Tämä rivi (ja yhdenmukaisuuden nimissä myös se toinen samanlainen rivi) on nyt pätkitty nätisti.
Ehkä jatkossa tulee kirjoiteltua myös materiaaliin joitain tyyliaiheisia lisäyksiä. Tekstiä on kuitenkin jo nytkin hieman runsaasti, ja tyyliseikkojen tieltä varsinaista asiaa ei kuitenkaan ole syytä karsia pois.

Korjaus Pylint-palautevastauksiin

Aiemmin kurssilla ihmeteltiin Pylintin valituksia siitä, että nimet pääohjelmassa pitäisi kirjoittaa isolla (koska se luulee niitä vakioiksi). Ihmettelin vähän näitä ilmoituksia itsekin ja vielä lisää kun nelosmateriaalia läpilukiessa osui silmiin kommentti, että tarkistimista nämä valitukset on käännetty pois päältä. Niiden siis olisi pitänyt olla pois päältä. Siirsin kesällä tarkistinprosessin toiselle palvelimelle, mutta siirrossa unohtui siirtää Pylintin asetustiedosto joka määrittää palvelimella ajettavien Pylint-tarkistusten oletusasetukset. Tiettyjen ilmoitusten pois päältä kääntäminen oli tehty nimenomaan tässä tiedostossa. Nyt kyseinen asetustiedosto on kopioitu myös uudelle tarkistinpalvelimelle ja tarkastusten ei pitäisi enää antaa näitä ilmoituksia.

Viikko 5 (3. materiaali)

Kolmannen materiaalin osalta ei ollut oikeastaaan palautetta kommentoitavana, paitsi yksi tarkkaavainen oli hoksannut vanhaan materiaaliin johtavan linkin joka on nyt korjattu - kiitos siitä!

Lisää kertaustehtävistä

Palautteista löytyi sellainen pointti että kertaustehtävät pääasiassa käyttävät lyhytaikaista työmuistia ja tämä on kyllä osaltaan totta. Kertausta pitäisikin tehdä pidemmällä aikavälillä ja kenties vähemmän kerralla, mutta nykyinen mekanismi ei sovellu tähän kovinkaan hyvin johtuen viime viikolla läpikäydyistä tekijöistä. Väitän kuitenkin - kokemukseen pohjautuen - että nykyiset kertaustehtävät tekevät muutakin kuin lyhytaikaista muistamista. Materiaalia tehdessä useimpia asioita ei todellakaan tehdä tarpeeksi montaa kertaa, että ne tulisi opittua "oikeasti" edes sen ensimmäisen kerran. Kertaustehtävät palvelevat sitä tarkoitusta, että saadaan ylipäätään tarpeeksi toistoja uudelle asialle, että siitä pääsee kunnolla jyvälle. Lisäksi niissä saa hieman rutiinia materiaalin keskeisten koodirakenteiden kirjoittamiseen.

Viikko 4 (2. kertaustehtävät ja 2. harjoitukset)

Kertaustehtävistä

Vaikka nykyinen mekanismi ei parhaiten sitä teekään, kertaustehtävät itsessään palvelevat sitä tarkoitusta mihin ne on suunniteltu: muodostamaan rutiinia rivien kirjoittamiseen ja samalla tekemään käsitteiden ja koodirivin yhteyden selvemmäksi. Kertaustehtävien käyttöönoton jälkeen näissä asioissa on tapahtunut aika huomattava kohennus, joten niistä ei olla luopumassa. Nykyinen tapa tehdä nämä ei ole erityisen hyvä, mutta paras mitä työkalut sallivat. Näihin on tulossa uusi systeemi, mutta tälle syksylle se ei ehdi. Kerrottakoon kuitenkin miten uusi systeemi toimii niin voitte arvioida miten palautetta on kuunneltu.
Nykyiset kertaustehtävät tuottavat kerralla setin tehtäviä vastauskaavoineen missä on oikeastaan kolme ongelmaa. Ensimmäisen kaikki tietävät: muuta mekanismia toistojen lisäämiseen ei ole kuin keskeyttää setti ja hakea varastosta uusi. Toinen ongelma on se, että vastauksia ei voi tarkistaa suoritettavana koodina jonka takia kaikki oikein toimivat variaatiot pitää huomioida vastauskaavassa mikä on useimmiten suurinpiirtein mahdotonta. Kolmas on se, että toistoja ei voi sopeuttaa opiskelijan osaamiseen ja poistaa kysymysten joukosta sellaisia jotka opiskelija osaa jo.
Uusi mekanismi (ja se mikä oli itselläni alunperin mielessä kun tätä systeemiä pyysin kehitettäväksi) on sellainen, että koodit ajetaan tarkistimella joka samalla hoitaa istunnon arvioinnin, eli tarkistimen kirjoittaja päättää miten kertausistunto hyväksytään. Lisäksi kertausistuntoja ei tule useita vaan ainoastaan yksi, eli lisätoistot tullaan toteuttamaan siten, että tarkistin lisää uusia tehtäviä sarjaan oman harkintansa mukaan aina väärän vastauksen kohdalla. Oma harkinta tarkoittaa tässä sitä, että tarkistin pystyy katsomaan aiemmat vastaukset istunnossa ja päättelemään mitkä tehtävätyypit tarvitsevat eniten lisätoistoja.
Koska tarkistus tullaan jatkossa tekemään koodina, tarkistin voi arvioida suoraan rivin toimivuutta sen ulkoasun sijaan jolloin esim turhat sulut eivät aiheuta vastauksen hylkäämistä. Samaten format-kertauksissa voidaan parsia tulostettua merkkijonoa tiedostotehtävien tapaan siten, että typot yms pystytään jättämään huomiotta. Vihjeitä niihin ei ole tulossa, kertauksen tarkoitus on kerrata materiaalista (tai yleensä termeistä) miksi vastaus oli väärä.

Kertaustehtävien palautelaatikoista

Kertaustehtävien palautelaatikoissa on bugi joka estää palautteen antamisen tehtävään vastaamisen jälkeen. Koodi joka lukitsee itse tehtävän vastauskentän ja vastausnapin lukitsee vahingossa myös palautelomakkeen. Laitettu korjauslistalle,

Viikko 3 (2. materiaali)

Kiitos jälleen kaikille palautetta antaneille, vastineet alla.

Ehtoarkkitehti ja ISO LUKU

Tässä tehtävässä aiheuitui selkeästi pientä tyylisäännöllistä hämmennystä siitä, että Pylintin mielestä luku-muuttujan nimi pitäisi kirjoittaa isolla. Kyseessä ei ole selkeästikään vakio, koska siihen otetaan arvo käyttäjältä, eli nimi tulee kirjoitta pienellä. Virhe syntyy siinä, että Pylin tulkitsee nimen käyttötarkoituksen väärin. Pylintin mielestä kaiken mikä määritellään pääohjelmatasolla pitäisi olla funktioita ja vakioita, missä se ei suoranaisesti ole täysin väärässä, mutta näin alkeiskurssille tuo valitus ei ole täysin yhteensopiva, koska me joskus teemme pelkkiä pääohjelmia. Ykkösharkan tarkistimista tuo valitus on itse asiassa otettu pois päältä, ja sama tehdään tällekin tarkistimelle niin ei tarvitse ihmetellä jatkossa tätä.
Tehtävän tarkistimessa oli myös varsinainen virhe jonka takia se ei osaa parsia tulostuksia oikein jos tulostettavan merkkijonon perässä on välilyönti. Tämäkin korjataan.

Meta-if

Tehtävässä ei ollut ehkä ihan tarpeeksi teroitettu sitä mistä vastaus pitäisi etsiä. Linkki metodilistaanhan löytyy siis metodi-termin kuvauksesta, josta on nyt lisätty maininta. Olisi sen linkin voinut suoraankin lisätä, mutta haluttiin välillä vinkata että niitä termiselityksiä kannattaa kurkkailla relevanttien linkkien toivossa.

Käärmeen kieli ja vertailuoperaattorit

Tässä tehtävässä ei tarvita vertailuoperaattoreja, koska riittää että molemmat sanat esiintyvät yli nolla kertaa. Koska nollan totuudellisuusarvo on epätosi, ja kaikkien muiden numeroiden tosi, pelkkä count-metodikutsun tulos antaa ehtolauseelle kaiken informaation mitä se tarvii.

Viikko 2 (1. kertaustehtävät ja 1. harjoitukset )

Kertaustehtävien mekanismista

Kuten palautteissa mainittu, kertaustehtävien mekanismi heittää koko sarjan alkuun ei ole ihan ideaali. Tuo mekanismi on kuitenkin aika syvällä kertayssysteemin koodissa joten sen muuttaminen ei ole ihan pikkuhomma. Hieman pikaisempi korjaus on harkinnassa, mutta se ei vielä tälle syksylle valitettavasti ehdi.

"Käytä funktiota x moduulista y" -kertaustehtävät

Näihin tehtiin hieman lisäselvennystä. Tarkoitus oli siis kirjoittaa funkiokutsu, jossa käytetään moduulin funktiota sillä oletuksella, että moduulin import on jo tehty aiemmin koodissa. Eli tämän tyylisiä rivejä haettiin: tulos = random.randint(1, 10).

Palautteet tarkistimen toiminnasta

Jonkin verran palautteissa oli tarkistimiin kohdistunutta vihaa ja ihmettelyä miksi omalla koneella toimiva vastaus ei kelpaa. Asiaa on varsinaisesti käsitelty täällä. Oleellisempaa on kuitenkin muistaa, että palautteet ovat anonyymeja. Koska palautteesta ei näe kuka sen on antanut, on myös mahdoton jäljittää millaista vastausta tarkistin ei hyväksynyt. Eli jos tarkistimien toimintaan liittyvään kysymykseen haluaa myös vastauksen, se kannattaa esittää harjoituksissa, Mattermost-kanavalla tai sähköpostilla. Näihin vastaamme oikein mielellämme ja perustelemme samalla miksi tarkistin toimii kuin se toimii (tai korjaamme sen jos toiminnassa oikeasti oli puute).

Sininen funktio -tehtävän pääohjelma

Tässä tehtävässä arvojen syöttö pääohjelmaan aiheutti aika paljon ihmettelyä, kun lauseketta math.pi / 2 yritettiin antaa syötteeksi edellisten tehtävien mallilla tehdylle pääohjelmalle. Tästä syntyy ValueError, kun float-funktio yrittää tulkita tuota lauseketta liukulukuna. Tehtävänanto kuitenkin ehdottaa, että arvot pitäisi antaa muuttujille suoraan, eli tehtävässä ei itse asiassa tarvi lainkaan syötteiden kyselyä, eli siis näin:
sade = 1
kulma = math.pi / 2
print(muunna_xy_koordinatteiksi(kulma, sade))
Sekaannus on helposti ymmärrettävä, koska kaikissa muissa tehtävissä käytettiin inputia. Korjataan tehtävänantoon lukuavot, jotka voi syöttää ohjelmalle kun sen suorittaa.

Viikko 1 (esitehtävät ja materiaali 1)

Palautetta oli kertynyt opiskelijamäärään nähden vähän köyhänlaisesti, mutta pari oleellista vastattavaa joukkoon mahtui kuitenkin. Kiitos siis palautteista kaikille niitä antaneille, taas saatiin materiaalia vähän paremmaksi.

IPythonin asennus

Huomasimme itsekin pienen puutteen asennusohjeessa, eli tieto siitä, että IPython tulee asentaan järjestelmänvalvojen oikeuksilla, oli mainittu lähinnä sivulauseessa ja kaiken lisäksi vasta komennon esittelyn jälkeen. Tätä puutetta on nyt paikkailtu lisäämällä ohjeisiin mm. kuvaruutukaappaus siitä miten terminaali käynnistetään järjestelmänvalvojan oikeuksilla, tähän malliin:
Lisäksi lisätty maininta siitä, että pip saattaa sennuksen yhteydessä kaipailla itsestään uudempaa versiota. Tämä ei ole siis pakollinen korjattava juttu, mutta halutessaan sen voipi korjata seuraavalla loitsulla:
pip install --upgrade pip

Välilyönnit tarkistimissa

Tämä on käsitelty aiemmassa vastineessa, vastaus ei ole siitä muuttunut.

Syksy 2018

Syksyn palautevastaukset tulevat tänne. Auta sisällöntuotannossa antamalla palautetta.

Vastine syksyn 2018 kurssipalautteeseen

Palaute itsessään on hyvin positiivista, mutta palautetta antoi vain n. 10% osallistujista, joista lähes kaikki niitä, jotka myös suorittivat kurssin onnistuneesti. Yleisesti ottaen palauteaktiivisuus oli (todella paljon) heikompaa myös kurssin aikana verrattuna aiempiin vuosiin. Lisäksi kurssin suoritusprosentti syksyltä oli todella heikko, mille taas syy ei palautteista selviä. Yleisesti kurssin keskeytyksen syyksi siteerataan työmäärää, mutta kuitenkin (pääasiassa) suorittaneiden keskuudessa kuormituksen arviointi näyttää tältä:
Kuormittavuuden arviointi, N=~40
Vastaajien joukko on koulutusohjelman suhteen hyvin värikäs, joten pelkästään jo valmiiksi ennen kurssi ohjelmoinnista kiinnostuneet eivät tätä taulukkoa muodosta. Myös aiempina vuosin jolloin palautteessa kysyttiin arviota tuntimäärästä, keskiarvo ja mediaanit pyörivät jossain hieman 100 tunnin alapuolella. En epäile etteikö olisi opiskelijoita joilla kurssissa menee yli 135 tuntia. Enkä myöskään epäile etteikö tuo taulukko näyttäisi vähän erilaiselta, jos palautetta antaisivat muutkin kuin kurssin suorittaneet. Palautteet ja kokemus kuitenkin viittaavat siihen, että työmäärä yksistään ei riitä selittämään roikkumaan jääneitä / keskeytettyjä suorituksia. Asiaa on käsitelty ensimmäisen alaotsikon alla.
Vastaan myös muutamaan yksittäisempään asiaan oman alaotsikkonsa alla tämän jälkeen.

Vapaus ei toimi

Vaikka vapautta tehdä tehtävät omaan tahtiin kotona sekä pelkästään ohjeellisia deadlineja on kiitelty positiivisissa palautteissa, löytyy negatiivisista yksi palaute, jonka kanssa on pakko olla samaa mieltä: "Ei sitovat deadline:t olivat tosi hyviä minulle, mutta koen niiden tuottavan enemmän haittaa joillekkin muille. Paljon tuli kuultua puolen vuoden aikana, kuinka paljon porukka jäi jälkeen eikä sen takia jaksaneet aloittaa tehtävien tekemistä." Saman voi deadlinejen lisäksi liittää opiskelijoiden yleiseen aktiivisuuteen sekä kysymysten esittämisen että palautteen antamisen suhteen.
Ennen syksyä 2018 deadlinet oli ilmoitettu ehdottomina, mutta jatkoaikaa myönnettiin niille ketkä sitä kysyivät varsin avokätisesti. Näihin kyselyihin vastaaminen viikottain tuntui vähän tyhmältä, joten päätin kokeilla ilmoittaa deadlinet ohjeellisina - iso virhe. Pienikin epävarmuus siitä onko ok jättää tehtävät roikkumaan (ts. opiskelija joutuu erikseen kysymään tästä) nähtävästi kannustaa pysymään deadlineissa paremmin. Tänä syksynä puolet opiskelijoista olivat jäljessä jo 1. materiaalin jälkeen. Siis yksi viikko kurssia kulunut, ja puolet opiskelijoista ovat jo jäämässä aikataulusta jälkeen. Tilanne ei ainakaan parantunut myöhemmillä viikoilla. Tutkimustulosten esittely siitä miten deadlineissa pysyminen korreloi positiivisesti kurssin läpäisyn kanssa ei tuottanut tulosta.
Yhtä mielenkiintoinen ilmiö on aktiivisuus avun kysymisessä. Kurssilla oli ennätysmäärä osallistujia, mutta samalla tehtiin toinen yhtä hämmentävä ennätys: harjoitusryhmissä kävi ennätysvähän porukkaa. Ei siis edes suhteellisesti, vaan ihan absoluuttisesti. Syynä ei ollut ainakaan ahtaus - vaikka luokkia oli varattu kaksi, edes yksi niistä ei ollut täynnä kuin harvoin (ks. myös harkkaryhmiä koskeva alaotsikko). Muutama vuosi sitten opiskelijoita oli puolet nykyisestä, mutta harkkaluokkia oli melkein aina käytössä kaksi. Samoin sähköpostilla ja slackissa kysymyksiä tuli harvemmin kuin vuosia sitten IRC:ssä jonne hakeutuminen vaati enemmän säätöä kuin kumpikaan nykyisistä avunpyyntötavoista. Tässäkään ei auttanut, vaikka kuinka pitkin kurssia kehotettiin opiskelijoita hakemaan apua ongelmakohtiin. Eli vapaus osallistua harkkaryhmiin ei tunnu toimivan.
Viimeinen havainto asiaa sivuten on kurssin aikasien palautteen antaminen. Palautesaagaan (tm) liittyy se, että aiempina vuosina palautelaatikot olivat tehtäviä, joten niihin vastaaminen oli osa sivujen suorituspalkkeja. Oli siis implikoitu, että palaute on pakollista ("pakko saada mittari täyteen"), vaikka siihen riittikin tyhjän palautteen lähetys. Nyt kun palautelaatikot oli vihdoin siirretty irrallisiksi tehtävisä, palautteide määriä aiempiin vuosiin ei viitsi edes vertailla. Tyhjästä on paha nyhjästä jne. Palautteen antaminen oli siis ihan yhtä vapaaehtoista, mutta esitettiin eri tavalla. Palauteaktiivisuus heijastui sitten myös loppupalautteisiin, jossa prosentit menivät puoliksi (20% -> 10%).
Yhteenvetona on siis pakko todeta, että vaikka vapaus on paperilla kaunis ajatus, se ei vaan toimi tämän tason opetuksessa. Täysin ehdottomat deadlinet ovat kuitenkin nekin aika ikäviä, ja osallistumispakko harjoituksiin on mahdoton ihan vain fysiikan lakien puolesta. Palautepakko sentään voidaan asettaa, ja asetetaankin, ainakin implikoivasti - luen mieluummin 100 palautetta joista 50% on tyhjiä, ja 10% on "miksi palaute on pakollista", kuin 0 vapaaehtoisesti annettua palautetta, ihan vain koska ne loput 40% sisältävät usein asiaa. Vaan mikäpä toimisi deadlineille ja osallistumisaktiivisuudelle? Tähänkin on itse asiassa vastaus muutaman vuoden takaa, jolloin kurssilla saavutettiin kaikkien aikojen korkein suoritusprosentti.
Tässä kokeilussa täyden vapauden sijaan annettiin valinta: harjoitusryhmät olivat pakollisia niille, jotka olivat deadlineista jäljessä. Harjoitusryhmiin siis paimennettiin ne, joille kurssin tehtävät tuottivat ongelmia, mutta niitä ei kuormitettu turhaan opiskelijoilla jotka eivät selkeästi apua tarvinneet. Jos systeemi oli niin hyvä, miksi se poistui käytöstä? Tuohon liittyy muutamakin tekijä, joista yksi keskeinen on se, että kurssiin sekä Lovelaceen tehtiin isoja muutoksia, jotka vaativat kaikki irtoavat resurssit. Tuo systeemi vaati nimittäin aika huomattavan määrän kirjanpitotyötä, koska harjoitusryhmiin osallistuminen kirjattiin paperilomakkeille, jotka piti syöttää käsin exceliin jne. Nyt kun kurssi on taas aika stabiilissa tilassa, tämä systeemi pyritään ottamaan ensi syksynä uudestaan käyttöön kunhan keksitään tapa jolla osallistumislistat saadaan digitaaliseksi. Tarkoitus olisi myös liittää systeemiin uusi optio, että riittävä aktiivisuus slackin korvaajassa voisi kuitata osallistumisvelvoitteen.
Toimenpide: jatkossa velvoitetaan opiskelijat käymään ohjauksessa, jos deadlineissa pysyminen ei onnistu.

Materiaalin ja tehtävien julkaisutahdista

Palautteissa oli toivottu jonkin verran, että julkaisutahti olisi ollut tiiviimpi, tai että se olisi ollut jossain nähtävillä. Tässä oli sellainen ongelma, että sitä ei tiedetty itsekään, koska materiaaliin tuli muutamia isoja muutoksia jolloin erityisesti nelosmateriaali piti kirjoittaa monilta osin kokonaan uudestaan. Pääasiassa sivuja siis julkaistiin sitä mukaa kun ne olivat valmiita. Tämä ongelma korjaantunee itsestään, koska suunnitteilla ei ole ensi syksylle mitään isompia mullistuksia.
Toimenpide: ensi syksynä materiaali on vakaammassa tilassa ja voidaan julkaista järjestelmällisesti

Harjoitusryhmistä

Harjoitusryhmiin liittyi jonkin verran sekaannuksia/ongelmia johtuen tietokonejärjestelmät-kurssin kanssa yhteisistä järjestelyistä. Yleisesti ottaen tämä järjestely on hyödyllinen, koska siten saadaan enemmän harjoitusryhmiä kummallekin kurssille kuin pelkästään kurssin omilla resursseilla saataisiin. Negatiivista järjestelyssä tänä vuonna oli alun sekaannukset, koska luokkia oli aina kaksi varattuna (toinen OA:n ja toinen TKJ:n nimellä), mutta yleensä vain toinen käytössä vähäisen osallistujamäärän takia. Eli alkupäässä kurssia saatettiin eksyä tyhjään luokkaan ihmettelemään miksei siellä ole assareita. Tähän kuvioon haetaan ensi vuonna selkeytystä tavalla tai toisella - ongelma on kuitenkin enemmän byrokraattinen kuin meistä kiinni. Laitetaan kuitenkin ainakin se paperinen uudelleenohjauslappu väärän luokan ovelle heti alusta asti.
Toinen ongelma oli se yksi ainoa viikko jolloin harjoituksissa oli ruuhkaista. Tämä ajankohta oli se viikko, jolloin oli johdatus tietokonejärjestelmiin harjoitustyön deadline. Siihen liittyvät kysymykset ovat tyypillisesti aikaavieviä, joten assari voi olla samassa kohteessa jumissa vartin tai ylikin. Tämä täytyy todennäköisesti ratkaista lisäryhmillä.
Toimenpiteet: selkeytetään harjoitusryhmien jakamiskuviota, uudelleenohjauslappu väärän luokan oveen, lisäryhmiä pahimmalle viikolle

Lopputyöhön liittyvä ohjeistus

Lopputyösivut ovat tällä hetkellä aika rimanalitus verrattuna moneen muuhun asiaan kurssilla. Tähän ei ole oikein tarjota muuta syytä kuin hajamielisyys ja laiskuus, valitettavasti. Sivujen teksti on pitkälti peräisin ajalta kun lopputyöstä vielä annettiin pisteitä ja kurssista numeroarvosana. Se, että minimivaatimus on tämän jälkeen noussut ei oikein ilmene tekstistä kuin lukemalla kirjoittajan ajatukset. Lopputyösivujen uudelleenkirjoitus on jäänyt roikkumaan, koska lopputyöaiheet on ollut tarkoitus vaihtaa uusiin jo pari vuotta, mutta kurssissa ja Lovelacessa on ollut kiireelliseempää tuunattavaa.
Toiseksi se, että lopputyön deadline oli ehdoton oli huonosti (= ei lainkaan) ilmaistu kurssin etusivulla. Syy lopullisen deadlinen ehdottomuuteen löytyy käytännöstä: työt pitää ehtiä käsitellä ennen suoritusmerkintöjen antamista, joka taas mieluiten pitäisi tehdä ennen joululomaa. Käsittely palautekeskuteluineen ei ole ihan parin päivän homma, vaan siihen pitää varata pari viikkoa.
Toimenpiteet: lopputyöaiheita tuskin saadaan vieläkään uusittua, joten kirjoitetaan viimein ne lopputyösivut uusiksi. Deadlineihin lisätään selkeyttä.

Koodin laatutarkistuksesta

Koska kysyin tästä erikseen, vastataan myös erikseen. Yleisesti ottaen olin erittäin positiivisesti yllättynyt laatutarkistuksen vastaanotosta jo kurssin aikana, ja kirjallinen palaute siitä vahvistaa kuvaa ominaisuuden hyödyllisyydestä. Oli todella mahtavaa, että harjoituksissa oikeasti kysyttiin neuvoja laatutarkistimen huomauttamien asioiden korjaamiseen senkin jälkeen kun tehtävä oli jo läpi. Panostaminen koodin ulkoasuun näkyi viimeistään kurssin lopussa valtaosan lopputöistä ollessa helppoa luettavaa. Hyvä te!
Muutamat palautteenantajat eivät olleet työkalun kanssa ihan samaa mieltä. Tässä on hyvä pitää mielessä, että Pylint on "vain" Pythonin tyylistandardiin pohjautuva mielipide. Perustelut voi siis lukea tyylistandardista ja sen jälkeen päättää itse onko samaa mieltä. Pylintiä itse käyttäessä voi kytkeä haluamansa huomautukset myös pois päältä - itse asiassa muutamia on Lovelacen Pylint-konfiguraatiossa kytkettykin pois päältä. Tämän enempää en ole siis itse laatutarkistuksen sääntöjä asettanut.
Ainoa kauneusvirhe laatutarkistuksessa on se, että Pylint itse ei tue tekstin kääntämistä, joten varsinaiset huomautukset ovat englanniksi muuten suomenkielisen palautteen keskellä. Tämän korjaaminen vaatii vähän isompia ponnisteluja, mutta ehkä jonain vuonna.
Toimenpiteet: laatutarkistus pysyy käytössä nykymuodossa, ja toivon mukaan leviää muillekin kursseille.

Viikko 1 (esitehtävät ja materiaali 1)

Kuvalähde 8

Suoritustahdista

Tilastot näyttivät aamulla aika synkältä: alle puolet olivat tehneet 1. materiaalin viimeisen tehtävän. Toki etusivulla sanotaan, että aikataulu on viitteellinen, mutta jos jo tässä vaiheessa alkaa lagaamaan tehtävien kanssa voi olla aika varma, että muutaman viikon päästä tekemistä kasautuu niin paljon että motivoituneinkin monni jättää kurssin kesken. Tein pedagogisten opintojen osana tutkimuksen siitä, mitkä tekijät vaikuttavat kurssin läpäisyyn. Kaikki muut mittarit paitsi tehtävien ajoissa palauttaminen olivat tilastollisesti yhdentekeviä. Opiskelijat, jotka eivät saaneet lopputyötä palautettua olivat keskimäärin päivän jäljessä palautuksissa niitä, jotka saivat lopputyön palautettua, ja selkeästi useammin palauttivat tehtävät deadlinen jälkeen.
Eli nyt välittömästi ottamaan tahdista kiinni. Harjoituksissakin näkyi sen verran vähäisesti porukkaa, että syytä huoleen on jo tässä vaiheessa. Alkupään tehtävät ovat vielä sen verran kevyitä, että viikossa voi hoitaa ykkösmateriaalin loppuun ja tehdä harjoituksetkin.

Matikkaa ei löytynyt

Tämän tehtävän kohdalla ei selkeästikään ollut kovin selvää miten se kuuluisi tehdä:
Tehtävä on uusi joten se ei ole varmastikaan selkein mahdollinen ja sitä on nyt päivitetty parikin kertaa palautteiden perusteella. Näissä tapauksissa kannattaisi aina kysyä ajoissa. Hyvin harva tästä kysyi sähköisesti - harjoituksessa muutamat. Kysykää. Materiaalitehtävissä ei kuuluisi mennä muutamaa minuuttia pidempään. Niihin on ihan turha hakata päätä seinään - jos ei mene oikein, kannattaa lukaista uudestaan mitä tehtävässä ja sitä ennen sanottiin, ja sitten lähettää kysymystä Slackiin kurssin kanavalle jos ei vieläkään aukea.
Huonosti ymmärrettävä tehtävänanto on meidän vika, mutta jos jankkaat samaa tehtävää tunnin kysymättä, turhautumisesta on vähän vaikea syyttää ketään muuta kuin itseään. Myöskin mitä enemmän tehtävistä kysytään, sitä nopeammin saamme niiden tehtävänantoja hiottua.

Palautteet epäselvistä tehtävänannoista

...ovat erittäin aiheellisia ja haluamme niitä jatkossakin. Ne olisi kuitenkin hyvä kirjoittaa vähän tarkemmin ja kohdistaa epäselvän tehtävän omaan palautelaatikkoon (esim. kertoa mikä osa oli harhaanjohtava, tai mistä ei kerrottu tarpeeksi). Jos sivulla on 20 tehtävää ja sivukohtaisessa palautteessa lukee "osa tehtävänannoista oli epäselviä", tällä informaatiolla on aika vaikea lähteä paikantamaan missä vika. Varsinkin kun meille nämä tuppaavat olemaan vuosien jälkeen aika lailla selkeitä.

Harjoitusluokkien käytöstä

Selvennetään vielä kertaalleen, että kurssi jakaa harjoitukset toisen kurssin kanssa (johdatus tietokonejärjestelmiin) joten toisessa harjoitusluokassa lukee ovella Ohjelmoinnin alkeet, ja toisessa Johdatus tietokonejärjestelmiin. Kuitenkin tästä viikosta eteenäin pitäisi melkein aina olla sekä TS135 että TS137 varattuna. Näistä TS137 täytetään ensin - niin kauan kuin sinne mahtuu. Torstain aamuharkassa tosiaan kävi ikävästi niin, että emme hoksanneet käydä katsomassa onko TS135:ssä ketään, kun TS137:ssa oli aika vähän opiskelijoita eikä TS135:ssä näyttänyt olevan valoja päällä. Pahoittelut tästä kaikille torstaiaamuna luokassa TS135 olleille.

Selkeyttä käytettäviin ohjelmiin

Kurssilla käytetään lähinnä kahta ohjelmaa:
terminaalia
ja tekstieditoria. Lisäksi terminaalin sisällä käynnistetään Pythonia kahdella eri tavalla: interaktiivisena
tulkkina
sekä ajamaan yksittäinen kooditiedosto. Isoin osa materiaalitehtävistä pyöritellään interaktiivisessa tulkissa paitsi ne joissa pyydetään lataamaan tai palauttamaan tiedosto - tällöin pitäisi suorittaa kooditiedosto terminaalissa (ts. mennä oikeaan kansioon ja lausua ipython kooditiedosto.py. Kannattaa opetella nyt heti käyttämään Pythonia terminaalista eikä esim IDLEä tai availla tiedostoja kaksoisklikkaamalla.

Korjauksia

Windowsin terminaali on ilmeisesti viimein saapunut nykyaikaan, joten esitehtävien ensimmäisen tehtävän ohjetta on päivitetty vastaavasti. Kukkalähetystehtävässä ollut linkki osoitti vuoden 2016 esitehtäviin joita ei edes ole enää, tämäkin on korjattu.

Viikko 2 (kertaustehtävät 1 ja harjoitukset 1)

Kuvalähde 9

"Redefining name from outer scope"

1. harjoituksessa koodin laatutarkistuksissa tuli monilla vastaan otsikon mukaisia varoituksia. Sinällään ihan ymmärrettävää, koska kurssilla ei opeteta että se olisi väärin, ja esimerkeissäkin saattaa näkyä sama nimi pääohjelmassa ja funktion sisällä. Käsittelen nyt tässä mitä ongelmia tästä voi seurata, jonka jälkeen jokainen voi itse miettiä ottaako varoituksesta vaarin vai ei.
Potentiaaliset ongelmat liittyvät siihen, että Pythonissa
pääohjelmatason
muuttujat
ovat luettavissa myös funktioiden sisällä. Tutkitaan tätä harjoitusesimerkin kautta.
ball.py
import math

def calculate_area(radius):
    return 4 * math.pi * radius ** 2

def calculate_volume(radius):
    return 4 / 3 * math.pi * radius ** 3

def calculate_radius(circumference):
    return circumference / (math.pi * 2)

def calculate_ball_properties(circumference):
    radius = calculate_radius(circumference)
    area = calculate_area(radius)
    volume = calculate_volume(radius)
    return area, volume
    
measurement = float(input("Enter ball circumference: "))
ball_area, ball_volume = calculate_ball_properties(measurement)
print("Volume:", round(ball_volume, 4))
print("Surface area:", round(ball_area, 4))
Esimerkissä on laske_sade-
funktio
, jonka
parametrilla
on sama nimi kuin pääohjelman muuttujalla. Tämä ei itsessään ole ongelma - paikallinen muuttuja ajaa aina omassa kontekstissaan pääohjelmatason muuttujan yli. Jos kuitenkin jostain syystä päätetään vaihtaa parametrin nimi, mutta unohdetaan vaihtaa funktion sisällä olevassa laskussa oleva nimi, eli funktiosta tehdään seuraavanlainen:
def laske_sade(p):
    return piiri / (math.pi * 2)
Tämä ei aiheuta mitään poikkeusta, koska piiri-nimelle löytyy edelleen arvo - pääohjelmasta. Ongelmaksi tämä muodostuu siinä vaiheessa, jos funktiota halutaan käyttää useampia kertoja - mitä tarkistimet aina tekevät. Asiaa voi tarkastella
Python-tulkissa
jos se avataan samassa kansiossa mihin pallo.py tallennettiin:
In [1]: import pallo
Anna pallon ympärysmitta: 23
Tilavuus: 205.4625
Pinta-ala: 168.3859
Tässä on tehty oman
moduulin
käyttöönotto
importilla
(asiasta enemmän nelosmateriaalissa). Tähän asti kaikki näyttää samalta kuin esimerkissä, eli ohjelma laskee oikein. Jos kuitenkin kokeillaan laskea toisen pallon ominaisuudet käyttämällä suoraan pallo-moduulin laske_pallon_ominaisuudet-funktiota:
In [2]: pallo.laske_pallon_ominaisuudet(5)
Out[2]: (168.38592979122527, 205.46247356272062)
Saadaankin samat tulokset kuin aiemmin, vaikka pallon piiri on huomattavasti pienempi. Pieleen menee nyt juuri se, että piiri-muuttujalle saatiin arvo kun moduuli otettiin käyttöön, eikä sitä sen koommin muuteta. Joten nyt virhe laske_sade-funktiossa aiheuttaakin sen, että funktio tuottaa vääriä tuloksia ilman mitään ilmoitusta virheestä. Jos oletataan, että funktion parametrin nimi olisi ollut lähtöjään joku muu, esim pallon_piiri ja tehtäisiin sama virhe eli unohdettaisiin muuttaa funktion sisällä käytetty nimi kun parametrin nimi muutetaan p:ksi:
def laske_sade(p):
    return pallon_piiri / (math.pi * 2)
Tapahtuukin jotain ihan muuta kun moduuli koitetaan ottaa käyttöön:
In [1]: import pallo
Anna pallon ympärysmitta: 23
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-1-ac4e3db266df> in <module>()
----> 1 import pallo

/media/sf_virtualshare/OA/code/pallo.py in <module>()
     17 
     18 piiri = float(input("Anna pallon ympärysmitta: "))
---> 19 ala, tilavuus = laske_pallon_ominaisuudet(piiri)
     20 print("Tilavuus:", round(tilavuus, 4))
     21 print("Pinta-ala:", round(ala, 4))

/media/sf_virtualshare/OA/code/pallo.py in laske_pallon_ominaisuudet(piiri)
     11 
     12 def laske_pallon_ominaisuudet(piiri):
---> 13     sade = laske_sade(piiri)
     14     ala = laske_ala(sade)
     15     tilavuus = laske_tilavuus(sade)

/media/sf_virtualshare/OA/code/pallo.py in laske_sade(p)
      8 
      9 def laske_sade(p):
---> 10     return pallon_piiri / (math.pi * 2)
     11 
     12 def laske_pallon_ominaisuudet(piiri):

NameError: name 'pallon_piiri' is not defined
Eli nyt tästä salakavalasta virheestä saadaankin kunnollinen virheilmoitus, koska funktio ei pysty vetäisemään "korvaavaa" saman nimistä muuttujaa pääohjelmasta. Toinen tapa millä nämä ongelmat voi myös välttää on se, että varsinaisen pääohjelman sijaan tekeekin pääohjelmafunktion (yleensä nimeltään main) johon sijoitetaan pääohjelman koodit, ja itse pääohjelmaan jää pelkkä main-funktion kutsu:
pallo.py
import math

def laske_ala(sade):
    return 4 * math.pi * sade ** 2
    
def laske_tilavuus(sade):
    return 4 / 3 * math.pi * sade ** 3

def laske_sade(piiri):
    return piiri / (math.pi * 2)

def laske_pallon_ominaisuudet(piiri):
    sade = laske_sade(piiri)
    ala = laske_ala(sade)
    tilavuus = laske_tilavuus(sade)
    return ala, tilavuus
    
def main():
    piiri = float(input("Anna pallon ympärysmitta: "))
    ala, tilavuus = laske_pallon_ominaisuudet(piiri)
    print("Tilavuus:", round(tilavuus, 4))
    print("Pinta-ala:", round(ala, 4))
    
main()
Nyt ainoat pääohjelmatason nimet kuuluvat funktioille, joten saman virheen tekeminen tuottaa jälleen NameError-
poikkeuksen
. Meidän ei nyt myöskään tarvitse alkaa keksiä eri nimiä piirille "varmuuden vuoksi", koska jokainen koodissa oleva piiri on paikallinen muuttuja. Koodin laatutarkistuksesta vastaava Pylint-ohjelmakin on nyt tyytyväinen. Tätä ratkaisua voi vapaasti käyttää harhoitustehtävissä, jos laatutarkistuksessa olevat varoitukset ahdistavat - tarkistimille on ihan sama löytyykö pääohjelma pääohjelmasta, vai onko se funktio jota kutsutaan pääohjelmassa.
Tämä esimerkki on tietenkin hyvin tekaistu, koska funktiossa on huikea yksi rivi koodia määrittelyn lisäksi, mutta tämän kaltainen ongelma saattaa olla todellinen isommassa projektissa, jossa ei kerralla pysty näkemään kaikkea koodia. Erityisesti jos koodia editoi huolimattomasti.

Muuta laatutarkistuksesta

Laatutarkistukset tehdään Pylint-nimisellä työkalulla, joka puolestaan pohjautuu Pythonin tyylioppaaseen. Sen kommentit ovat aina jossain määrin mielipiteitä, mutta yleisesti ottaen niiden seuraaminen johtaa koodiin jota on mukavampi muokata ja josta on mukavampi etsiä virheitä. Erityisesti varoitukset (varoituskolmioikoni) ja rakenteelliset virheet (vasaraikoni) on syytä ottaa miettiä tarkkaan. Varoitukset tulevat siis koodista, jolla on potentiaalia aiheuttaa mysteeribugeja, joiden selvitys on usein paljon tuskallisempaa kuin sellaisten, joista tulee selkeä virheilmoitus koodia suorittaessa.

Tulosten pyöristys

Tehtäviä lukiessa on hyvä kiinnittää huomiota siihen missä kohdassa pyöristystä pyydetään. Joissain palauteissa oli huomauteltu, että esim Kuviokimarassa funktiotarkistin haluaa pyöristämättömän arvon jolloin funktio, joka pyöristää antaa tietenkin vääriä tuloksia. Tehtävässä kuitenkin pyydetään pyöristämään vain pääohjelman tulostus. Tässä on sama periaate kuin matematiikassa yleisesti: välituloksia ei pyöristetä. Funktion paluuarvo ei ole tässä tehtävässä varsinaisesti välitulos, mutta se voisi olla. Normaalisti pyöristykset tehdään aina silloin, kun numero halutaan esittää, ei yhtään aikaisemmin.
Sen sijaan Sininen funktio -tehtävässä pyydetään tekemään pyöristys funktion sisällä, koska funktion halutaan olevan työkalu, joka tuottaa kokonaislukuja. Tällöin pyöristys vaaditaan, että kokonaisluvuksi muuttaminen ei pyöristä väärään suuntaan.

Kertaustehtävistä

Käsitelty aiemmin, ks:

Korjauksia

Kuviokimarassa oli ongelma, joka aiheutti koko sivun kaatumisen (500 - server error). Tämä tapahtuu tietynlaisten väärien vastauksien kanssa, koska palautteessa on kuva. Kuvien näyttämisen koodi on muuttunut kesän aikana, mutta muutos oli unohtunut tehdä tarkistinpalautten näyttämiseen. Korjaus on tehty ja ilmestynee Lovelaceen piakkoin.

Viikko 3 (materiaali 2)

Viikon mysteeri: .{}.

Johtuen koodiesimerkkien syntaksivärjäyksen muotoilusta Lovelacessa, osa oli päätynyt tulkitsemaan, että paikanpitimissä olisi aaltosulkeiden lisäksi piste ennen ja jälkeen. Sinänsä ihan ymmärrettävää koska koodiesimerkin alleviivaus näytti varsin harhaanjohtavalta:
Vanha syntaksivärjäys paikanpitimille
Jos tietää miten monospace-fontit toimivat, tuossa ei mitenkään mahdu olemaan pistettä. Saman voi selvittää maalaamalla kooodia hiirellä jolloin näkee, että kyseessä on vain alleviivattu aaltosulje eikä kaksi merkkiä. Sekaannus on kuitenkin hyvin ymmärrettävä, eikä paikanpitimien alleviivaus ole mitenkään yleinen tapa merkitä niitä. Muotoilua on nyt vaihdettu niin, että paikanpitimet värjätään turkoosilla alleviivauksen sijaan:
Uusi syntaksivärjäys paikanpitimille

Palautteen määrästä

Kaikki halusivat poistaa palautelaatikot varsinaisten tehtävien joukosta, ja nyt kun näin lopulta tehtiin, palautteen määrä on romahtanut... Näin niistä hyvistä teoista rangaistaan. Taidetaan koodata niin, että palautte lasketaan suorituspalkkiin mukaan ensi vuonna niin voitte sitten valittaa asiasta palautteeseen XD. Meillä on ikävä kaikkia hyödyllisiä ja/tai viihdyttäviä palauteviestejä.

Korjauksia

Tehtävään "Inventaariohakuteos" on lisätty muutamia vihjeitä, koska aika monet väärät vastaukset eivät osuneet nykyisiin. Ihan täydellinen se ei vieläkään ole - jos koodinpätkässä on useita eri virheitä, niistä mistään ei välttämättä saa vihjettä.

Viikko 4 (harjoitukset 2)

Korjauksia

Palautetta oli sen verran vähäisesti, että juuri muuta raportoitavaa ei ole kuin muutama korjaus. Piiritehtävässä varsinkin oli muutamia puutteita sekä tarkistimessa että tehtävänannossa, jotka on nyt paikkailtu. Samalla tarkistin antaa nyt kohtalaisen järkeviä arvoja konkille ja keloille. Ehkä hienoin virhe tehtävissä oli eksynyt heksatehtävään, jossa puuttui kohtalaisen kriittinen "pituus"-sana lauseesta "halutun merkkijonon saadaan jakolaskulla" joten ei sinänsä ihme, että useampi yritti jakaa merkkijonoa neljällä (mistä tulee TypeError).
Liikkeen hallintaa -tehtävässä myös tehtiin selvemmäksi, että objektilla on tarkistuksessa muitakin lähtöpisteitä kuin 0, 0 - kyseinen pistehän on erikoistapaus, koska siinä ollessa koordinaattien muutos on sama kuin uusi sijainti - mistä siis taas tuli vastauksia, jotkat eivät toimineet kaikissa testeissä. Viimeisenä pienenä korjauksena lopputyötehtävien fluffitekstissä olevat linkit yrittivät johtaa vuoden 2016 versioihin sivuista, joita ei ole enää olemassa. Nekin on nyt korjattu siten, että eivät enää ensi vuonnakaan sekoile.

Viikot 5-7 (materiaalit 3 & 4, harjoitukset 3)

Palautetta on ollut sen verran laihanlaisesti, että vastauksiakin on vähän huono kynäillä. Ahkerimmat ovat bongailleet hyvin kirjoitus- ja muita virheitä tehtävästi, mistä iso kiitos kuitenkin. Näitä on korjailtu sitä mukaa kun havaittu asiaan liittyvä palaute.

Muutokset 2017 -> 2018

Tähän on koottu tietoa kurssille tehdyistä muutoksia. Toivomme, että näiden näkeminen rohkaisee antamaan palautetta jatkossakin.

Sisältöremontti

Ehdottomasti suurin muutos kurssilla on asioiden laittaminen kirjaimellisesti uuteen järjestykseen. Muutoksen tavoitteena on ollut lieventää kolmannen materiaalin aiheuttamaa kynnystä jakamalla siellä olevia asioita sekä aiempiin että myöhempiin materiaaleihin. Toivon mukaan materiaaleihin ei ole jäänyt kauheasti aikaparadokseja - siis tilanteita joissa materiaali viittaa aiempaan, joka on siirretty uudistuksessa jäljempään. Lista merkittävistä siirroista on esitetty alla
Muutosten seurauksena luonnollisesti sekä materiaalin esimerkit että harjoitustehtävät ovat kokeneet muutoksia toteutuksessa. Esim. kolmannen materiaalin kokoelmaohjelmassa levyt esitetään suoraan sanakirjoina, kun aiemmin tämä muutos tehtiin vasta nelosmateriaalissa. Asioita ja vaiheita on siis myös jonkin verran pudonnut välistä pois. Toivon mukaan opiskelukokonaisuus on nyt tasapainoisempi, ja alkupään harjoitustehtävissä on enemmän mielekkyyttä kun käytettävissä oleva työkalupaketti on hieman monipuolisempi.

Muutokset harjoituksiin

Harjoituksia on pääasiassa uudistettu siten, että ne käyvät järkeen sisällön uuden järjestyksen kanssa. Joitain vanhoja tehtäviä on korvattu uusilla. Suurimpana muutoksena tiedostotehtäviin on lisätty koodin laadun tarkastus Pylintillä. Tarkistin kokoaa Pylintin antamat viestit sekä koodin pisteytyksen palautteen loppuun. Ainakaan toistaiseksi laatutarkistusta ei käytetä läpäisykriteerinä, mutta informaatiosta saattaa olla hyötyä hyvän koodaustavan opettelussa. Lisäksi Pylintin varoitukset saattavat olla hyödyllisiä bugeja kohdatessa, koska bugi saattaa hyvinkin johtua jostain mitä Pylint pitää epäilyttävänä. Pylint ei itsessään osaa suomea, joten sen viestit ovat tällä hetkellä englanniksi.

Muutokset kertaustehtäviin

Kertaustehtävät mainittakoon erikseen kun niistä oli kohtalaisesti keskustelua palautteissa. Toistaiseksi nämä säilyvät ennallaan, koska ne ovat hyödyllisiä juuri niille opiskelijoille jotka niitä eniten tarvitsevat. Useimmista on toistojen määrää vähennetty ja kaikki säädetty niin, että eivät välitä siitä miten paljon tai vähän välilyöntejä vastaukseen on lyöty. Kertaustehtäviin on mietitty uusi mekanismi, mutta Lovelacen päivitystöissä oli kriittisempiä ominaisuuksia eikä kertaustehtävien mekanismiin asti ehditty muutostöissä. Ensi vuodelle toivottavasti ehtii. Kertaustehtävissä ihmetystä aiheuttanut -ei argumentteja- on myös historiaa - nyt kysymysgeneraattori osaa sanoa ihan suomeksi "ilman argumentteja".

Muutokset Lovelaceen

Opiskelijoille näkyviä muutoksia on lähinnä se, että kursseille pitää nykyään ilmoittautua, jolloin opiskelijan vastaukset kiinnittyvät oikeaan kurssiin ja kurssin toteutukseen. Ilmoittautuminen tapahtuu Lovelacen etusivulta. Kurssin ilmoittautumiset hyväksytään automaattisesti. Tehtäviin voi toistaiseksi vastata vaikka ei olisi ilmoittautunut, mutta ilmoittautumattomat opiskelijat eivät näy kurssin suoritustaulukossa joten suoritusmerkintää ei voida antaa. Huom. ilmoittautuminen kurssin aikana riittää, ei tarvitse panikoida jos tekee tehtäviä ensin ja vasta sitten hoksaa ilmoittautua.

Palautelaatikot

Pelastaja saapui ja toi mukanaan materiaalien loppuun palautelaatikot, jotka eivät ole tehtäviä. Valitukset siitä, että sisällysluettelossa sivu näkyy kokonaan tehtynä vasta kun palaute on annettu on siis historiaa (no, melkein, keskenään vaihtoehtoiset tehtävät eivät edelleenkään oikeasti kytkeydy toisiinsa siten että yhden tekeminen laskisi kaikki tehdyiksi). Toivottavasti tämä ei kuitenkaan vähennä intoa kirjoitella palautteita, oli niissä sitten asiaa tai tekstiä asian vierestä. Voitte myös tältä sivulta todeta, että meillä on tapana myös reagoida palautteisiin.

Arkisto: Kesäkurssi 2018

Kesäkurssin palautevastauksia ei ole eritelty viikottain vaan vastauspäivittäin.

3.8.2018

Notepad++ asetusohje

Joku laiska ja/tai hajamielinen kurssin vetäjä ei ole muistanut päivittää tätä ohjetta. Notead++ uudemmissa versiossa koko Tab settings -välilehteä ei ole asetuksissa. "Tabs to spaces"-asetus löytyy sen sijaan Language-välilehdestä. Muutos ei mielestäni ole mitenkään looginen, mutta voisi sen silti ohjeisiin päivittää... Ohje on nyt päivitetty.

Erotustuomari-tehtävä

Kolmosharjoituksista poistettiin otsikossa mainittu tehtävä, mutta unohtui päivittää pois sitä seuraavien tehtävien viittaukset tuohon tehtävään. Tehtäviin on nyt kirjoitettu ohjeet kokonaisten funktioiden kirjoittamiselle.

2.8.2018

"muuttuja on arvon nimi"

1. kertaustehtävässä 1. vastausvaihtoehto on osoittautunut vaikeammin ymmärrettävksi kuin tehtävää tehdessä ajattelin... Lainaan palautteista suoraan
Tuo ensimmäinen kohta "Muuttuja on arvolle annettu nimi" on pilkkua viilaten kyllä harhaan johtava joko opetusmateriaalissa tai tässä harjoituksessa. Sillä opetusmateriaalista sanatarkka lainaus:

"Pythonille on ominaista, että muuttuja on vain ja ainoastaan nimi, jolla viitataan johonkin arvoon." Sekä sen perässä seuraavat painotukset, kuinka sillä vain viitataan muistipaikkaan - eikä itse arvoa ole siten nimetty.
Tapa miten tuo koko ajattelun on tarkoitettu ymmärrettäväksi on se, että asioiden nimet ovat itsessään vain viittauksia asioihin joille ne annettu, eli nimi ei sisällä asiaa itseään. Tämä siis vastakohtana sille ajattelulle (joka joidenkin kielten kanssa on oikeampi) että muuttuja sisältäisi arvon, jolloin niiden suhde on syvempi kuin pelkkä nimeäminen.
Halusin vain täsmentää tämän. Palautteen antaja on nimittäin oikeassa siinä, että tuo vaihtoehto on tarpeettoman epämääräinen ja vaikeasti käsitettävä jos ei satu asumaan kirjoittajan pään sisällä. Vaihtoehto korvataan uudella tekstillä. Kiitos palautteesta.

Avainsana-argumentti ja sijoitusoperaattori

Toisen materiaalin tehtävässä "Paljonko kellon on?" voi käyttää
avainsana-argumentteja
, mikä on ihan oikein. Tehtävässä kuitenkin hylätään tyylisyistä vastaus jossa avainsanojen sijoituksessa on välilyönnit ympärillä, ts. ...format(tunnit = tunnit, minuutit = minuutit). Avainsana-argumentit (ja
oletusarvot
) ovat poikkeuksia normaaliin välilyöntisääntöön, ja tyylioppaan mukaisesti välilyöntiä ei tule käyttää niiden kanssa lainkaan. Tehtävästä vain oli unohtunut vihje, joka kertoo tästä - se on nyt lisätty.

Arkisto: syksy 2017

Viikko 1 (esitehtävät ja 1. materiaali)

Kuvalähde 1

Niistä palautelaatikoista

Palautelaatikot näkyvät tehtävinä, koska nykyinen systeemi mahdollistaa palautteiden liittämisen ainoastaan tehtäviin... niinpä palautteet on tehty tehtävinä. Niihin ei ole pakko vastata, mutta meistä on mukavaa lueskella palautteita, joten toivon mukaan naputtelette sitä jatkossakin! Tällä sivulle pyrimme myös osoittamaan, että huutelut eivät mene ö-mappiin. Toimikoon täysi vihreä palkki pienenä lisämotivaattorina täyttää myös palaute.
Oikea palautesysteemi on tulossa, joskus, ehkä. Tärkeämpiäkin ominaisuuksia on TODO-listalla ja kehitysbudjetti on kengännauhatasoa.

Aloitusluennon ahtaudesta

Kurssille tuli yllättäen, ja aika viime tipassa, n. 130 ilmoittautumista enemmän kuin odotettiin aiempien vuosien perusteella. Tarkistin luvut vasta luennon jälkeen, ja olin pudota tuolilta kun oodissa näkyi 350 ilmoittautumista. Toki IT115 on aika käpy sali jollekin 200 opiskelijallekin ja aiemminkin on ollut ahdasta, joten olisi pitänyt älytä jo pyytää isompi sali joka tapauksessa.
Laadukkaasti myös sähköpostiohjelma oli vetänyt itsensä offline-tilaan kun luulin lähettäväni infomailin osallistujille, ja huomasin vasta keskiviikkona, että eihän se ollut lähtenyt lainkaan.
Hyvänä uutisena aloitusluennolla olleet informaatiot löytyvät Lovelacesta kurssin etusivulta ja 1. materiaalin alusta. Toisena hyvänä uutisena loput maanantailuennot ovat salissa L1.

Ensimmäinen Turtle-tehtävä

Not responding...

Tämän tehtävän piti olla helppo ja interaktiivinen perehdytys siihen, miten koneelle annetut käskyt tekevät asioita. Muuten hyvä, mutta useimmilla kävikin niin, että Turtlen piirtoikkuna ilmestyi ConsoleZ-ikkunaan taakse ja Windows ilmoitti siitä iloisesti, että ohjelma ei vastaa. Tämä oli meille kovasti hämmentävää, koska aiempina vuosina tehtävä on toiminut ihan nätisti.
Se, että ikkuna ei vastaa, on ihan normaalia toimintaa Turtlen kanssa. Ongelmana olikin se, että ConsoleZ:n uusin versio avaa Turtle-ikkunan itsensä alle, jolloin se jää piiloon eikä sitä pysty tuomaan esiin muuten kuin siirtämällä konsoli-ikkunan pois sen päältä. Jos saman tehtävän tekee vanhemmassa versiossa tai Windowsin cmd:ssä, Turtle-ikkuna aukeaa terminaali-ikkunan päälle jolloin sitä, että ikkuna ei vastaa ei edes huomaa.
Teknisempänä selityksenä siitä kiinnostuneille: Turtle toimii siten, että se käyttää TKinter-käyttöliittymäkirjastoa avatakseen ikkunan ja piirtääkseen siihen. TKinter ikkuna kuitenkin tulee aktiiviseksi vasta kun se käynnistetään, ja tämä on se mitä Turtlen done()-komento tekee. Käynnistyksen jälkeen itse Python-tulkki on kuitenkin varattu Turtle-ikkunan pyöritykseen, joten siihen ei voida enää kirjoittaa komentoja ennen kuin ikkuna suljetaan. Näin siis Turtlella piirretään ikkunaan, joka ei ole aktiivinen, ja Windows ei tätä oikein osaa käsitellä. Linuxilla kaikki vain toimii (mikä on koodaushommissa aika tyypillistä).

Tarkistus

Tehtävän tarkituksessa löytyi useita koodeja, jotka piirsivät neliön, mutta eivät menneet läpi. Joitain näistä lisättiin hyväksyttyihin, mutta osa on käytännössä mahdotonta hyväksyä. Neliö pitäisikin piirtää mahdollisimman yksinkertaisesti ja kaikki turhat mutkat todennäköisesti johtavat hylkäämiseen. Jos vaikka viisastelee ja piirtää yhden neliön sivuista kahdella forwardilla yhden sijaan, tarkistin ei tätä tajua.
Muutoksia: kolmella viivalla je end_fillillä piirretty neliö pitäisi nyt mennä läpi. Lisäksi tämä tehtävä ei välitä välilyönneistä ihan samalla innokkuudella kuin kurssin varsinaiset tehtävät (itse asiassa näin oli aiemminkin, mutta parissa kohtaa puuttui vastaustemplaatista ylimääräisen välin salliva merkintä).
Tässä tehtävässä on jotakuinkin kurssin hankalin tarkistus toteuttaa. Jos haluat nähdä painajaisia seuraavan viikon, voit pyytää kurssin luennoitsijaa esittelemään harjoituksissa miten oikea vastaus (yritetään) tulkita...

#vainvälilyöntijutut

Viimeisenä jokavuotinen kiistakapula, eli tekstikenttätehtävien välilyöntirakkaus. Taustalla tässä on puhtaasti se, että olemme tehneet päätöksen ohjata opiskelijat kirjoittamaan säällisen näköistä koodia ns. kovin keinoin. Joskus muinoin sallittiin vähän kaikenlaista tyyliä, ja lopputöiden kooditkin olivat sitten vähän kaikenlaista. Teknisesti meille olisi helpompaa hyväksyä välien käyttö miten sattuu kuin niistä erikseen huomauttaminen vihjeillä. Jos jostain ykkösmateriaalin tehtävästä puuttuu vihje välilyönneistä, kyseessä on virhe - raportoikaa asiasta esim. Slackiin.
Ymmärrämme, että tämä varmasti vähän ärsyttää alussa, mutta huolellisuus on tärkeä osa ohjelmointia. Se, että alussa joutuu vähän metsästämään puuttuvia tai liiallisia välejä auttaa myös metsästämään muunlaisia huolimattomuusvirheitä jatkossa, tilanteissa joissa ne oikeasti aiheuttavat virheitä tai vääränlaista toimintaa. Lisäksi niiden muiden huolimattomuusvirheiden löytäminen on helpompaa, jos koodi on siistin ja yhdenmukaisen näköistä.
Niitä välilyöntisääntöjä ei muuten olo kovin montaa:
  1. Pilkun oikealle puolen tulee yksi välilyönti.
  2. Operaattorin molemmille puolille tulee välilyönnit.
    • Poikkeuksena avainsana-argumenttien sijoitukset, jotka tulevat ekaa kertaa vastaan kakkosmateriaalissa.
  3. Kaksoispisteen jälkeen tulee välilyönti, jos se ei ole rivin lopussa.
    • Käytännössä koskee nelosmateriaalissa esiteltäviä sanakirjoja.
  4. Mihinkään muualle ei tule välilyöntiä.
Tyylisääntöjä ei ole tempaistu hatusta, vaan ne perustuvat Pythonin viralliseen tyylioppaaseen.

Virtuaalikoneista

Ensinnäkin: virtuaalikoneita käytetään, koska se on ainoa tapa saada kaikki ohjelmat ja asetukset vastaamaan kurssin tarpeita. Esim. työasemaluokkien koneissa on edelleen Python 2, jolla ei kurssia voi suorittaa.

K-asema

Virtuaalikoneissa K-asemalle ei syystä tai toisesta pysty tallentamaan. Asiaa tiedusteltu tietohallinnolta, mutta eivät osanneet sanoa mistä voisi johtua... Tiedostoja voi tallentaa tietokoneen omasta Windowsista, jolloin ne näkyvät virtuaalikoneessakin K-asemalla. Virtuaalikoneen sisällä tallennukset pitää tehdä C-asemalle, jossa ne eivät siis säily. Lovelaceen lähetetyt vastaukset kuitenkin säilyvät, joten omat koodinsa voi ainakin sitä kautta ottaa talteen.

Hitaus

Toiseksi luokassa TS135 virtuaalikoneet vaikuttivat hyvin tahmaisilta. Syy on käytännössä siinä, että virtuaalikone striimataan verkkolevyltä, mikä on hidasta. Tietohallinnolla ei ollut suoraa ratkaisua tähänkään. Tutkimme vaihtoehtoja ja kerromme mikäli keksimme jotain parempaa.

Korjauksia

Alkuviikosta vasemman laidan oikein/väärin/? -ikoni ei päivittynyt kun tehtävään vastasi. Bugi löydettiin ja korjattiin. Answers-linkissä näkyvä vastausten lukumäärä ei taida vieläkään päivittyä, mutta linkkiä seuraamalla löytyy kyllä kaikki vastaukset.
Ohjeissa Notepad++ tab-asetukset mallikuvassa on vanha versio ohjelmasta, ja nykyään kyseinen asetus löytyy (loogisesta, köh) Languages-asetuksista. Päivitetään kuva kunhan ehditään. Ohjeisiin oli myös eksynyt muuta vanhaa tietoa, joka pitäisi olla tässä vaiheessa pääosin korjattu tai poistettu.
Kuvalähde 2

Viikko 2 (1. kertaustehtävät ja 1. harjoitukset)

Kuvalähde 3

Kertaustehtävien toistojen määrä

Kuten todettua, kertaustehtävät ovat uusia eikä meillä ole varsinaisesti mitään käsitystä millainen määrä toistoja olisi tehokkain. Nykyinen 20 on arvaus, ja katsotaan nyt tässä miten se vaikuttaa. Toistoja kuitenkin pitää olla, jotta niitä rivejä tulee kirjoiteltua useampaan otteeseen. Lisäksi tehtävien asettelussa sanamuodot vaihtelevat, jotta voi totutella siihen, että sama asia voidaan sanoa monella tapaa. Erityisesti lausahdus "sijoita se muuttujaan" on aiempina vuosina aiheuttanut suurta hämmennystä opiskelijoiden keskuudessa, vaikka kyseessä on perusjuttujen perusjuttu. Katsotaan miten tänä vuonna.
Periaatteessa kertausta pitäisi tehdä pidemmällä aikavälillä kuin yhdessä istunnossa. Eli jos alkaa puuduttaa, voi jatkaa vaikka seuravana päivänä ja katsoa onnistuuko silloinkin... Jos kertaus sujuu, ei tuossa nyt mahdottoman kauaa mene naputella noita.

Kertaustehtävien oikeat vastaukset

Palautteissa oli myös ehdotettu, että kertaustehtävissä voisi näkyä oikea vastaus silloin kun opiskelija vastaa väärin. Harkinnan jälkeen päätös oli aika yksimielinen: ei voisi. Kertaustehtävien tarkoitus ei ole se, että opetellaan kysymykseen sopivia vastausmalleja ulkoa. Tarkoitus on, että jos kysymys ei soita kelloja, silloin kerrataan esim. termistön avulla mistä olikaan kyse. Tällä tavalla sanojen merkityskin tulee kerrattua, eikä pelkästään kaavaa, jolla jokin sana muuttuu koodiksi.

Useiden muuttujien sijoitus kertaustehtävässä

Alkuviikosta ekassa kertaustehtävässä kysyttiin useiden muuttujien sijoitusta yhdellä rivillä, ja joku tarkkasilmäinen oli huomauttanut, että moista temppua ei materiaalissa näytetä - ja oli oikeassa. Koska kyseessä ei edes ole mitenkään erityisen tärkeä juttu, ko. kysymysmalli kytkettiin pois päältä. Sen sijaan se divmod-kysymysmalli jätettiin sinne, koska sitä oikeasti tarvitaan kurssin aikana. Ykkösmateriaali ei tosin tätäkään asiaa oikein näytä, joten tämä asia korjataan lisäämällä ykkösmateriaaliin tietoa useiden paluuarvojen funktioista.

Turtle-ympyrätehtävä

Tätä tehtävää oli pidetty epäselvänä, ja harjoituksissa näytti olevan jonkin verran ongelmia sisäistää, mitä tulee funktion sisälle ja mitä ei. Pohdinnan jälkeen ei kyllä keksitty mitä tehtävänannosta voisi vielä selventää, joten ongelma voi liittyä enemmän tehtävien järjestykseen. Tehtävä siirrettäneen jatkossa ykkösharjoituksen loppuun, jolloin funktioiden naputtelu pitäisi olla jo tutumpaa.

Matematiikan määrästä

Nykyään kurssilla on jo aika paljon opiskelijoita, joille tämä matikka ei kuulu pääaineeseen millään tavalla. Jotain ongelmanratkaisua kuitenkin pitäisi olla jo ykkösharjoituksessa, ja meillä ei ole käytettävissä kuin numeroita, joten matemaattiset tehtävät ovat loogisin ratkaisu. Perusgeometrian kertaus ei toivon mukaan kenelläkään noussut ylitsepääsemättömäksi esteeksi, ja pieni numeroiden pyörittely on ihan hyödyksi ohjelmoinnissakin. Aikaisempina vuosina on pyöritelty jotain toisen asteen yhtälön ratkaisukaavojakin...
Voisihan tuo tehtäväsarja olla arkisempikin, jos joku meistä keksii hyvän paketin, jossa päästään samalla tavalla ratkomaan osaongelmia ja lopulta yhdistämään ratkaisut.

Julkaisutahdista

Jotkut paloivat niin kovasti innosta, että nykyiset tehtävät eivät riittäneet ja halusivat tulevaisuuden tehtävät jo näkyviin. Tällä hetkellä julkaisun tiellä on pääasiassa se, että tulevia kertaustehtäviä ei ole vielä testattu tarpeeksi, ja harjoitustarkistimien varmennus on kesken (tarkoitus on testata kukin tarkistin jokaista aiempien vuosien palautusta vastaan ja korjata kaatumistilanteet). Todennäköisesti julkaisemme kuitenkin kakkosharjoituksen aika hyvin etuajassa, ja siihen liittyvät kertaustehtävät on jo julkaistu.

"Ohjelmani toimii oikein, mutta tarkistin ei hyväksy"

Tämä johtuu pääasiassa siitä, että ohjelman funktiot eivät sovi tehtävänannon määrittelyihin. Asiasta on kerrottu tarkemmin ykkösharjoituksen alussa. Myös yleisesti ottaen, jos tehtävänannon "Opittavat asiat"-kohdassa on mainittu jotain, mitä omasta koodistasi ei löydy, olet todennäköisesti harhateillä ratkaisun kanssa. Ensimmäinen askel on siis aina tarkistaa, noudattaako ratkaisusi oikeasti tehtävänantoa. Luonnollisesti aina on parempi kysyä apua ajoissa kuin hakata päätä seinään ja turhautua, joten ongelmatapausten kanssa harjoituksiin mars tai viestiä Slack-kanavalle.
Miksi sitten tarkistimet ovat niin tiukkoja? Kullakin tehtävällä on tarkoitus opettaa jokin tietty asia, ja kaikki ratkaisut eivät välttämättä sisällä tämän asian oppimista. Lisäksi funktioita kirjoittaessa on oikeassakin elämässä tärkeää pysyä siinä, mitä on muiden kanssa sovittu - jos siis koodaat jotain, missä tekijöitä on enemmän kuin yksi.

Kysymysten esittäminen palautteissa

Jonkin verran tehtäväkohtaisissa palautteissa esiintyy kommentteja tyyliin "Miksi vastaus xyz ei kelpaa?". Näihin olisi mukava vastata, mutta anonyymin palautteen tapauksessa se on hieman vaikeaa, kun lähettäjää ei ole tiedossa. Toiseksi, kuten todettu pariin kertaan, palautteita lueskellaan vain kerran-pari viikossa. Jos siis haluat tietää miksi vastaus ei kelvannut, kannattaa kysymys osoittaa Slack-kanavalle, missä siihen voimme vastata niin, että vastaus näkyy muillekin.

Miksi "return 1km" ei kelpaa

Juuri kun pääsin sanomasta, että palautteisiin ei kannata laittaa kysymyksiä, koska niihin ei voi vastata, päätin kuitenkin, että tämä on vastaamisen arvoinen. Kyseessä on sekaannus, joka johtuu siitä että kirjain l ja numero 1 näyttävät fontista riippuen aika samanlaiselta. Kuitenkin tässä on nyt syytä huomata, että muuttujan nimi ei voi alkaa numerolla. Tässä tapauksessa siis kyseessä on pakko olla kirjain l. Jos kirjoittelee koodia ipythonissa tai tekstieditorissa, jossa on syntaksivärjäys, numerot yleensä näkyvät myös eri värillä kuin kirjaimet.

Korjauksia

Ykkösharjoituksessa oli mainittu, että pääohjelma-ohjeissa ei mainittu, että tulos pitää tulostaa. Nyt on. Ilman tulostusta pääohjelma ei tee mitään, mutta ehkä kurssin alussa tämä ei ole niin selvää, että tulostamisen voisi jättää mainitsematta.
Ykkösharjoituksen alkuesimerkkiin oli myös eksynyt väärä tiedosto, joten valmis kooditiedosto ei näyttänyt ihan samalta kuin esimerkin selityksessä tehty. Kyseinen versio oli karannut sinne kakkosmateriaalin alusta, ja sisälsi merkkijonoja, joita ei ole vielä opeteltu. Harjoitussivulle on laitettu oikea versio.
Muutamia Lovelacen ilmoituksia, jotka tulivat hämmentävästi englanniksi, on käännetty suomeksi. Lisäksi korjasimme bugin, joka aiheutti liian hitaasti suorittuvien kooditiedostojen tarkastuksen rikkoutumisen.
Jos löydätte jotain, mikä on selkeästi rikki, kertokaa siitä Slackissa tai sähköpostilla. Näistä oli huomautettu palautteissa, mikä on myös ihan mukavaa, mutta palautteet luetaan n. kerran viikossa minkä vuoksi korjaus menee todennäköisesti seuraavaan viikkoon. Suorempaan viestintään ehdimme reagoida yleensä päivässä, ellei jotain ole todella pahasti rikki.

Viikko 3 (2. materiaali)

Kuvalähde 4

Tekstikenttätehtävien (ja kertaustehtävien) tarkistimista yleisesti

Paikkaillaanpa tähän hiukan asioita joita ei tullut Lovelacen ajo-ohjeluennolla esitettyä. Tekstikenttä tehtävien tarkistiminen ei tapahdu koodia suorittamalla, vaan sovittamalla opiskelijan vastausta erilaisiin sapluunoihin joista yleensä yksi on oikeaksi laskettava vastaus ja loput antavat vihjeitä. Näihin sapluunoihin määritellään joustavuutta regular expressioneiksi kutsutulla mekanismilla, johon onnekkaimmat teistä eivät joudu koskaan tutustumaan.
Tämä tarkoittaa sitä, että tehtävän laatijan tulee erikseen määritellä kaikki hyväksytyt vastausmuodot. Pythonin kaltaisessa kielessä, jota voi kirjoittaa hyvinkin monella tavalla, tämä urakka ei ole mitenkään yksinkertainen. Myös kaikki joustavuus pitää erikseen määritellä, esim. se hyväksytäänkö pieni kirjain, kun annetussa merkkijonossa oli iso. Hyväksytyt vastaukset on näistä käytännön syistä rajattu sellaisiin, jotka:
  1. käyttävät kaikkia tehtävän "Opittavat asiat" -kohdassa mainittuja menetelmiä
  2. ratkaisevat ongelman yksinkertaisimmalla, tyypillisesti materiaalissa esitetyllä, tavalla
  3. seuraavat tyylisääntöjä
  4. sisältävät literaaliarvot tehtävänannosta kopioituna
  5. eivät sisällä mitään tarpeetonta
  6. eivät sisällä asioita, joita ei ole vielä opetettu
Vihjeiden kohdalla on sama tilanne: jos tehtävän laatija ei pysty ennakoimaan jotain tietyn näköistä väärien vastausten ryhmää, siihen ei pysty vihjettä antamaan. Nykyiset vihjeet pohjautuvat aiempien vuosien väärien vastausten kertymiin.
Kertaustehtävissä on oikeissa vastauksissa jonkun verran joustoa esim. puuttuvien välilyöntien suhteen (mutta tällä hetkellä ei ylimääräisten). Mitään rikkinäisiä koodirivejä ne eivät tietenkään hyväksy. Syntaksivirheitä vastaan voi suojautua määrittelemällä tehtävänannon muuttujat tulkkiin (arvot voi nakkoa päästä) ja kirjoittamalla koodirivin sinne ennen vastausta.
Yleisin ratkaisu kaikkiin tarkistinongelmiin on kommunikaatio. Varsinkin "miksi tämä vastaus ei kelpaa"-tyyliset kysymykset linkillä varustettuna on yleensä hyvin nopeasti vastattu Slackissa. Muutamia tarkistimia on tänäkin syksynä päivitetty Slack-viestien tuloksena.
Huikeissa tulevaisuuden visioissa tekstikenttätehtävätkin voidaan tarkistaa koodina, jolloin nämä ongelmat vähentyvät. Tosin silloinkin tulemme varmasti lisäämään tarkistuksia, jotka valittavat jos koodi on sotkuista tai sisältää köpöisiä ratkaisuja. Tällä hetkellä on kuitenkin tyydyttävä nykyisenmallisiin tekstikenttätehtäviin, koska Lovelacen kehitykseen ei ole erityisemmin varattu budjettia.

Tekstikenttätehtävien Alustus-osion merkitys

Tämäkin asia jäi käytämättä läpi ajo-ohjeluennolla, joten paikataan. Jos tekstikenttätehtävän alustus-osio sisältää ipython-rivejä (alkavat In [x]), tarkoitus on, että kirjoitat nämä rivit tulkkiin sellaisenaan. Ne tyypillisesti asettavat tulkkiin sellaiset muuttujat, joita tarvitaan vastausrivin testaamiseen. Erityisesti hämmennystä tässä tuntui olevan Meta-if -tehtävässä, jossa siis oli todellakin tarkoitus kirjoittaa annettu rivi-muuttujan määritys tulkkiin ja painaa enteriä, ja tämän jälkeen miettiä miten kirjoitetaan ehtolause, jossa esiintyy tuo rivi-muuttuja.
Tässä olivat sis jotkut harhautuneet muokkaamaan Alustus-kohdan rivistä ehtolausetta, mikä on täysin väärä suunta. Jos siis riviä ei erikseen pyydetä muokkaamaan, se on tarkoitus kirjoittaa tulkkiin sellaisenaan. Toinen tästä johdettava asia on, että jos alustuksessa pyydetään määrittelemään muuttujia, vastauksessa myös yleensä pitäisi käyttää näitä muuttujia - ei siis niiden arvoja.

In ja Out -merkinnät koodiesimerkeissä

Kolmas asia, joka ei ajo-ohjeissa tullut tarpeeksi selvitetyksi. In- ja Out-merkinnät ovat siis tosiaan IPythonin käyttöliittymää. Aina kun ne esiintyvät materiaalin esimerkeissä, kyseessä on esimerkki, joka on tarkoitettu tulkissa pyöriteltäväksi. Lisäksi esimerkeissä, joissa In-merkinnän hakasulkeissa oleva numero on suurempi kuin 1, jatketaan suoraan edellisestä esimerkistä samassa tulkki-istunnossa. Koska In ja Out ovat vain käyttöliittymää, niitä ei koskaan ole tarkoitus sisällyttää mukaan tehtävän vastaukseen. Saatamme lisätä huomautuksia tähän liittyen tarkistimiin, tai selventää asiaa muutaman tehtävänannon osalta.

Ohjelmistoväkivaltaa-tehtävän alustus

Tässä oli jonkun verran hämmenystä siitä miten tuo while True -silmukka pitäisi syöttää tulkkiin. Annettuun koodiin lisätty yksi tyhjä rivi sen merkiksi, että enteriä painaa pass-rivin jälkeen kahdesti, että silmukka lähtee pyörimään. Tämän jälkeen voi painaa Ctrl + C ja saada aikaan tehtävässä haetun lopputuloksen.

Tyylijuttuja

Pari esiin tullutta juttua: funktion nimen ja sitä seuraavien sulkujen väliin ei ole tapana pistää välilyöntiä. Joissain kielissä saattaa olla ihan syntaksi virhe. Ei siis näin abs (-5) vaan abs(-5). Tästä ei ole missään tarkistimessa erikseen huomautusta, koska aiempina vuosina tätä virhettä ei ole tehty merkittävissä määrin.
Toiseksi ylimääräisiä sulkuja on hyvä vältellä, erityisesti ehtolauseissa. Joissain kielissä ehtolauseen ehto tulee laittaa sulkuihin, mutta Pythonissa riittää, että ehto on if/elif-sanan ja kaksoispisteen välissä. Sulkuja voi käyttää jos ehto on monimutkainen, mutta silloinkaan koko lausetta ei tule laittaa yksiin sulkuihin.

-ei argumentteja-

Kertaustehtävissä esiintyvä -ei argumentteja- oli aiheuttanut jonkun verran hämäystä. Kyse on tehtävägeneraattoriin liittyvästä rajoitteesta, eli tehtävänannossa argumentit sijoitetaan tuohon harmaaseen laatikkoon, mutta välillä arvotaan sellaisia metodeja, joille ei anneta argumentteja, ja siihen piti keksiä jotain: vaihtoehtoina tyhjä laatikko tai laatikko, jossa lukee -ei argumentteja-. Jälkimmäinen oli yhden henkilön testiryhmän mielestä selkeämpi. Koitetaan keksiä tuolle jokin vähän hienostuneempi muotoilutapa.
Todettakoon kuitenkin, että jos olisitte testanneet heittää vastausrivin tulkkiin, olisi virhe paljastunut aika helposti:
In [1]: valinta = "aasi"
In [2]: valinta.upper(-ei argumentteja-)
  File "<ipython-input-2-51b338a31c03>", line 1
    valinta.upper(-ei argumentteja-)
                                 ^
SyntaxError: invalid syntax
Kertaustehtävissäkin kysytään siis aina toimivaa koodiriviä - jos rivi ei toimi, se ei mitenkään voi olla oikea vastaus. Samasta syystä ei noille metodeille heitellä huvikseen argumentteja, vaan niille heitetään juuri niin monta argumenttia kuin kyseinen metodi ns. oikeassa elämässäkin ottaa vastaan.
Kumpi olisi selkeämpi tapa ilmaista, että metodille ei anneta argumentteja? (Olettaen, että suurempaa tekstinmuotoilua ei pystytä juuri nyt tekemään)
  • nykyinen: -ei argumentteja -
  • vaihtoehto:  
Warning: You have not logged in. You cannot answer.

Kertaustehtävien armottomuus

Se, että kertaustehtävät heittävät virheestä alkuun, on aiheuttanut (ennustettavasti) jonkin verran närää. Emme kuitenkaan pidä tätä mekanismia kohtuuttomana, ja aika hyvin tuosta ehtolausekertauksestakin on jo 140 opiskelijaa selvinnyt kun deadlineen on vielä melkein kaksi viikkoa. Muutama uudelleenaloitus tuo toiston määrän lähemmäs sellaista lukua, että siitä alkaa olla konkreettista hyötyä. Kuten maanantain luennolla käsiteltiin, kauhean väsyneenä ja äkäisenä ei välttämättä kannata väkisin näitä vääntää, vaan jatkaa istuntoa kun on vähän virkeämpänä ja osaa huomata virheet riviltä. Istunto ei sieltä Lovelacesta mihinkään katoa.
Vaihtoehtoisia mekanismeja on, kuten vaikka N lisätehtävää jokaisesta virheestä, mutta nykyinen implementaatio ei tätä tue. Ei tue myöskään sitä, että tehtävissä olisi välietappeja (tämän voisi tehdä tällä hetkellä siten, että yhden 20 kertauksen sijaan on kaks kertaa peräkkäin sama tehtävä 10 kertauksella, mutta ylläpito menee monimutkaisemmaksi).

Korjauksia

Materiaalista on korjattu taas muutamia pikkuvirheitä saadun palautteen perusteella. Ehkä merkittävimpänä Käärmeen kieli -tehtävän tarkistinta päivitetty siten, että se hyväksyy nyt myös vastaukset, joissa lasketaan "ohjelmointi" ensin. Kakkosharjoituksen kaikki tarkistimet on testattu kaikkia aiempien vuosien vastauksia vasten ja korjattu tilanteet missä ne kaatuivat. Joku unohti tosin laittaa korjatut tarkistimet Lovelaceen asti ainakin yhden tehtävän osalta - tämäkin puute on nyt korjattu.

Viikko 4 (2. kertaustehtävät ja 2. harjoitukset

Kuvalähde 5
Yleisenä tilannepäivityksenä aiempiin vuosiin nähden asioiden oppiminen on ollut todella hyvällä tasolla, ja tehtäviin on tarvittu vähemmän apua yhteensä (ei siis edes suhteellisesti, vaan kaiken kaikkiaan), vaikka teitä on n. 50% enemmän kuin viime vuonna. Optimistisesti oletetaan siis tietenkin, että tehtävät sujuvat jos niihin ei tarvi kysellä apuja.

Harhaanjohtavat virheilmoitukset tulostuksiin liittyen

Jonkin verran tarkistimissa esiintyy edelleen ongelmia, joissa palaute sanoo, että luvut tulostettiin väärällä tarkkuudella tms, vaikka oikeasti kyse olikin jostain muusta muotoiluvirheestä tulosteessa. Ongelma juontaa juurensa siihen, että lukuja etsitään tulosteesta jollain kaavalla, esim. poliisitehtävässä etsittiin lukua, jossa on pisteen jälkeen tasan kaksi numeroa, ja sen jälkeen välilyönti kuten tehtävänannon esimerkkitulosteissa. Jos siis olikin tulostettu esim. 60.00km/h, tämä ei sovi etsittyyn kaavaan ja tarkistin toteaa, että ei löytänyt oikein pyöristettyä lukua.
Näitä virheitä on korjailtu aika merkittävästi aiemmista vuosista ja olipa näin tehty tuon poliisitehtävänkin kohdalla. Kukalie oli unohtanut vain sellaisen pikku yksityiskohdan kuin päivitetyn tarkistimen laittamisen Lovelaceen... Vastaava ongelma oli kulmikasta koodia -tehtävässä, josta se se on myös korjattu (ei tunnistanut lukua, jos tulostusrivi päättyi heti luvun jälkeen).

Vajaaksi jäävät suorituspalkit

Lovelace ei vielä tue oikeasti keskenään vaihtoehtoisia tehtäviä, joista valitaan yksi. Näinpä siis muut kaksi jäävät tekemättä, ja vihreä suorituspalkki väkisinkin vajaaksi. Tämä on featurejonossa, koska nykyinen systeemi vaikeuttaa myös mm. kurssisuoritusten laskemista, mutta tämä syksy joudutaan vielä ahdistumaan sisällysluettelon suorituspalkkien vajaudesta. Pahoittelemme.

Miksi quit ja kumppanit eivät käy

Tämä käsiteltiin luennolla, mutta kävijämäärän ollessa joku alle 20% osallistujalistasta (ps. L1:ssä ois edelleen hyvin tilaa teille) viesti on varmaan tarpeen toistaa. Sinänsä näiden käytössä pääohjelmassa ei ole mitään vikaa. Tämä on kuitenkin kurssi, jossa kullakin tehtävällä on jokin osaamistavoite - näissä tapauksissa ohjelman kulun hallinta käyttämällä sisäkkäisiä rakenteita. Turvautumalla oikopolkuihin kuten quitiin, tämän tärkeän asian oppiminen jää puolitiehen. Erityisesti nelilaskintehtävää on useampia vuosia pidetty erittäin opettavaisena (toki myös vaikeana, mutta tämä yleensä tulee tontin mukana).
Todettakoon myös, että quitin käyttö missään muualla kuin pääohjelmassa (ja vielä if __name__ == "__main__":-ehtolauseen alla) ei ole hyvätapaista. Tämä johtuu siitä, että kuten nelosmateriaalissa opimme, koodimoduuleja voidaan käyttää toisissa ohjelmissa. Tällöin yhdessä kohtaa tehty quit vetää niinsanotusti koko korttitalon alas, eli sammuttaa myös sen ohjelman, joka käyttää osia koodistasi. Joskus näin kävi tarkistimillekin, eli opiskelijan koodissa ollut quit sammutti sen...

Korjauksia

Satunnaisia päivityksiä tarkistimiin, ei mitään ihmeellisempää.

Viikko 5 (3. materiaali)

Kuvalähde 6

Indeksiosoitus [-1] morsetehtävässä

Palautteissa oli haettu selitystä miksi merkkijonon viimeistä merkkiä ei tässä tehtävässä saanut katsoa käyttämällä indeksiosoitusta:
while not kirjain[-1] == "!":
Alunperin kyseinen vastaus ei ole hyväksytyissä, koska siinä käytetään asiaa, joka opetetaan vasta myöhemmin tässä materiaalissa - tämä toistuu aina silloin tällöin tehtävissä. Tässä tapauksessa on kuitenkin olemassa ihan järjellinenkin syy sille, miksi ratkaisu on huono:
In [1]: kirjain = input("Mors mors! Huutomerkki (!) lopettaa: ")
Mors mors! Huutomerkki (!) lopettaa: 

In [2]: kirjain[-1]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
 in ()
----> 1 kirjain[-1]

IndexError: string index out of range
Eli tässä käyttäjä syöttää tyhjän merkkijonon, jolloin [-1] antaakin IndexError-poikkeuksen. Jos tehtävän while-silmukka kirjoitetaan haetulla tavalla, tämä kaatuminen vältetään. Jos mietitään sovelluskontekstia, on täysin realistinen skenaario, että käyttäjä painaa useita merkkejä syöttäessään vahingossa kahdesti enteriä, jolloin ohjelma kaatuu, jos indeksiosoitusta on käytetty. Asiasta on lisätty tehtävään vihje.
Todettakoon vielä, että tuossa vastauksessa on toinenkin syy hylkäämiseen: ei ole mitään järkeä käyttää samassa ehdossa not-operaattoria ja ==-operaattoria, kun !=-operaattori on olemassa.

Janatehtävä

Tässä tehtävässä on esiintynyt aika paljon sellaista käsitystä, että siinä olisi tarkoitus jotenkin käyttää sort-metodia. Tehtävässä sort-metodi on pelkästään konteksti. Ihan samalla tavalla kuin edeltävässä tekstikappaleessa ja esimerkissä, jossa on aika yksinkertaisia funktioita.
Pointti tehtävässä siis on, että tehdään funktio, jolla johdetaan listan alkioista vertailuarvot joihin sort perustuu - tämä voi olla mikä tahansa funktio, jonka ainoana rajoituksena on tasan yksi parametri ja tasan yksi paluuarvo. Jos tehtävänannosta jätetään konteksti pois, siitä ei varsinaisesti opi miten nimenomaan tähän tarkoitukseen kelpaavia funktioita tehdään. Ehkä tämä sekaannus on tarpeen, että asiaan tulee jotain selvyyttä. Otetaan toki ehdotuksia vastaan miten tehtävänantoa voisi muuttaa poistamatta kontekstia - vai olisiko paranneltavaa enemmänkin edeltävässä tekstissä?
Yhtä paljon hämmennystä tuntui aiheuttavan se, miten listasta saadaan purettua yksittäiset alkiot laskutoimitusta varten. Yksittäisiä arvoja listasta saa ulos indeksiosoituksella tyyliin jana[0] jne., ja tämä tehtävä tuntuu olevan ihan hyvä paikka oppia tekemään näin - sen verran siinä on ollut vaikeuksia.
Tehtävään lisätty maininta indeksiosoituksen käytöstä, sekä linkki indeksiosoitus-termiin.

range-funktion argumenteista

Viimeisessä tehtävässä sekä kertaustehtävissä on jonkin verran ihmetelty vastauksia, joissa range-funktiolle on annettu ylimääräisiä argumentteja, mikä on johtanut hylkäämiseen. Jos on antamassa funktiolle argumentin, joka on sama kuin parametrin oletusarvo, se on usein tapana jättää antamatta kokonaan. Niinpä siis esim. lukusarja nollasta neljään otetaan funktiokutsulla range(5), jättäen 0 pois alusta. Vastaavasti viimeinen, vielä harvemmin käytetty, step-argumentti jätetään pois, jos halutaan kaikki luvut. Periaatteessa siis saman lukusarjan saisi kirjoittamalla range(0, 5, 1), mutta näin ei yleisesti tehdä - varsinkin tuo viimeinen argumentti tuossa pistää ihmettelemään että mikä ihmeen ykkönen.

Hassunhauskat otsikot ja tiedon etsintä materiaalista

Oletten aivan oikeassa, että nuo otsikot eivät ole kauhean hyödyllisiä sisällysluettelossa... Tässä asiassa olen kuitenkin pässi ja pidän ne silti, koska syyt. Oikeasti tarkoitus olisi jossain vaiheessa tehdä tuki aliotsikoille, jotka voisivat näkyä sisällysluettelossa varsinaisen otsikon sijaan jolloin kaikki voittavat.
Materiaalia ei kuitenkaan ole kirjoitettu hakuteokseksi - se on aina ollut ja tulee olemaan johdonmukainen matka, jossa asiat otetaan esiin siinä kohtaa, mihin ne parhaiten ongelmanratkaisutarinassa sopivat. Hakuteosominaisuudet onkin pääosin sijoitettu termipankkiin, ja termipankin laajennus on ensisijainen strategia, jolla tiedonhakua parannetaan. Näillä raameilla meille olisi kaikkein tärkeintä, että saamme palautetta termipankin käyttökelpoisuudesta sekä toiveita, mitä sinne pitäisi vielä lisätä. Nykyäänhän termeissä on mm. linkkejä materiaalin kohtiin, joissa termiin liittyviä juttuja selitetään.

Viikko 6 (3. kertaustehtävät ja 3. harjoitukset)

Kuvalähde 7

Listakertaustehtävän usean alkion lisääminen listaan

Palautteissa oli mainittu, että +=-operaattori ei kelvannut vastaukseksi. Olin jo ehtinyt kirjoittaa hyvän vastineen puoliväliin, kunnes demonstraatiota naputellessa huomasin, että asia onkin vähän jännempi. Vastauksen hylkääminen perustuu (nähtävästi virheelliseen) käsitykseen, että nämä kaksi riviä olisivat sama asia eri tavalla kirjoitettuna:
lista = lista + lisaa_kamaa
lista += lisaa_kamaa
Ensimmäinen on väärin, koska siinä luodaan uusi lista. Tämä voi tuntua turhalta semantiikalta, mutta on hyvin relevanttia, jos kutsutaan funktiota, joka lisää listaan alkioita. Jos funktiossa lisääminen on tehty tällä tavalla, lisäys ei vaikuta siihen listaan, joka annettiin argumentiksi. Demo:
In [1]: def lisaa_alkiot(lista, alkiot):
   ...:     lista = lista + alkiot
   ...:     
In [2]: luvut = [1, 2, 3]
In [3]: lisays = [4, 5]
In [4]: lisaa_alkiot(luvut, lisays)
In [5]: luvut
Out[5]: [1, 2, 3]
Olin jo valmistellut vastaavan demon tuota toistakin tapaa varten, mutta päädyin keräilemään leukaa lattialta, kun kävi näin:
In [1]: def lisaa_alkiot(lista, alkiot):
   ...:     lista += alkiot
   ...:     
In [2]: luvut = [1, 2, 3]
In [3]: lisays = [4, 5]
In [4]: lisaa_alkiot(luvut, lisays)
In [5]: luvut
Out[5]: [1, 2, 3, 4, 5]
Ts. += on erillinen operaattori, joka listojen kohdalla toimii kuten extend-metodi. Tavallisesti sitä käytetään vain muuntumattomille arvoille, jolloin noissa kahdessa esitystavassa ei oel mitään toiminallista eroa.
Näin siis 7 vuotta kieltä opetettuaan siitä löytää edelleen jotain uutta ihmeteltävää. Lisätään siis tuo += hyväksyttyihin vastauksiin kunhan ehditään.

Listakertaustehtävä ja "kohdasta"-sana

Tästä oli jonkin verran ihmettelyä viittaako tällä sanalla esitelty numero listan indeksiin vai siihen monesko alkio on kyseessä. Kieltämättä tarpeettoman hämmentävä sanavalinta. Indeksiä siis tarkoitettiin. Vaihdetaan selkeämpi sana tilalle.

enumerate silmukkakertaustehtävässä

Silmukkakertaustehtävässä kyseltiin enumeraten perään, ja tarkimmat huomauttivat, että sitä ei ole esitelty materiaalissa. No eipä olekaan. Materiaalin edellisessä versiossa siihen kiinnitettiin kyllä huomiota silmukkojen yhteydessä, mutta nykyisessä se onkin vasta nelosmateriaalissa. Asia on kyllä ihan kertaamisen arvoinen, mutta tietenkin vähän nihkeä kerrata jotain, mikä opetetaan vasta kertaustehtävän jälkeen...
Pitää jatkossa sisällyttää enumerate ja kolmosmateriaaliin. Vaatii kuitenkin sen verran uudelleenjärjestelyä, että ei tälle syksylle ehdi.
Lisätään enumeratea-vaativiin tehtävänantoihin vihje lähitulevaisuudessa. Tarvittava informaatio löytyy enumerate-termistä.

Maalitehtävän funktion parametrit

Tässä on tehty teille pieni jekku. Aika monet laittoivat funktiolle kaksi parametria, koska se pohjautuu edellisiin. Tehtävänannon funktiospesifikaatiossa ei kuitenkaan ole parametrit-kohtaa lainkaan. Tämä tarkoittaa, että funktiolle ei tule antaa yhtään parametria.
Syy miksi tässä tehtävässä on ihan järkevää tehdä funktio ilman kysymys- ja virheviesti-parametreja on se, että kyseessä on pitkälti yhteen tarkoituksee tehty funktio siinä missä edelliset olivat monikäyttöisiä. Virheilmoitukset voi siis tällä kertaa kirjoittaa suoraan funktion koodiin merkkijonoina. Toki oltaisiin voitu speksata funktioksi jotain tyyliin kysy_lukupari, jolloin taas noita parametreja olisi ollut hyvä käyttää.
Tämä nyt kuitenkin hyvänä muistutuksena, että asioita voi tehdä monella tapaa, ja että jos teiltä on pyydetty tietynlainen funktio, on syytä kiinnittää huomiota erityisesti siihen, mitkä ovat sen parametrit ja mitä sen pitää palauttaa (monet yrittivät myös palattaa suoraan maalien erotusta).

Välillä on kiva koodata -tehtävä ja ristiin annetut syötteet

Tarkistin tarjosi kysy_valeja-funktiolle syötteitä myös väärässä järjestyksessä, eli suurin ensin, eikä asiasta ollut mitään mainintaa tehtävänannossa. Kyseessä on virhe tarkistimessa - tehtävää päivitettäessä siitä poistettiin vaatimus käsitellä väärin päin annetut syötteet. Tarkistimen päivitys jäi vähän puolitiehen, koska tämä tuli korjattua vain etsi_indeksit-funktion osalta - syötefunktioon jäi virheellisiä testivektoreita.
Luonnollisesti korjattuani asian unohdin nohevasti laittaa päivitetyn tarkistimen Lovelaceen, joten väärä tarkistin oli siellä pari päivää pidempään.
Nokkelasti kuitenkin tämä tuntui ratkenneen itse kultakin, mikä oli mukava huomata. Tarkoitus ei siis ollut kuitenkaan tällä tavalla jekuttaa.

Tekstin (funktiokutsujen ym.) kopiointi tarkistusviesteistä

...onnistuu, mutta vaatii kieltämättä tarpeettomasti sormiakrobatiaa. Ongelma on, että yhden testin tarkistuslaatikko menee kiinni kun sitä klikkaa. Ratkaisu, kunnes toiminta saadaan mukavammaksi, on painaa hiiren vasen nappi pohjaan, maalata teksti ja painaa Ctrl + c ennen kuin päästää hiiren napin ylös. Onnistuu myös painamalla maalaamisen jälkeen oikeaa nappia, siirtämällä kursorin copy-valinnan päälle ja päästämällä vasemman napin ylös. Jälkimmäisellä tavalla tarkistuslaatikko ei mene edes kiinni (testattu: Chromium).

Matriisiesimerkki

...on kieltämättä aikansa elänyt. Tehdään uusi kunhan keksitään parempi.

Ikuisuuteen kurottelevat dokumenttimerkkijonot

Olisi kiva korjata, jos ehtisi selvittää miten. Kopiointi voi helpottaa tosin klikkaamalla dokumenttimerkkijonoa kolmesti (nopeaan tahtiin) hiiren vasemmalla napilla. Tämä maalaa yhden kokonaisen rivin tekstiä, eli koko dokumenttimerkkijonon.

Tiedostojen lataus -ominaisuus

Opiskelijat voivat nyt suoraan ladata palautetut tiedostonsa vastaukset-linkin takaa. Kunkin tiedoston nimen perässä pitäisi näkyä hieno vihreä nuoli, jota klikkaamalla tiedoston voi ladata suoraan. Ei enää copypasta-bileitä, jos tarvitsee tiedostoja toisellakin koneella.

Viikko 8 (4. materiaali, 4. kertaustehtävät ja 4. harjoitukset)

Kuvalähde 8
Jätettiin yksi viikko väliin kun kommentoitavia palautteita oli tasan yksi...
Eipä niitä montaa ollut nytkään, mutta onhan tässä nyt jo aika iso osa asioista käsiteltykin kurssin aikana.

Haravasto ja valkoiset ruudut

Joillakin oli ollut ongelmia haravaston kanssa: ohjelma ei piirtänyt muuta kuin valkoisia ruutuja. Ongelma ilmeni myös tietokoneluokkien virtuaalikoneessa ainakin päivityksen jälkeen (ja mahdollisesti ennenkin). Asia on korjattu päivittämällä haravasto. Jos siis olet kärsinyt valkoisista ruuduista, käväise lataamassa haravasto uusiksi.

Miinoitus-tehtävän tarkistinta päivitetty

Tehtävän tarkistimessa oli jonkin verran puutteita. Tarkistin ei esim. osannut kertoa, että main-funktiosta puuttui kutsu haravasto.aloita-funktioon, jota ilman peli ei mene oikeasti päälle asti. Aika monilta oli tämä jäänyt huomaamatta, joten tarkistimeen on nyt lisätty staattinen testi joka kurkistaa löytyykö tuota funktiokutsua main-funktion sisältä.
Toiseksi palaute oli vähän epämääräistä tilanteessa, jossa piirtokäsittelijä piirsi kentän ristiin (eli vaakaruudut pystyyn ja pystyruudut vaakaan). Tähän on lisätty vihje sekä laitettu palautteeseen näkyviin millaiset dimensiot piirretyllä kentällä oli.
Tehtävässä kannattaa myös huomata, että piirrettävä kenttä on 2-ulotteinen lista. Haravaston esimerkissä piirretään 1-ulotteinen lista, joten vaihtamalla vain muuttujaa ei pysty kenttää piirtämään. Piirtämiseen tarvitaan 2 silmukkaa, ja vieläpä enumeratea molemmissa jotta saadaan laskettua ruutujen sijainnit.

Osoittelutehtävä ja subplot

Ennen päivitystä subplot piti lisätä komennolla add_subplot(111), muuten se ei rekisteröitynyt tarkistimessa oikein. Matplotlibissä on kuitenkin modernipiakin tapoja tehdä subplotteja, jotka on nyt huomioitu tarkistimessakin.

Osoittelutehtävän ohjeistus

Osoittelutehtävässä oli myös hieman harhaanjohtavaa informaatiota hiiritapahtuman ydata-ominaisuudesta. Kyseinen ominaisuus kertoo siis klikattua pistettä vastaavan arvon y-akselilla, ei kuvaajalla. Tehtävänantoa päivitetty vastaavasti - jos siis haluaa pisteen kuvaajalta, pitää klikkauksen myös osua kuvaajaan.

Kuvalähteet

  1. Alkuperäinen lisenssi: CC-BY 2.0
  2. Alkuperäinen lisenssi: CC-BY 2.0
  3. Alkuperäinen lisenssi: CC-BY-NC 2.0
  4. Alkuperäinen lisenssi: CC-BY-NC 2.0
  5. Alkuperäinen lisenssi: CC-BY 2.0
  6. Alkuperäinen lisenssi: CC-BY-NC 2.0
  7. Alkuperäinen lisenssi:CC-BY-NC 2.0
  8. Alkuperäinen lisenssi: CC-BY 2.0
  9. Alkuperäinen lisenssi: CC-BY 2.0
  10. Alkuperäinen lisenssi:CC-BY-NC 2.0
?
  1. Description
  2. Examples
Absolute path is an operating system term that refers to the full "address" of a file or folder. Absolute path is written starting from the disk root. When absolute path is used, the current directory does not matter. Absolute paths are usually avoided in code - especially in applications that are meant to be shared. Another user is very unlikely to have the exact same folder structure as the application's developer. In particular if an absolute path refers to the user's home folder, it is very likely not going to be the same for another user.
Ajonaikaisesta (engl. run time) puhuttaessa määreenä on se aikaväli, kun ohjelma on käynnissä. Esimerkiksi Pythonissa virheet (syntaksivirheitä lukuun ottamatta) tarkastetaan ajonaikaisesti. Ohjelma saattaa siis olla käynnissä ja toimia tiettyyn pisteeseen saakka, kunnes törmätään käsittelemättömään poikkeukseen – ajonaikaiseen virheeseen (engl. run time error).
  1. Description
  2. Esimerkit
Alkio (engl. item, element) on listan tai muun tietorakenteen sisältämä yksittäinen arvo. Useimmiten alkioista puhutaan juuri listojen yhteydessä. Tällöin alkiolla on arvon lisäksi paikka eli indeksi, joka kertoo sen sijainnin listassa etäisyytenä listan alusta. Niinpä siis listan ensimmäisen alkion indeksi on 0.
  1. Description
  2. Esimerkit
Alustamisella (engl. initialize) tarkoitetaan yleisesti jonkin arvon asettamista muuttujalle muuttujan luonnin yhteydessä. Pythonissa ei ole mahdollista luoda muuttujaa, jolla ei ole myös jotain arvoa. Niinpä tyypillisesti käytetäänkin sanamuotoa ”muuttuja alustetaan arvolla x”, millä tarkoitetaan sitä, että muuttuja, joka luodaan, saa luomisen yhteydessä (eikä vasta joskus myöhemmin) arvon x.
  1. Description
  2. Esimerkit
Argumentti (engl. argument) on funktiokutsussa käytettävä arvo, joka välitetään kutsuttavalle funktiolle. Funktiokutsun alkaessa argumentit sijoitetaan parametreiksi kutsuttuihin muuttujiin, joiden kautta arvoihin pääsee funktion sisällä käsiksi.
Arvo (engl. value) on konkreettista, tietokoneen muistissa sijaitsevaa tietoa, jota käytetään ohjelman suorituksen aikana. Arvoilla on tyyppi ja sisältö; esimerkiksi numero 5 on tyypiltään kokonaisluku, jonka sisältö on 5. Useimmiten arvot liitetään muuttujiin, mutta myös operaatioiden ja funktiokutsujen paluuarvot sekä koodissa sellaisenaan esiintyvät arvot ovat arvoja. Käytännössä siis kaikkea konkreettista mitä ohjelma käsittelee voidaan kutsua arvoiksi.
Assignment is related to variables and values. A typical figure of speech is "assigning to a variable" which means giving a certain value to a variable (e.g. x = 5). More specifically, in Python, assignment to a variable means creating a connection between the name and value of the variable - the variable is a way to find the value.
Similar expressions that can be used to mean the same thing are: "saving to a variable", "storing to a variable", "referring to a variable", "stuffing a value into a variable"... etc.
Assignment operator i.e. the = character is used for variable assignment. When using the operator, the target variable must always be on the left side and the value (or statement that produces the value) on the right side.
Attribute is a value that belong to an object, sometimes also called property. It's a name that belongs to the object's internal namespace and it can be accessed through the object: timestamp.tm_hour would read the hours from a timestamp.
  1. Description
  2. Kurssin avainsanat
Avainsanat (engl. keyword) ovat ohjelmointikielessä kielen käyttöön varattuja sanoja, joilla on erityinen merkitys. Hyvät tekstieditorit tyypillisesti merkitsevät avainsanat muista nimistä eroavalla tavalla (esimerkiksi lihavoinnilla tai tietyllä värillä). Avainsanat ovat yleensä suojattuja, eli samannimisiä muuttujia ei voi luoda. Yleisiä avainsanoja Pythonissa ovat esimerkiksi funktioihin liittyvät def ja return. Avainsanat ovat siis osa ohjelmointikielen kielioppia.
  1. Description
  2. Esimerkit
Avausmoodilla kerrotaan Pythonille (ja käyttöjärjestelmälle) millä tavalla tiedosto avataan. Tiedosto voidaan avata lukemista tai kirjoittamista varten. Oletuksena, eli jos avausmoodia ei erikseen määritellä, tiedosto avataan lukumoodissa ("r"). Kirjoitusmoodeja on kaksi:
  • "w", eli write, joka kirjoittaa tiedoston sisällön puhtaalta pöydältä hävittäen mahdollisesti aiemmin olemassa olleen saman nimisen tiedoston.
  • "a", eli append puolestaan kirjoittaa olemassaolevan tiedoston loppuun.
Molemmat kirjoitusmoodit luovat tiedoston, jos sitä ei vielä ole olemassa.
Boolean is the most simple data type in programming languages because it has only two values: true (True in Python) and false (False in Python). Things like comparison operators return booleans, and they are often used in conditional statements and while loops. In Python all values are equivalent to one of the boolean values. Generally all so called empty values (0, "", None etc.) are equal to False while the rest are equal to True.
  1. Description
  2. Extra info
Boolean operator refers to Boolean algebra which deals in values of truthfulness. These operations include and, not, and or - all familiar from conditional statements. Out of these and is True if and only if both operands are True; or is True if at least one operand is True; and not is True is its sole operand is False.
Branch is an execution path in the program that is mutually exclusive with other branches in the same control structure. For example in a conditional structure each if, elif and else define their own branches and only of them is executed.
Buitin functions are function that are included in the Python core. They can always be used without importing any modules or libraries.
Siinä missä UNIX-pohjaiset järjestelmät tuottavat \n-merkkejä rivinvaihdoiksi, Windows tuottaa \r\n-rivinvaihtoja, joissa r on carriage return -merkki. Se on kirjoituskoneiden peruja ja tarkoittaa toimenpidettä, jossa kirjoituspää siirretään takaisin rivin alkuun. Yleisesti ottaen tämä on lähinnä asia, joka on hyvä tietää – Python käsittelee molempia rivinvaihtoja kiltisti.
Code block or block is a term used for liens of codes that belong to the same context. A block is formed of lines that have the same indentation level (although a block can also contain other blocks). Typical blocks are the executable parts of conditional structures i.e. the indented code lines that follow a condition. A block ends when a line with less indentation than ones belonging to the block is encountered.
Code file is a text file that contains executable code. A Python code file can be ran from the terminal by typing python code.py where code.py is the file's name. When you run a code file the return values of individual lines are not shown unless they have been specfically rpinted.
Comparison operators are used for comparing values to one another. They are familiar from mathematics and can be used to compare size. Comparison operators return a boolean value, True or False, depending on the result of the comparison. Comparison operators are: <, <=, >, >=, == and !=
  1. Description
  2. Examples
Condition is used in this course to refer to the part of conditional statements and while loops that defines when the statement is true. Anything between the keyword that starts the stamement and the colon that ends it is basically its condition.
  1. Description
  2. Examples
Conditional statement is a line of code that defines a single condition, followed by an indented code block which defines what should be done if the condition is true. Conditional statements include if and elif statements, the latter of which cannot be present without the former. Conditional statements that are linked together form conditional structures. A conditional statement must always end with a colon and it must be followed with at least one indented code line.
  1. Description
  2. Examples
Conditional structure is a structure that consists of one or more conditional statements that branches program execution. Most of them have at least two branches: if and else. Between the two there can also be an indefinite number of branches under elif statements. It is also possible to have nothing but a single if statement in a structure. Each branch in a conditional structure has at least some code that defines what the program does in a situation falling under a condition.
As a whole a conditional structure is interpreted by checking the truthfulness of the first branch (if). If it evaluates to True, program execution continues to the code block inside the statement after which execution skips the rest of the structure. If it evaluates to False, other branches will be evaluated in sequence until one of them is True, or if none of them are, the else branch is executed.
  1. Description
  2. Examples
Constant is a named literal value. They are used especially when the same literal value is used repeatedly in a program. Named constants are also just in general more practical in code than seemingly arbitrary literal values because its meaning can be derived from its name. Likewise if the value needs to be changed it is much easier if you only need to change it in one place (where it's defined). Python doesn't actually have a way to define "real" constants - they are simply variables. The difference is implied by writing constant names in full upper case. E.g THE_ANSWER = 42.
Data (engl. data) on ohjelmoinnin asiayhteydessä mitä vaan tietoa, joka ei kuitenkaan yleisesti kata itse ohjelmakoodia. Yleensä datasta puhuttaessa tarkoitetaan yksittäisiä literaaliarvoja, muuttujien sisältämää tietoa tai jostain tietolähteestä (kuten tiedostosta tai verkko-osoitteesta) luettua tai sinne kirjoitettua tietoa. Nyrkkisääntönä voi kuitenkin pitää sitä, että koodi ja data ovat eri asioita, ja koodi käsittelee dataa. (Joissain yhteyksissä koodikin lasketaan dataksi, mutta näihin ei tällä kurssilla syvennytä.)
Data structure is a common name for collections that contain multiple values. The purpose of a data structure is to store data that consists of more than one value. There are various ways to make a data structure and each of them convenient means for adding, removing and modifying values. Data structures implement a way to bundle data together. Generally the difficult details involved have been hidden from the programmer.
Choosing data structures that serve the purposes of your program and are easy to handle in your code is essential. The most common structures in Python are list, tuple and dictionary. Another convenient structure is set which doesn't contain duplicate values. In addition to built-in structures, more can be found from the collections module.
On later courses you'll also become familiar with other important structures like trees and graphs.
Debugging is the process of hunting down and fixing programming errors i.e. bugs. There are many ways to track down bugs. One of the more common ones in Python is the error message it shows when a program crashes. Another common method to find errors is the use of debug prints. This means putting additional print function calls in the code temporarily to either see how far the code gets or what kinds of values variables have. Debugging is such an important part of programming that there are even specific debugging tools that have been developed. We don't use them on this course however.
Default value is a value that can be defined for a function parameter. It will be used for that parameter's value if its corresponding argument has not been given in a function call. E.g. in def prompt_length(question, maximum=10): function definition, the maximum parameter has been made optional by giving it the default value of 10.
  1. Description
  2. Definition
  3. Value lookup
  4. Modifying dictionaries
Dictionary is a data structure that assigns keys (usually strings) to its values. The advantage of using dictionaries is that descriptively named keys make code that handles the data structure much easier to read. Starting from Python 3.7 dictionary keys and values are guaranteed to be in the order they were added.
Pythonissa dokumenttimerkkijono (engl. docstring) on kommentin kaltainen merkintä, mutta sillä on oma erityistarkoituksensa. Dokumenttimerkkijono merkitään yleensä kolmella lainausmerkillä (eli '''dokumentti''' tai """dokumentti""". Jos dokumenttimerkkijono on sijoitettu funktion def-rivin alapuolelle (sisennettynä), siitä tulee funktion dokumentaatio, jonka saa esiin help-funktiolla tulkissa. Samoin kooditiedoston alkuun sijoitettu dokumenttimerkkijono muuttuu moduuliin dokumentaatioksi. Dokumenttimerkkijonossa on hyvä kertoa funktion toimintaperiaate sekä selittää mitä sen parametrit ja paluuarvot ovat.
Epätosi (engl. false) on toinen kahdesta mahdollisesta totuusarvosta ja toisen, eli toden, vastakohta. Sitä voidaan pitää lopputuloksena loogisissa ja vertailuoperaatorioissa, jotka eivät pidä paikkansa. Esimerkiksi vertailuoperaatio 5 < 4 ei pidä paikkansa, joten kyseinen operaatio evaluoituu epätodeksi. Pythonissa epätotta merkitään avainsanalla False.
  1. Description
  2. Esimerkit
Erotin (engl. separator) on merkkijonoihin ja tekstitiedostoihin liittyvä termi. Sillä tarkoitetaan tiettyä merkkiä, joiden kohdilta merkkijono on tarkoitus katkaista, kun se luetaan koodiin. Esimerkiksi, jos merkkijono sisältää tietoja, jotka on tarkoitus lukea listaan, erotin erottelee merkkijonon osat alkioiksi. Koodissa käytetään usein merkkijonojen split-metodia näissä tilanteissa – metodilla voidaan siis pätkiä erottimien kohdilta merkkijono listaksi.
  1. Description
  2. Examples
Error message is the Python interpreter's way of informing about an exception in a program. The error message contains information about where in the program the exception happened, which line caused the exception, the exception's type (e.g. SyntaxError) and a short verbal description. Error messages are your best friends and reading them is a very integral programming skill. Don't be afraid of them, they are only there to help you find out what's wrong in the code!
Escape in programming terms means interpreting a character in an exceptional way. For instance "n" is just the letter n but "\n" is a newline character. In this example the backslash character \ causes the normal interpretation of the n character to be escaped and replaced by another interpretation. The backslash functions as an escape character. One typical use is including " in a string that's delimited with ": "donkey ear interval is 14\""
Evaluointi (engl. evaluation) tarkoittaa lausekkeen tai muuttujan arvon lopputuloksen määrittämistä. Suoritettaessa lauseet evaluoituvat joksikin tietyksi arvoksi.
Exception on yleisimpien poikkeusten pääluokka. Kutsumme sitä Pokémon-poikkeukseksi, koska jos sitä käyttää try-except-rakenteessa, except ottaa kiinni kaikki poikkeukset. Tämä ei ole hyvä asia, koska se tekee vikatilanteiden tulkitsemisen vaikeammaksi sekä ohjelman käyttäjälle, että koodarille itselleen – se ottaa nimittäin kiinni myös ohjelmointivirheet, jolloin et saa mitään hyödyllistä tietoa ohjelman kaatuessa.
Execution or running means going through a program or code snippet so that the instructions written within are carried out by the computer. Python interpreter executes code one statement at a time. While this is ongoing the program is "running". Execution ends when there is no more code to run, there's an unrecoverable error or when the program ends itself.
File extension is the part of the file's name that is on the right side of the last period in the name. They are commonly used for indicating file types. Image files for instance often have .png or .jpg as their extension. Python code files usually have .py at the end (e.g. donkeyswings.py).
  1. Description
  2. Examples
The format method of strings is a powerful way in Python to insert values of variables into text that is either printed or saved to a file. Formatting works by defining placeholders in strings (e.g. {:.2f}) for marking spots where the format method arguments will be placed. Example: "Interval between donkey's ears is {:.2f}".format(measurement).
  1. Description
  2. Examples
Function is an independent part of a program that consists of the defining line (with the def statement) and the lines of code that defines the function's behavior. Functions are used to clarify program structure and to reduce redundancy. Functions communicate with each other and the main program through their parameters and return values. Variables (including parameters) defined inside a function cannot be accessed from outside the function. Likewise functions should not read values outside of their own scope.
  1. Description
  2. Examples
Function call is a procedure where the program's execution "jumps" to another location in the code - to the beginning of the function that is being called. When a function is called it is given a varying number of arguments - values that are assigned to parameters defined in corresponding positions in the function definition. A function's execution ends when a return statement is encountered or there are no more lines inside the function's code to execute. When this happens, the program's execution returns to the line where the function was called, and the function call itself is "replaced" by the function's return value.
In short function calls allow one part of the program to utilize another part - e.g. the main program can use a function, or a function can use another function.
  1. Description
  2. Examples
Functions are defined with the def statement which specifies the name of the function and the names its parameters. Choosing these is an essential part of writing generally useful functions. The name should describe what the function does accurately but shortly. Parameter names should be chosen so that it's easy to deduce what kinds of values they will take as arguments. The function's code is indented inside the def statement as its own block. A function code can - and often does - include multiple lines. It can also include further indentations (like control structures).
  1. Description
  2. Esimerkit
Generaattori (engl. generator) on erityinen objektityyppi, joka toimii esimerkiksi for-silmukassa listan tavoin. Generaattori ei kuitenkaan ole muistissa oleva kokoelma arvoja, vaan erityinen funktio, joka tuottaa arvoja laiskasti, eli sitä mukaa kuin sitä käydään läpi. Tästä johtuen generaattorin ”sisältöä” ei ole mahdollista tulostaa, eikä siitä voida valita alkioita indeksiosoituksella. Generaattorit eivät kuulu alkeiskurssin aihepiiriin.
  1. Description
  2. Esimerkit
  3. Tilasanakirjat
Globaali muuttuja (engl. global variable) on pääohjelman tasolla esitelty muuttuja, jota muokataan suoraan funktiossa tuomatta sitä funktion nimiavaruuteen parametrin kautta. Globaalien muuttujien käyttö on huonoa ohjelmointityyliä, ja niiden sijaan tietoa kuuluisikin kuljettaa funktioille argumentteina ja ottaa funktiolta vastaan paluuarvoina muutettuja arvoja. Näin tekemällä välttää niin kutsutun globaalin tilan, joka huonontaa koodin ymmärrettävyyttä.
Global scope encompasses all names (variables, functions etc.) that have been defined on the main program level. All names that belong to the global scope can be accessed from anywhere in the program code. However they can only be assigned new values in the main program level. In general functions should only use constants and other functions from the global scope. Main program variables should always be passed to functions through parameters.
  1. Description
  2. Esimerkit
Hypystä (engl. jump) puhuttaessa tarkoitetaan ohjausrakenteen aiheuttamaa siirtymistä, jonka jälkeen ohjelman suoritus jatkuukin jostain muualta kuin seuraavalta koodiriviltä.
  1. Description
  2. Naming Conventions
Variables, functions, constants, modules and all kinds of things each have their own 'identifier - the part of the source code that's been assigned to mean that one particular thing. For instace if a programmer defines a variable width with the value 15 the name width can later be used to retrieve the variable's value. So the identifier can be thought of as a contract between the programmer and the Python interpreter about the meaning of a certain word in the code. Identifiers always belong to a namespace.
  1. Description
  2. Esimerkit
Indeksi (engl. index) on kokonaislukuarvo, joka osoittaa alkion sijainnin järjestetyssä tietorakenteessa (lista, monikko, mutta myös merkkijono!). Indeksit alkavat nollasta, joten viimeinen indeksi on (rakenteen pituus - 1). Tätä voi ajatella etäisyytenä rakenteen alusta. Python tuntee myös negatiiviset indeksit, jolloin indeksi -1 viittaa aina viimeiseen alkioon, -2 toiseksi viimeiseen jne. Kun rakenteesta otetaan alkio indeksin perusteella, puhutaan usein osoittamisesta.
  1. Description
  2. Esimerkit
Kun käytetään tietorakenteen, esimerkiksi listan, indeksiä, puhutaan (indeksi)osoittamisesta. Tämä osoittaminen merkitään hakasuluilla, esim. arvosanat[0]. Indeksiosoitus palauttaa alkion. Pythonissa voidaan myös osoittaa välejä: arvosanat[1:4] jolloin palautetaan osajoukko, joka on samaa tyyppiä kuin alkuperäinen tietorakenne (eli listasta palautetaan lista). Tässä osoituksessa on huomioitava, että kaksoispisteen vasemmalla puolen on ensimmäinen alkio joka tulee mukaan ja oikealla puolella ensimmäinen joka ei tule mukaan (esimerkki palauttaisi siis 3 alkiota).
Indented code lines have blank characters in front of them, either spaces or tabs. The role of indentation in general is to organize code and improve its readability. However in Python indentation is also used as the syntax for separating code blocks from each other - all lines with the same indentation level belong to the same block. On this course we prefer spaces, and the width of one indentation level is 4 spaces. All reasonable text editors can be configured to insert spaces instead of the tab character when the tab key is pressed.
  1. Description
  2. Example
An infinite loop is a loop that does not have an end condition - the code inside it gets repeated "infinitely". Infinite loops do have uses in programming but they can also be caused unintentionally by a bug in the code. In Python infinite loops are usually "achieved" only by while loops.
  1. Description
  2. Examples
Input when used within the context of this course is a text-based command or answer to a question that's been requested from the program's user. It is prompted with the input function and will always be a string. When a program prompts for input the entire program stops until the user has given their input.
  1. Description
  2. Examples
Interface in general refers to a connection between two things, and in programming it particularly means the way in which two parts of a program are connected to each other. For instance we can talk about the interface of a function which refers to the way in which the function accepts information as parameters and returns information as its return value. Likewise libraries typically have an API (Application Programming Interface) that tells how the library's features are used. Humans are also connected to programs through interfaces, specifically user interfaces.
  1. Description
  2. Examples
Key acts as an index for a dictionary. It can be used to look up a value from the dictionary. Each key corresponds to exactly one value. Keys are typically strings, but they can also be any immutable types like numbers or tuples.
  1. Description
  2. Examples
Keyword argument (kwarg) is used in function and method calls to assign arguments directly to parameter names. This is very often used with the format method: "Hello {name}".format(name="Hagrid"). Another common use case is with functions that have a whole lot of optional arguments and only some of them need to be given. Using keyword arguments can also make the code generally more readable, especially for arguments that are either True or False.
Kierros (engl. iteration) on toistorakenteiden eli silmukoiden yhteydessä käytetty sana. Kierroksella viitataan siihen, kun silmukan alla sijaitseva koodi suoritetaan kertaalleen alusta loppuun – tämä on siis yksi kierros.
Kirjasto (engl. library) tai moduuli (engl. module) (kuten niitä Pythonissa virallisesti kutsutaan) on valmiiksi kirjoitettua koodia, jolla on oma rajattu tarkoituksensa. Tyypillisesti kirjasto sisältää ainakin nipun aihepiiriinsä kuuluvia funktioita, mutta voi sisältää muutakin (esim. luokkia tai vakioita). Esimerkiksi Turtle on kirjasto, jonka tarkoitus on tarjota helposti käytettäviä piirtofunktioita.
  1. Description
  2. Materiaaliesimerkki
  3. Peruskäyttö
Komentoriviargumentti (engl. command line argument) tai -parametri on nimitys lisätiedolle, joka annetaan komennon yhteydessä kun ohjemaa käynnistetään komentoriviltä. Komentoriviargumentit erotetaan toisistaan tyypillisesti välilyönnillä. Esimerkiksi komennossa python koodi.py koodi.py on itse asiassa komentoriviargumentti. Komentoriviargumentteja voi käsitellä Python-koodissa sys-moduulin argv-muuttujan kautta.
  1. Description
  2. Esimerkit
Kommentti (engl. comment) on kooditiedostossa olevaa tekstiä, joka ohitetaan kun koodia suoritetaan. Kussakin kielessä on oma tapansa sille miten rivi merkitään kommentiksi. Pythonissa se on #- eli risuaitamerkki (engl. hash character), jonka jälkeen riviltä löytyvän tekstin Python-tulkki ohittaa kokonaan. Kommenteilla voi selventää koodin lukijalle (tai itselleen) mitä koodissa tapahtuu. Yleensä kommentit on hyvä laittaa omille riveilleen kommentoitavan koodin yläpuolelle.
Ohjelman ja sen funktioiden toiminta kuvataan yleensä mieluiten dokumenttimerkkijonossa. Kommentteja käytetään enemmänkin välihuomioiden tekemiseen.
Toinen tapa käyttää kommentteja on tilapäisesti kommentoida rivejä pois esimerkiksi vaihtoehtoisen koodin testaamiseksi. Tällöin aiempaa koodia ei tarvitse poistaa – kätevää, jos myöhemmin osoittautuu, että sitä tarvitaan sittenkin.
Ohjelman käyttämät arvot ovat kovakoodattuja (engl. hard coded) silloin, kun ne esiintyvät literaaliarvoina – eli semmoisenaan – ohjelman lähdekoodissa sen sijaan, että ne selvitettäisiin ajonaikaisesti esimerkiksi kysymällä käyttäjältä tai lukemalla tiedostosta.
Kutsupyyntö (eng. callback) on erityisesti nykyaikaisessa ohjelmoinnissa yleinen mekanismi, jossa toiselle - usein jonkun muun tekemälle - ohjelman osalle annetaan funktio, jota sen tulee kutsua toimintansa aikana. Jos tavallinen funktiokutsu vastaa puhelinsoittoa, kutsupyyntö on loogisesti soittopyyntö. Jos ohjelman osa käyttää kutsupyyntöä, sen dokumentaatio tyypillisesti kertoo, millaisen funktion sille voi antaa - erityisesti mitä parametreja funktiolla voi olla ja millainen arvo sen tulee palauttaa.
Käsittelijä(funktio) (engl. handler) on funktio, joka on kiinnitetty tapahtumaan siten, että sitä kutsutaan kun tarkkailtu tapahtuma havaitaan. Tämä johtaa siihen, että yleensä käsittelijää ei kutsuta samassa koodissa missä se on määritelty, vaan se toimii takaisinkutsuna. Käsittelijät liittyvät yleensä käyttöliittymä- ja pelikirjastoihin, joissa ohjelman pääsilmukka pyörii kirjaston sisällä ja tarkkailee tapahtumia. Käsittelijät ovat varsinaisen sovelluksen tapa toteuttaa omat toimintonsa tapahtumien kautta. Koska sovelluksen kirjoittaja ei voi vaikuttaa siihen miten käsittelijäfunktiota kutsutaan, sen parametrien ja paluuarvojen tulee vastata kirjaston antamia määrityksiä.
Käyttöliittymäelementti (engl. UI element, widget) on jokin (yleensä graafiselle) käyttöliittymälle ominainen komponentti, jonka kautta käyttäjän vuorovaikutus ohjelman kanssa on mahdollista. Tällaisia ovat esimerkiksi napit, valikot, liukusäätimet ynnä muut.
Lause (engl. statement) on ohjelmointikielessä nimitys yksittäiselle suoritettavalle asialle, joka on yleensä yksi koodirivi.
Lauseke (engl. expression) tarkoittaa ohjelmoinnissa evaluoitavaa yksikköä. Esimerkiksi 5 + 5 ja "aasi" != "apina" ovat lausekkeita, jotka evaluoituvat arvoiksi 10 ja True. Lauseke yksin ei muuta ohjelman tilaa mitenkään, ellei sillä ole sivuvaikutuksia. Sen sijaan lauseke vaikuttaa osana lausetta.
  1. Description
  2. Esimerkit
Leikkaamisella (engl. slice) tarkoitetaan sitä, kun sekvenssistä (yleensä listasta, mutta myös merkkijonoista) otetaan osasekvenssi. Lopputuloksena on samaa tyyppiä oleva arvo, joka on kopio valitusta alueesta. Valinnassa merkitään aloitus- ja lopetusindeksit. Molemmat ovat tosin valinnaisia. Leikkaus merkitään sivu = kokoelma[5:10] joka ottaisi siis alkiot indekseistä 5…9. Kaksoispisteen jälkeinen luku on ensimmäinen indeksi jota ei oteta mukaan!
Leikkaaminen ei koskaan aiheuta IndexErroria!
  1. Description
  2. Esimerkit
Lista (engl. list) on järjestetty kokoelma arvoja, joka on Python-ohjelmoinnissa todellinen monitoimikone. Lista voi sisältää mitä tahansa arvoja, eikä sen kokoa tarvitse tuntea ennalta.
Listassa olevia arvoja kutsutaan alkioiksi. Jokaisella alkiolla on listassa paikka, jota kutsutaan indeksiksi. Indeksit alkavat nollasta! Kaiken tämän lisäksi lista on luonteeltaan muuntuva tietotyyppi. Kaikesta tästä on kerrottu hyvin paljon kolmosmateriaalissa.
Lista voi myös sisältää muita listoja. Tällä tavalla muodostettua tietorakennetta kutsutaan kaksiulotteiseksi listaksi (engl. two-dimensional list). Tietenkin sisäkkäisiä listoja (engl. nested list) voi olla kahtakin tasoa syvemmälle, jolloin ulottuvuuksien lukumäärä kasvaa vastaavasti. Tällöin puhutaan moniulotteisista listoista (engl. multidimensional list).
Literal (literal value) is a generic name for any values that are present in the code as such. I.e. the value is not assigned to a variable but has been written into the code itself. For instance in the statements x = 5 and print("donkey"), 5 and "donkey" respectively are literals. The term is used primarily for simple types: numbers, boolean values and strings.
  1. Description
  2. Muunnokset
Liukuluku (engl. floating point number, lyh. float) on tietokoneiden käyttämä desimaaliluvun approksimaatio. Tietokoneet eivät arkkitehtuurinsa vuoksi pysty käsittelemään oikeita desimaalilukuja, joten niiden tilalla käytetään liukulukuja. Liukuluvut saattavat aiheuttaa pyöristysvirheitä - tämä on hyvä pitää mielessä niitä käyttäessä.
Local variable is a variable that has been defined inside a limited scope, typically - and especially on this course - inside a function (including function parameters). A local variable cannot be accessed from the outside. In addition it gets destroyed when the scope it belongs in stops being relevant - usually when a function call ends.
Main program is the part of the code where the real execution of the program starts. As a rule of thumb any statements and control structures that are attached to the left boundary are part of the main program. Main program is usually at the very end of a code file and usually inside if __name__ == "__main__": statement. However do not use this statement in the earlier exercises because then the checker cannot execute your program's main program.
Merkillä (engl. character) tarkoitetaan ohjelmoinnissa yksittäistä datana esiintyvää kirjainta, numeroa, välimerkkiä tai muuta vastaavaa symbolia. Pythonissa merkki edustaa pienintä merkkijonon yksittäistä palasta.
  1. Description
  2. Esimerkit
Merkkijono (engl. string) on tietotyyppi, joka sisältää tekstiä. Sitä käytetään erityisesti käyttäjän kanssa viestimiseen. Merkkijonojen sisältöä voidaan myös tallentaa tiedostoihin. Pythonissa merkkijono merkitään lainaus- tai heittomerkillä (esimerkiksi "aasi" tai 'aasi'). Suosimme ensimmäistä. Merkkijono voidaan merkitä myös kolmella merkillä jolloin se voi olla monirivinen – tätä käytetään erityisesti dokumenttimerkkijonojen (docstring) kanssa. Merkkijono on muuntumaton tietotyyppi – kaikki, mikä näennäisesti muokkaa merkkijonoa, tosiasiassa luo (ja palauttaa) siitä muutetun kopion.
Method Call is a similar process to function calls. As a significant different the target object is defined by prefixing method name with it whereas it would be given as an argument in a function call. In a typical method call an object operates on itself. For instance word.upper() is a method call that operates on the object referred to by the word variable.
  1. Description
  2. Esimerkit
Metodi (engl. method) on funktio, joka on osa objektia eli objektin ominaisuus, jolla objekti usein muuttaa omaa tilaansa. Metodia kutsuttaessa käsiteltävä objekti tulee kutsun eteen: valinta.lower(). Metodeita kutsutaan myös joskus jäsenfunktioiksi (engl. member function).
Module is basically any Python code file. Although more commonly module is used as a synonym for library. Typically a module contains functions and potentially other (like constants and classes) things that are connected to a certain domain or use case. Large programs are also often split into modules so that each module focuses on one aspect of the program.
  1. Description
  2. Esimerkit
Monikko (engl. tuple) on ns. jäädytetty lista. Se on siis järjestetty kokoelma arvoja kuten listakin, mutta se on muuntumaton objekti - sen sisältöä ei siis voi muuttaa muuten kuin luomalla uuden kopion. Monikkoja voidaan siis ainoastaan luoda uusia ja lukea. Monikko merkitään yleensä kaarisulkeilla: (1, 2, 3), mutta myös pelkkä 1, 2, 3 on monikko.
Toisin kuin lista, monikko voi toimia sanakirjan avaimena.
  1. Description
  2. Examples
Python objects can be divided into two types: mutable and immutable. Mutable objects can have their values changed during program execution e.g. as the result as a method call. The most common example of a mutable object is a list: hogwarts.append("Hufflepuff") changes a list named hogwarts by adding a new value to it. Any references to this list later in the program will access the contents that now include "Hufflepuff".
  1. Description
  2. Esimerkit
Pythonissa objektit erotellaan muuntuviin ja muuntumattomiin. Muuntumaton (engl. immutable) arvo on sellainen, jonka sisältö ei voi muuttua - kaikki operaatiot jotka näennäisesti muuttavat arvoa tosiasiassa luovat siitä uuden kopion, joka yleensä sijaitsee uudessa muistipaikassa. Esimerkiksi merkkijonot ovat tyypillinen muuntumaton tyyppi Pythonissa. Siksi merkkijonojen kanssa näkee yleensä jotain tällaista: valinta = valinta.lower()
Ohjelmointikielissä on oleellista ymmärtää määrittelyn (engl. definition) ero suorittamiseen. Määrittelemällä luodaan kuvauksia funktioista, muuttujista ja erilaisista tietorakenteista – tavallaan siis kerrotaan ohjelmointikieltä käyttäen, minkälainen jokin edellä mainituista asioista on, tai mitä sen kuuluisi tehdä. Pythonissa määrittelyn ja suorittamisen ero on helpoin ymmärtää funktioiden avulla. Funktiomäärittelyssä funktio vasta luodaan – ikään kuin tehtaalla koottu laite. Funktiota varsinaisesti käytetään – eli sen toiminnallisuus hyödynnetään funktiota varten määriteltyä koodia ajamalla – vasta funktiokutsun yhteydessä. Samaa vertausta käyttäen funktiokutsu vastaa siis sitä hetkeä, kun tehtaalta saapunut laite käynnistetään.
Nimikonflikti syntyy, jos useammalle kuin yhdelle arvolle koitetaan antaa sama nimi. Tällöin tapahtuu niin, että tuoreempi sijoitus jåä voimaan. Tästä seuraa yleensä ohjelman kaatavia virheitä, koska usein arvot ovat eri tyyppiä. Voi jopa käydä niin, että epämääräisesti nimetyn funktion päälle tallennetaan vahingossa saman niminen muuttuja.
Namespace is a group of names (variables, functions, constants etc.) that belong to the same context. For example the names inside a function (inside the function definition code block) form their own namespace: names inside the function are only accessible from within. There's also a global namespace which is the main program's namespace. Using normal import in a program creates a new namespace within that program that is accessible through the module's imported name - the names inside the module form their own namespace. See also: Scope.
  1. Description
  2. Esimerkit
Nimeämätön vakio tai taikaluku (engl. magic number) on koodissa esiintyvä literaaliarvo, jota ei selitetä millään tavalla. Hyvään ohjelmointityyliin kuuluu taikalukujen välttäminen. Oikea – itsedokumentoiva – tapa on nimetä koodissa esiintyvät vakiot muuttujiin, jolloin niiden muuttaminen onnistuu tarpeen tullen yhdestä paikasta yhdellä muutoksella, ja koodin lukijan on helpompi ymmärtää koodia.
  1. Description
  2. Syventävää nippelitietoa
Näppäimistökeskeytyksellä (engl. keyboard interruption) voi pakottaa jumiin jääneen ohjelman sammumaan. Sen saa aikaan painamalla Ctrl+C sen terminaalin ollessa auki, jossa ohjelma pyörii. Pythonissa näppäimistökeskeytyksen saa käsiteltyä kaappaamalla KeyboardInterrupt-poikkeuksen try-except-rakenteella.
Objekti (engl. object), joskus myös olio, on Pythonissa yleistä terminologiaa. Kutsumme objekteja pääasiassa arvoiksi alkeiskurssilla, mutta Pythonissa kaikkea voi käsitellä objekteina. Tämä tarkoittaa, että mihin tahansa voidaan viitata muuttujilla (esimerkiksi funktion voi sijoittaa muuttujaan). Tämän kurssin puitteissa objekti-termiä käytetään sellaisista arvoista joilla on metodeja.
Objektit nousevat merkittävämpään rooliin alkeista eteenpäin, erityisesti koodissa jossa käytetään luokkia.
Ohjausrakenne (engl. control flow) on yleisnimitys ohjelmointikielen sallimista keinoista, jotka hallitsevat jollain tavalla ohjelman suorituksen kulkua. Näihin rakenteisiin lukeutuvat kurssin puitteissa ehtorakenteet, toistorakenteet sekä poikkeusten käsittely.
Ohjelmointityyli (engl. programming style) on joukko ohjeita tai tapoja, joita ohjelmoija noudattaa koodia kirjoittaessaan. Näihin tapoihin lasketaan muun muassa sisennyksen syvyys, muuttujien ja funktioiden nimeämiskäytännöt, välilyöntien käyttö lauseissa sekä monet muut tyyliseikat. Ohjelmointityylejä on useita erilaisia, ja tällä kurssilla opetetaan noudattamaan tiettyjä tyyliin liittyviä sääntöjä.
Ohjelmointivirhe eli bugi (engl. bug) on virhe ohjelman lähdekoodissa. Bugien seurauksena ohjelma ei välttämättä käynnisty ollenkaan, voi joissain tilanteissa toimia väärin ja joskus aiheuttaa jopa erittäin vakavia tietoturvaongelmia. Huolellinen ohjelmointi ja testaaminen – myös harvinaisilla nurkkatapauksilla – vähentää bugien todennäköisyyttä. Ohjelman havaitun virheellisen toiminnan aiheuttavan koodin etsimistä ja korjaamista kutsutaan debuggaukseksi.
Ominaisuus (attribute) liittyy objekteihin siten, että objekteilla voidaan sanoa olevan ominaisuuksia. Tällä kurssilla useimmat näistä ominaisuuksista ovat metodeja, mutta ne voivat olla myös arvoja. Objektin ominaisuutta käsitellään notaatiolla, jossa objektin nimen ja ominaisuuden nimen väliin tulee piste, esim: valinta.lower()-metodikutsussa valinta on objekti ja lower on ominaisuus.
Operand is the fancy name used in mathematics and programming for values that are used in an operation. E.g. 5 + 8 is an addition operation and its operands are 5 and 8. Operands can be thought of as the subjects of operations.
  1. Description
  2. Examples
Operation is a term used for anything carried out by an operator in the code. Mathematical operations are typical examples. An operation consists of an operator and one or two operands. For instance 5 + 5 is an operation.
Operator is a name for symbols that define an operation in mathematics and programming. Operators always appear with at least one operand, but often two. An example of an operator would be + symbol which denotes an addition operation.
An argument in a function call is an optional argument if its corresponding parameter has been given a default value. This means that it's possible to call the function without giving that argument. If there are multiple optional arguments for a function, they are often given using keyword arguments.
  1. Description
  2. Parametrien valinta
  3. Lisämuotoilu
Paikanpidin (engl. placeholder) on yleisesti tilapäinen merkintä, joka on tarkoitus korvata toisella. Tällä kurssilla sitä käytetään lähinnä merkkijonojen muotoilun yhteydessä. Paikanpidin merkkijonon sisällä merkitään aaltosulkeilla ("Hei {}".format(nimi)). Merkkijonojen paikanpitimissä voi olla lisämäärityksiä kuten näytettävien desimaalien lukumäärä ("Aaseilla on keskimäärin {:.2f} jalkaa".format(keskiarvo)). Paikanpitimien tilalle sijoitetaan format-metodikutsun argumentit, normaalisti esiintymisjärjestyksessä. Ne voidaan kuitenkin myös numeroida tai käyttää avainsanoja.
Parameter is a variable defined along with a function. They are variables that are assigned values from arguments when the function is called. In other words when values are transferred in a function call, they are called parameters from the function's point of view. E.g. in def prompt_input(question, error_msg): question and error_msg would be parameters. Parameters can also have a default value that will be used as its value if the matching argument is not given in a function call - this makes the argument optional.
Parametrization means expanding the use cases of a process by turning some of its values into variables. This way the same process can be repeated for multiple sets of values with different results. Mathematical functions are one kind of parametrization: all points represented by the function are produced by changing the value of a variable (e.g. x). In programming parametrization is quite concrete because usually a procedure is turned into a function. The function's parameters then define which values are not fixed and the function will behave differently with different parameters.
  1. Description
  2. Esimerkit
Poikkeus (engl. exception) on ohjelmointikielessä määritelty virhetilanne. Poikkeuksella on tyyppi (esimerkiksi TypeError), jota voi käyttää poikkeuksen käsittelyssä ohjelman sisällä sekä myös apuna virhetilanteen ratkaisussa. Tyypillisesti poikkeukseen liitetään myös viesti, joka kertoo mistä ongelmassa on kyse. Pythonissa poikkeuksia käsitellään try-except-rakenteilla.
  1. Description
  2. try-except-else-finally
Poikkeusten käsittely (engl. exception handling) on ohjelmointikieleen sisäänrakennettu keino ohjelmoijalle reagoida poikkeuksiin. Pythonissa poikkeusten käsittely onnistuu try-except-rakenteella, jossa sekä try: että except: aloittavat omat lohkonsa; try-lohkon alle kirjoitetaan se koodi, joka mahdollisesti aiheuttaa jonkun tietyn poikkeuksen ja except-lohkon alle taas se koodi, joka suoritetaan siinä tapauksessa, että kyseinen poikkeus tapahtuu. Joissain muissa ohjelmointikielissä except-avainsanan sijaan käytetään avainsanaa catch, minkä takia yleisesti puhutaan poikkeusten kiinni ottamisesta.
  1. Description
  2. Esimerkit
Polku (engl. path) on tiedoston tai kansion sijainti kiintolevyllä. Polku voi olla absoluuttinen tai relatiivinen. Absoluuttinen polku sisältää kaikki kansiot aina juureen asti (esim. Windowsissa asemakirjain kuten C:), kun taas relatiivinen sisältää kansiot aktiiviseen kansioon asti (ts. siihen kansioon mistä ohjelma käynnistettiin). Polku esitetään ohjelmointikielissä yleensä merkkijonona, ja polun osat erotetaan kauttaviivalla /. Useimmiten polkuja muodostaessa kannattaa käyttää os.path-moduulin join-funktiota.
Precedence defines the execution order of instructions or operations on a line of code. Operations of different type have different precedence in execution order. These can be found from the link below. Operations with same precedence are executed from left to right. Like in mathematics, the order can be changed by using parentheses.
  1. Description
  2. Examples
Printing is somewhat different in programming context - although not really that far removed - from combining paper and ink to pages. In context of computer programs it usually means producing text on the screen, especially to a terminal. Python has a function for this purpose: print(...) that prints its argument(s) to the terminal.
Programming problem is the goal of a programming task. It is therefore some sort of a need that has been recognized and a program is coded to fulfill that need. The need can be e.g. automatization of a task, creating a web site or just making a fun game.
  1. Description
  2. Examples
Interactive Python interpreter or Python console as we like to call it is a program that executes Python code lines as they are written into it. It shows the return value of the line if any exists (e.g. the result of a mathematical operation). On this course we use IPython instead of the vanilla Python console. After installation you can start IPython by typing ipython to the terminal.
Python interpretetr is a program that transforms Python code into instructions to the computer's processor. It's responsible for executing both code files and individual lines in the Python console. The word can also be used to mean Python console though, so be careful.
Referring is the method in which a variable is connected to its value. The target of the reference is the computer's memory and the variable itself - under the hood - contains an address where from memory the value can be found.
  1. Description
  2. Esimerkit
Rekursio (engl. recursion) on yleinen ohjelmointitermi, joka viittaa siihen, kun funktio kutsuu itseään. Rekursio on siis funktiopohjainen tapa luoda toistorakenne, jossa funktio välittää itselleen uusia argumentteja ja käsittelee omia paluuarvojaan. Rekursio on kätevä esimerkiksi puumaisia rakenteita käsitellessä – käsitellään yksi ”oksa” jollain tavalla, ja sitten rekursion avulla käsitellään tästä oksasta lähtevät oksat ja niin edelleen. Pythonissa rekursiota käytetään aika vähän. Osasyynä on sisäänrakennettu rekursiorajoitus, joka asettaa katon sille, kuinka monta kertaa funktio saa kutsua itseään.
Relative path is an operating system concept that indicates the path to a file or folder from the current folder. Relative paths do not care what kind of a garden maze of folders exists between the disk drive root and the current path. For this reason relative paths are usually used to refer to a program's own sub folders. This allows the program to be moved to another location without updating any paths in the code.
  1. Description
  2. Examples
Return is a process that happens when a function's execution ends. Typically the value(s) returned by the function are defined inside the function with a return statement. In the code that calls the function, the return value will replace the function call and can therefore be assigned to a variable or passed on to another function.
Return value is the value (or values) that a function returns when its execution ends - the function's result. Functions in Python can have multiple return values. When reading code you can regard return value as something that will replace the function call when the function execution has ended. A return value is defined inside a function with the return statement. E.g. in return True there is one return value: the literal boolean value True.
Rivinvaihtomerkki (engl. newline, line break, end of line; lyh. EOL) eli "\n" on merkki, joka tulostettaessa tai tiedostoon kirjoitettaessa saa aikaan rivinvaihdon.
Sapluuna (engl. template) on muotti esimerkiksi tekstille, joka käyttäjälle halutaan näyttää, mutta joka ei semmoisenaan ole vielä valmis. Sapluunasta siis puuttuu tietoa, joka on tarkoitus saada sapluunan paikanpitimien tilalle.
Kurssilla yleisin sapluuna on merkkijono, jossa on paikanpitimiä format-metodia varten.
  1. Description
  2. Examples
Scope is a concept related to the visibility of names (variable, function etc.) in certain parts of the program. For instance within a function block any names defined inside the function can be used because they belong to the same scope. Other functions cannot access these names because they belong to a different scope. Names in the global (main program) scope can be accessed from anywhere in the code.
Sekvenssi (engl. sequence) on mikä tahansa arvo Pythonissa, jossa on tavaraa peräkkäin – esimerkiksi merkkijono, lista ja monikko kuuluvat näihin.
Matematiikasta tuttu sidontajärjestys (engl. precedence) määrittää sen, missä järjestyksessä lausekkeen operaatiot suoritetaan.
lopputulos = 10 + 2 * (2 + 3)
Yllä olevan koodin lopputulos on 20, sillä ensin lasketaan yhteen luvut 2 ja 3, joiden summa kerrotaan kahdella, ja johon lopuksi lasketaan vielä yhteen luku 10. Esimerkissä korkein presedenssi on siis sulkeilla, toisiksi korkein kertolaskulla ja matalin yhteenlaskulla.
Silmukkamuuttuja (engl. loop variable) on for-silmukan määrittelrivillä esitelty muuttuja, joka saa yksitellen kaikki läpikäytävän sekvenssin (esim. lista) arvot. Sen arvo siis vaihtuu jokaisella silmukan kierroksella. Yksinkertainen esimerkki materiaalista: for elain in elukoita:, jossa siis elain on silmukkamuuttuja. Mikäli läpikäytävä sekvenssi sisältää monikoita, silmukkamuuttujia voi olla myös useita: for opiskelija, arvosana in arvostelu:. Silmukkamuuttujat eivät ole erillisessä nimiavaruudessa, joten niiden tulee erota muista funktion/pääohjelman muuttujista.
Solution model is an abstract construct developed by a programmer regarding how the solution to a programming problem works. It's not code yet, but it should be explicit and dividable into distinctive steps so that it can be turned into a program. Solution models can be sketched inside one's mind, by using paper and by trying this out in the Python console.
Source code or code means text that has been written with a programming language.
  1. Description
  2. Examples
Stub function is a function that's been defined properly with all the parameters etc. but has no content in it. They are typically put into the program code when planning its overall structure. Doing so allows the functions to be called elsewhere in the code while the function isn't fully implemented yet. The contents of a stub function usually come down to just pass, an informative print, or returning some placeholder default value. In larger projects stub functions sometimes are set to raise a NotImplementedError exception which makes it easy to locate the function that's not ready yet.
Syntaksi (engl. syntax) on koodin kielioppi. Esimerkiksi Pythonin syntaksi määrittää, millainen teksti on tulkittavissa Python-koodiksi. Jos teksti ei noudata koodin syntaksia, sitä ei voida suorittaa. Syntaksi antaa myös koodaajalle tietoa siitä, missä muodossa halutunlainen ohje tulee antaa.
Syntax error is an exception that happens when the Python interpreter inspects a code file before executing it and notices something broken in there, i.e. code that is written incorrectly. A code with syntax errors is not run at all.
One common syntax error is unbalanced parentheses. This results in a strange error message in the sense that Python reports the next line as the cause of the error. Remember to check previous lines as well when you receive strange syntax errors!
Takaisinkutsu (engl. callback) on yleinen ohjelmoinnissa käytetty menetelmä, jossa funktio ottaa parametrin kautta vastaan funktion kutsuttavakseen heti (synkroniset takaisinkutsut) tai joskus tulevaisuudessa (asynkroniset takaisinkutsut). Nimensä menetelmä on saanut soittopyynnöstä: kutsuttavaa funktiota, jolle jokin funktio välitetään argumenttina, ”pyydetään” kutsumaan tätä annettua funktiota. Pythonissa listojen sort()-metodin key-parametri on esimerkki callback-funktioiden käytöstä. Usein käyttöliittymiä toteutettaessa käyttöliittymäelementteihin kytketään callback-funktioita.
Tallennusformaatti on tiedoston "syntaksi", joka siis kertoo miten data on tiedostoon tallennettu. Tallennusformaatti asettaa rajat sille millaista dataa tiedostossa voidaan esittää. Sen perusajatus on se, että koodissa olevat tietorakenteet voidaan tallentaa tiedostoon jossain muodossa, ja myöhemmin ladata sieltä uudelleen. Tallennusformaatti voi seurata jotain alan standardia (esim. JSON), mutta lopullisesti on ohjelman tekijän vastuulla päättää mitkä tiedot ovat ohjelman kannalta relevantteja ja miten ne on paras esittää.
Tapahtuma (engl. event) on ohjelmointikäsite, jota käytetään yleisesti interaktiivisten sovellusten, jotka pyörivät reaaliajassa, yhteydessä. Näissä sovelluksissa on yleensä pääsilmukka, joka tarkkailee tapahtumia, joita voivat olla esimerkiksi: käyttäjä klikkaa hiirellä, käyttäjä painaa näppäimistön nappia, tietty aika on kulunut jne. Tapahtumiin voidaan kiinnittää käsittelijäfunktioita, jolloin funktiota kutsutaan aina kun tapahtuma havaitaan. Tällä tavalla helpotetaan merkittävästi interaktiivisten sovellusten ohjelmointia, koska itse sovellusta kirjoittaessa ei tarvitse huolehtia siitä miten ruudun tapahtumat tunnistetaan.
Periaatteessa tekstitiedosto (engl. text file) on mikä tahansa tiedosto, jonka sisältö voidaan lukea nätisti tekstieditorilla. Tämän kurssin kontekstissa kuitenkin tekstitiedosto on erityisesti sellainen tiedosto, jonka sisältöä käsitellään tekstinä Pythonissa. Eli siinä missä kooditiedostoja suoritetaan, tekstitiedostoja käytetään datan varastoimiseen ohjelman ajojen välillä.
Terminal, command line, command prompt and shell' are different names to the text based interace of an operating system. It is used for text-based operating system commands and for running terminal programs. On this course we mostly move around with cd (change directory) and use ipython command to run code files and start the Python console.
  • In Windows you can open the terminal by typing cmd to the start menu search
  • In Mac OS X you can start the terminal by typing terminal to Finder
  • In Linux you can open the terminal from the desktop by pressing Ctrl + Alt + T or by typing terminal to the search
Testaamalla eli kokeilemalla (engl. test) selvitetään, toimivatko hartaasti näppäillyt koodirivit halutulla tavalla. Testejä suorittamalla siis etsitään koodista mahdollisia ohjelmointivirheitä. Ohjelmien testaaminen on jopa niin olennaista, että joidenkin alan työntekijöiden tehtävänä on ainoastaan automatisoitujen testien ohjelmointi. Lovelace-järjestelmän tarkistimet testaavat järjestelmään lähetetyt koodit.
Tiedostokahva (engl. file handle) on erityinen objekti, jota Pythonissa käytetään avattuun tiedostoon viittaamiseen. Huomattavaa on, että kahva ei ole sama asia kuin tiedoston sisältö, mutta sen kautta voidaan lukea tiedoston sisältö tai kirjoittaa tiedostoon. Tiedostokahva saadaan käyttöön open-funktiolla, jolle määritetään avattavan tiedoston sijainti sekä avausmoodi, jossa se avataan, esim: with open("aasi.txt", "r") as tiedosto: avaa aasi.txt-tiedoston with-lauseessa (jossa tiedostot tulee yleensä avata) siten, että muuttujasta nimeltä tiedosto löytyy tiedostokahva.
Tiedostonimi (engl. filename) on tiedoston koko nimi, joka sisältää varsinaisen tiedostolle annetun nimen sekä tiedostopäätteen. Esimerkiksi aasisvengaa.py on kokonainen tiedoston nimi, jossa varsinainen annettu nimi on aasisvengaa ja pääte on .py.
Koodin sisällä tiedostojen nimet esitetään merkkijonoina.
Tila (engl. state) viittaa sananmukaisesti ohjelman tilanteeseen. Käytännössä ohjelman tila kattaa kaikki sen tila-avaruuteen (engl. state space) kuuluvat asiat, kuten muuttujien arvot, tiedostoissa olevan datan ja sen, mitä kohtaa koodista sillä hetkellä ollaan suorittamassa. Taattu keino saada aikaiseksi korjauskelvotonta spagettikoodia on käyttää niin kutsuttua globaalia tilaa (engl. global state) – rikos, johon syyllistyvät epäpuhtaat globaaleja muuttujia hyödyntävät funktiot.
Myöhemmillä, ohjelmoinnin käsitteitä formaalimmin tutkivilla kursseilla tutuksi tulevat muun muassa tilakoneet (engl. state machine) sekä tilattomat (engl. stateless) että tilalliset (engl. stateful) ohjelmat.
Toistorakenne tai silmukka (engl. loop) on ohjausrakenne, jonka alaisuuteen kirjoitettua koodia toistetaan joko tietty lukumäärä toistoja tai kunnes jokin ehto lakkaa toteutumasta. Toistorakenteiden avulla ohjelmat pystyvät jouhevasti palaamaan aiempaan kohtaan suoritusta ja niillä voidaan myös helposti käsitellä suuria määriä arvoja. Toistorakenteita ovat Pythonissa for- ja while-silmukat.
Tosi (engl. true) on toinen kahdesta mahdollisesta totuusarvosta ja toisen, eli epätoden, vastakohta. Sitä voidaan pitää lopputuloksena loogisissa ja vertailuoperaatorioissa, jotka pitävät paikkansa. Esimerkiksi vertailuoperaatio 5 > 4 pitää paikkansa, joten kyseinen operaatio evaluoituu todeksi. Pythonissa totta merkitään avainsanalla True.
  1. Description
  2. Esimerkit
Traceback is the process of tracing an error back to its source. When an exception occurs the Python interpreter prints an error message that includes a traceback. It's presented as a stack of function calls where the last one is the funtion where the exception occurred. They are also called stacktrace for this reason. For example if the main program calls the funcion f which in turn calls function g where the exception occurs, the stack would be
main programfg.
  1. Description
  2. Examples
Type conversion (also type casting and type coercion) means changing the type of a variable or literal value to another one. In Python this is commonly done when a number is requested from the user and it is returned as a string. In practice this can be done with e.g. int("123") or float("3.14"). In some cases Python performs type conversion automatically, usually when mathing with floats and integers.
Tyylisäännöt ovat kokoelma suosituksia, joiden mukaan koodia tulisi kirjoittaa. Kullakin kielellä on yleensä omansa. Tyylisääntöjen rikkominen ei varsinaisesti riko ohjelmaa, mutta tyylisääntöjen mukainen koodi on miellyttävämpää lukea ja usein tästä johtuen myös helpompi korjata. Tällä kurssilla seurataan Pythonin virallista tyylistandardia erityisesti tekstikenttätehtävissä. Myös tiedostotehtävissä on koodin laadun tarkistus, jossa käytetään PyLint-ohjelmaa.
  1. Description
  2. Esimerkit
Tyyppi (engl. type) on arvon ominaisuus – jokainen arvo edustaa aina jotain tiettyä tyyppiä. Tyypin tarkoitus on siis kertoa, minkälaisesta arvosta on kyse. Käytännössä tästä seuraa myös se, mitä operaatioita arvoilla voi tehdä, ja mitä metodeja niiltä löytyy. Funktiot on myös miltei aina toteutettu siten, että niille syötettävien argumenttien täytyy olla tietyntyyppisiä, jotta funktio voisi toimia. Tyypit ovat yksi ohjelmoinnin keskeisimmistä käsitteistä.
Pythonissa arvojen sopiminen koodista löytyviin operaatioihin tarkistetaan tilannekohtaisesti näiden arvon ominaisuuksien perusteella – ei siis suoraan itse tyyppiä tarkastamalla. Esimerkiksi useimmissa tapauksissa kokonaisluku ja liukuluku kelpaavat molemmat, mutta on myös tapauksia, joissa näin ei ole (esimerkiksi merkkijonoa ei voi kertoa liukuluvulla).
Tällä kurssilla tyypillisiä tyyppejä ovat kokonaisluku (int), liukuluku (float), merkkijono (str), lista (list), totuusarvo (bool) ja monikko (tuple). Myös funktioilla on oma tyyppinsä!
User Interface (UI) is the interface between a program and its user (typically human). In a simple text based UI input function calls are used to prompt things from the user and print calls can be used to display instructions and results.
Many programs intended for end users (consumers) typically offer a graphical user interface (GUI). These typically involve icons, popup menus and other elements that can be poked with by mouse or touch screen. On this course we will take a very shallow stab at graphical user interfaces in the final project.
A simplified way to describe variable is to think of it as an information storage - it contains something. This expression is often used in speech even though it's not entirely accurate. The more accurate description is that a Python variable is a reference to a value. It's a connection between the variable's human-readable name and a value that's stored in the computer's memory. So the variable in fact doesn't contain the value, it just contains information about where it is.
Vertailuarvoa käytetään esim. listojen järjestämisessä. Vertailuarvo on listan alkiosta johdettu arvo, jota käytetään järjestämisperusteena. Esimerkiksi jos lista sisältää listoja, vertailuarvo voi olla jostain tietystä indeksistä otettu alkio. Se voi olla myös monimutkaisempi johdannainen, kuten listan alkioiden summa tai keskiarvo.
  1. Description
  2. Esimerkit
Avainsana break on erityinen komento, jota käytetään toistorakenteissa. Se päättää silmukan suorituksen välittömästi, ja koodin suoritus jatkuu ensimmäiseltä silmukan jälkeiseltä riviltä. Jos silmukassa oli else-osa, siihen ei mennä.
  1. Description
  2. Esimerkit
continue on toinen toistorakenteisiin liittyvä avainsana (toisen ollessa break). Toisin kuin break, joka lopettaa koko silmukan suorituksen, continue keskeyttää ainoastaan meneillään olevan kierroksen suorituksen – suoritus jatkuu siis seuraavasta kierroksesta. Huomaa, että tätä avainsanaa tarvitaan vain tilanteissa, joissa halutaan jättää osa kierroksesta suorittamatta, eli silmukan kierroksen loppuun ei ole tarpeen laittaa continue-avainsanaa.
  1. Description
  2. Esimerkit
enumerate on Pythonissa sisäänrakennettu funktion kaltainen erityisobjekti, joka tuottaa generaattoriobjektin. Sitä käytetään pääasiassa for-silmukoissa silloin, kun on tarpeen saada läpi käytävän listan alkioiden indeksit käyttöön silmukan sisällä. enumerate-objekti tuottaa monikkoja, joissa ensimmäisenä on alkion indeksi ja toisena itse alkio. Käyttöesimerkki: for i, hahmo in enumerate(muumilaakso):.
  1. Description
  2. Esimerkit
Pythonissa for on toinen silmukkatyyppi. Sen käyttötarkoitus on tietorakenteiden läpikäyminen – iterointi. Sitä käytetään erityisesti listojen kanssa. Yleisesti ottaen for-silmukkaa käytetään silloin, kun pystytään ennalta määrittämään montako kierrosta silmukkaa tulee pyörittää. Tietorakenteiden läpikäynnin lisäksi näihin lukeutuu tietyn toistomäärän tekeminen (esimerkiksi kymmenen toistoa). Silmukan määrittelyrivi on muotoa: for alkio in lista:, jossa alkion paikalle tulee silmukkamuuttujan nimi ja listan paikalla ilmoitetaan läpikäytävä tietorakenne.
  1. Description
  2. Examples
In Python modules are "activated" by import statements. In normal use (e.g. import math) the statement makes a new namespace accessible through the module name. Functions from the imported module can be accessed through its name. It's also possible to directly import some specific names from a module with a from-import statement: from math import ceil. Modules can also be renamed on import: import math as m.
  1. Description
  2. Esimerkit
Silmukoista while pohjautuu toistoon ehdon tarkastelun kautta - silmukan sisällä olevaa koodilohkoa suoritetaan niin kauan kuin silmukalle annettu ehto on tosi. Ehto määritetään samalla tavalla kuin ehtolauseissa, esim: while summa < 21. While-silmukat soveltuvat parhaiten sellaisiin tilanteisiin, joissa ei voida etukäteen selvittää montako toistoa tarvitaan - erityisesti syötteiden kysyminen käyttäjältä on tällainen tilanne.
  1. Description
  2. Esimerkit
Pythonissa with on hieman muista poikkeava avainsana, sillä se ei ole varsinaisesti ohjausrakenne tai uuden asian määrittely. Tällä kurssilla sitä käytetään pääasiassa tiedostojen avaamisessa, tyyliin with open("aasi.txt") as tiedosto:. Tiedoston luku- tai kirjoitusoperaatiot suoritetaan with-lauseen alla. Kun with-lohko päättyy, Python huolehtii automaattisesti with-lauseessa avattujen tiedostojen yms. sulkemisesta.