LISÄÄ RAKENTEITA

Lista

Lista on tietorakenne, johon voidaan tallentaa useita elementtejä. Elementti on listan osa, ja jokaiselle elementille voidaan nimetä sijainti kokonaislukuna. Pythonissa listan ensimmäisen elementin sijainti on 0. Listan elementit voidaan käydä läpi, ja listalla on koko. Ehkäpä muistat listan Scratchista. Muistutuksen vuoksi seuraavassa kuvassa Scratchin lista-niminen lista.

Scratch lista

Pythonissa tyhjä lista alustetaan koodilla

lista = []

Pythonin vastineet Scratchin listaoperaatioille

Useimmille Scratchin listaoperaatioille on olemassa suorat vastineet Pythonissa. Seuraavassa taulukossa listataan ne joille suora vastine löytyy.
Scratch Python
Scratch append lista.append("hei")
Scratch list contains "hei" in lista
Scratch get lista[0] Huomioi että Pythonissa listan ensimmäinen elementti on 0. elementti!
Scratch remove del(lista[0])
Scratch len len(lista)
Scratch replace lista[0] = "hei"

Lista-nimisen listan voi myös tulostaa:

print(lista)

Lista voi sisältää erilaisia elementtejä, seuraava koodi alustaa listan elementeillä "elementti" ja 9000 ja tulostaa sen.

lista = [

Paritehtävä 1: Listan läpikäynti

Paritehtävä tarkoittaa sitä, että teet tehtävän parin kanssa. Jos et löydä vierestäsi paria niin kerro siis ohjaajalle että tarvitset parin. Pari tekee toisen version saman asian toteuttavasta ohjelmasta Scratchilla ja toisen version Pythonilla. Lopuksi pari testaa että ohjelma toimii ja näyttää sen ohjaajalle.

Tehtävänanto: Lukekaa allaoleva teksti ja kopioikaa sekä Python- että Scratch-esimerkit listan läpikäynnistä. Testatkaa ohjelmia. Huomatkaa että Scratch-esimerkissä pitää ensin luoda lista-niminen lista elementeillä "elementti" ja 9000, sekä luoda monesko-muuttuja.

Lista voidaan käydä läpi for-silmukalla. For-silmukkaa voidaan käyttää useisiin tarkoituksiin ja listan läpikäynti on vain yksi niistä. Seuraava koodi alustaa listan, ja tulostaa jokaisen sen elementin järjestyksessä ensimmäisestä viimeiseen.

lista = [
Tulostus näyttää siis tältä:

elementti 
 9000
Seuraavassa listan läpikäynti Scratchilla. Huomaamme että Scratchissa listan läpikäynti on huomattavasti monimutkaisempaa.

scratch listan läpikäynti

Esimerkki: Onko käyttäjän antama luku listassa

Seuraava esimerkki kertoo käyttäjälle, onko häneltä kysytty luku listassa. löytyyListasta -totuusarvomuuttujaa käytetään apuna, jotta voidaan lopussa kertoa jos lukua ei löytynyt listasta. Kokeile esimerkkiä.

lista = [5, 4, 1, 8]
luku = int(input("Anna luku josta haluat tietää onko se listassa: "))
löytyyListasta = False

for muuttuja in lista:
  if muuttuja == luku:
      print("Luku on listassa!")
      löytyyListasta = True

if löytyyListasta == False:
  print("Ei löytynyt listasta.")

Paritehtävä 2: Listan lukujen summa

Tehtävänäsi on määritellä lista

lista = [1, 2, 3, 4, 5]

ja laskea ohjelmallisesti lukujen summa. Sinun täytyy siis alussa alustaa muuttuja summa nollaksi. Vinkki: samaan muuttujaan voi sijoittaa uudelleen luvun, esimerkiksi tyyliin

summa = summa + muuttuja

Tulosta lopussa listan lukujen summa, vastauksen pitäisi olla 15.

Paritehtävä 3: Listan pienin luku

Tehtävänäsi on määritellä lista

lista = [5, 4, 3, 1, 7]

ja etsiä ohjelmallisesti listan pienin alkio sekä tulostaa se.
Vinkki: Määrittele ohjelman alkuun muuttuja pienin , jolle annat alkuarvoksi listan ensimmäisen alkion seuraavalla koodilla:

pienin = lista[0] . Tämän jälkeen listaa läpikäydessä vertaa listan vuorossaolevaa alkiota apumuuttujaan, ja muuta apumuuttujan arvoa jos se on tarpeen.

Paritehtävä 4: Listan suurin luku

Tehtävänäsi on määritellä sama lista kuin edellisessäkin tehtävässä,

lista = [5, 4, 3, 1, 7]

ja etsiä ohjelmallisesti listan suurin alkio sekä tulostaa se.

Kommentit

Tästä lähtien esimerkkikoodeissa on kommentteja . Kommentin tunnistaa alkavaksi #-merkistä, ja kommenttimerkin jälkeen samalla rivillä olevaa tekstiä ei suoriteta ohjelmassa. Kommentit ovat hyödyllisiä ohjelman rakenteen selittämisessä lukijalle. Testaa seuraavaa riviä:

print("Hei maailma") #Tämä on kommentti eikä sitä suoriteta

Toiston alkeet

Huomaamme usein ohjelmakoodissamme tilanteita missä sama asia toistuu usein. Esimerkiksi, jos haluamme tulostaa luvut yhdestä kymmeneen, on yksi -- kohta onneksi turha -- ratkaisu kirjoittaa jokainen käsky erikseen.

print(1)
print(2)
print(3)
print(4)
print(5)
print(6)
print(7)
print(8)
print(9)
print(10)

Entä jos haluaisimme tulostaa kaikki luvut yhdestä sataan, tai vaikka luvut yhdestä käyttäjän antamaan syötteeseen asti? Tällaisissa tapauksissa käytetään toistorakenteita. Toistorakenteiden avulla voidaan toteuttaa toistuvia käskyjä. Toistorakenteet näyttävät Pythonissa erilaisilta kuin Scratchissa, mutta perusidea on molemmissa sama, asioiden toistaminen.

while

Komento while toistaa lohkonsa koodia niin kauan kun määritelty ehto on voimassa. Komennon while ehto-osa toimii kuten if:ssä.

Kuten kaikki lohkot, while:n lohko alkaa kaksoispisteellä. Lohkossa oleva koodi on sisennettyä, ja lohko päättyy sisennyksen loppumiseen.

Seuraavassa esimerkissä tulostetaan luvut 1,2,..,9,10. Kun luku-muuttuja saa arvokseen yli 10, while-ehto ei ole enää voimassa ja toistaminen lopetetaan.

luku = 1;

while luku < 11:
  print(luku)
  luku = luku + 1
1
2
3
4
5
6
7
8
9
10

Lue ylläoleva "niin pitkään kuin luku on pienempi kuin 11, tulosta luku ja kasvata lukua yhdellä".

Ylläolevassa koodissa ehto-lausessa olevaa muuttujaa luku kasvatettiin jokaisella kierroksella yhdellä. Päivitysehto voi olla mikä tahansa.

luku = 1024

while luku >= 1:
  print(luku)
  luku /= 2; # luku = luku / 2

while True

Seuraava koodinpätkä tulostaa ikuisesti merkkijonon "Ikuisesti". While True siis toistaa sisältöään niin pitkään kunnes se saa käskyn lopettaa, jonka opimme myöhemmin.

while True: 
   print('Ikuisesti')
while True vastaa suoraan Scratchin ikuisesti -toistolausetta.

while True: 
   print('Ikuisesti')

Paritehtävä 5: Käyttäjältä luvun kysyminen ikuisesti

Tee ohjelma, joka kysyy käyttäjältä ikuisesti lukuja ja ylläpitää niiden summaa muuttujassa summa .

Silmukan suorituksen lopetus: break

While True -toistolauseen suoritus loppuu komennolla

break

Komennon voi sijoittaa esimerkiksi if-ehdon sisälle silmukan sisälle, esimerkiksi seuraavaan tyyliin.

if luku == 0:
    break

Paritehtävä 6: Lukujen kysymisen lopettaminen käyttäjän pyyntöön

Paranna edellistä ohjelmaasi siten, että lukujen kysyminen lopetetaan kun käyttäjä syöttää luvun 0. Tällöin käyttäjälle tulostetaan myös summa. Tarvitset tähän if-ehtolausetta sekä break-komentoa.

Ongelma: Käyttäjä syöttää tekstiä kun kysytään lukua

Kokeile syöttää edellisen tehtävän ohjelmaasi tekstiä luvun sijaan. Mitä tapahtuu? Korjaus ongelmaan on kysyä käyttäjältä merkkijonoa , ja muuntaa se sen jälkeen luvuksi, jos se on luku. Seuraava koodi kysyy käyttäjältä syötettä merkkijonona. syöte.isnumeric() tarkistaa, onko syöte mahdollista muuttaa luvuksi. isnumeric() -käsky palauttaa totuusarvona tiedon, onko muuttuja jolle sitä kutsuttiin, mahdollista muuttaa luvuksi vai ei. Jos syöte on luku, int(syöte) muuntaa syötteen luvuksi.

syöte = input("Anna syöte: ")
if syöte.isnumeric():
   syöte = int(syöte)
print(syöte)


int(muuttuja) vs str(muuttuja)

int(muuttuja) muuttaa muuttujan luvuksi, kun taas str(muuttuja) muuttaa muuttujan merkkijonoksi. Str-kutsu on usein tarpeellinen, kun halutaan tulostaa luku ja merkkijono samaan aikaan. Tällöin luku pitää muuttaa tulostuksessa merkkijonoksi str-kutsulla. Esimerkiksi seuraava koodi tulostaa luvun ja merkkijonon samalle riville.

muuttuja = 9000
print("Muuttujan muuttuja arvo on: " + str(muuttuja))

Tehtävä 7: Lopetuskäskyksi merkkijono

Muuta ylläolevaa koodia apuna käyttäen tehtävän 3 ohjelmasi hyväksymään lopetussyötteenä sekä 0 että merkkijono "lopeta".

Tehtävä 8 : Sadasta yhteen

Tee ohjelma, joka tulostaa kokonaisluvut väliltä 100–1.

Ohjelman tulostus on seuraava:

100
99
98
(välissä paljon rivejä)
3
2
1

Tehtävä 9: Parilliset luvut

Tee ohjelma, joka tulostaa parilliset kokonaisluvut väliltä 2–100.

2
4
6
(välissä paljon rivejä)
96
98
100

Tehtävä 10: Lukuun asti

Kirjoita ohjelma, joka tulostaa kokonaisluvut 1:stä käyttäjän antamaan lukuun asti.

Mihin asti? 3
1
2
3
Mihin asti? 5
1
2
3
4
5

For

Tämän osion alussa kävimme for-silmukalla kaikki listan elementit läpi. For on kuitenkin paljon monikäyttöisempi rakenne, ja nyt tutustumme sen muihin käyttötapoihin.

Seuraavassa esimerkissä aloitamme laskemisen 0:sta ja toistamme while-toistolausekkeen lohkoa, kunnes olemme lukeneet käyttäjältä kolme lukua, jolloin ehto ei ole enää voimassa.

print("Anna kolme lukua ja kerron niiden summan")

luettu = 0
summa = 0

while luettu < 3:
    luku = int(input("Anna luku: "))

    summa = summa + luku   # tai summa += luku;
    luettu += 1            # tai luettu = luettu + 1;


print("Lukujen summa on: " + str(summa))

Tiedämme usein jo etukäteen kuinka monta kertaa tahdomme suorittaa toistolausekkeen lohkon. Edellisessä esimerkissä suoritimme lohkon 3 kertaa. Tämän voi ilmaista myös käyttämällä for-toistolausetta seuraavalla tavalla.

print("Anna kolme lukua ja kerron niiden summan")

summa = 0

for i in range(3): # i in range(3) tarkoittaa käydään luvut 0, 1, 2 yksitellen läpi
    luku = int(input("Anna luku: "))
    summa = summa + luku   # tai summa += luku;

print("Lukujen summa on: " + str(summa))

Komento range antaa kaikki luvut nollan ja komennolle range parametrina annetun luvun välillä. Esimerkiksi komento range(10) antaisi luvut 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.

Tässä ei kannata säikähtää yksikirjaimista muuttujaa i. Sen käytöllä on tietojenkäsittelyssä ja ohjelmoinnissa pitkät perinteet.

for-lauseke käy yksitellen range-komennolla saadut luvut läpi. Jokainen luku on vuorollaan muuttujassa i. Muuttujan i arvon voi tulostaa aivan kuten kaikkien muidenkin muuttujien arvon. Esimerkiksi lukujen 1, 2, ... , 10 tulostaminen käy seuraavasti for-lausekkeen avulla.

for i in range(10): # i in range(10) käy läpi luvut 0, 1, ..., 9
  print(str(i + 1))
1
2
3
4
5
6
7
8
9
10

Komennolle range voi myös kertoa luvun josta aloitetaan. Ylläolevan tulostuksen saa aikaan myös seuraavasti:

for i in range(1, 11): # i in range(1, 11) käy läpi luvut 1, 2, ..., 10
  print(i) # huomaa että pelkkää lukua ei tarvitse muuttaa tekstityyppiseksi tulostettaessa

Käytännössä for on while-lauseen pelkistetympi muoto. Komennolle range voi asettaa myös kolmannen arvon, joka kertoo askeleen koosta. Esimerkiksi komento range(1, 10, 3) käy läpi luvut 1, 4, 7 (luku 10 ei tule mukaan koska toiseksi arvoksi -- eli ylärajaksi -- on asetettu 10).

print "Tulostetaan joka kolmas luku.";

for i in range(1, 10, 3):
  print(i)
Tulostetaan joka kolmas luku.
1
4
7

Merkkijonojen liittäminen yhteen

Perusasiat -osiossa "Syötteen kysyminen käyttäjältä" -kohdassa kokeiltiin jo tavallaan vahingossa kahden merkkijonon liittämistä yhteen. Se tapahtuu siis + -operaattorilla. Esimerkiksi seuraava ohjelma tulostaisi merkkijonon aaaaa

aat = ""
for i in range(5):
    aat += "a"
print(aat)

Tehtävä 11: Tähtien tulostus

Tee ohjelma, joka tulostaa käyttäjän antaman määrän tähtiä.

Kuinka monta tähteä? 5
*****
Kuinka monta tähteä? 8
********

Tehtävä 12: Suorakulmion tulostus

Tee ohjelma, joka tulostaa suorakulmion, jonka leveyden ja korkeuden käyttäjä antaa.

Vihje: Tee kaksi sisäkkäistä silmukkaa.

Anna leveys: 4
Anna korkeus: 3
****
****
****
Anna leveys: 10
Anna korkeus: 5
**********
**********
**********
**********
**********

Tehtävä 13: Tyylikäs tulostus

Tee ohjelma, joka tulostaa listassa olevat luvut tyylikkäästi. Lukujen väliin tulee pilkku ja välilyönti. Viimeisen luvun jälkeen ei kuitenkaan tule pilkkua.

Lista määritellään koodin alussa seuraavasti:

luvut = [5, 1, 3, 4, 2];

Ohjelman tulostus on seuraava:

5, 1, 3, 4, 2