CHEM-A2600 - Kemiantekniikan ohjelmointikurssi, Luento-opetus, 1.11.2021-10.12.2021
Kurssiasetusten perusteella kurssi on päättynyt 10.12.2021 Etsi kursseja: CHEM-A2600
Python-oppimateriaali (CHEM-A2600)
Listat
Yhtä tietotyyppiä sisältävät listat
Alla on esimerkkejä yksinkertaisista listoista (list), joissa on pelkästään yhden tyyppisiä arvoja:
# Kokonaislukuja sisältävä lista, viisi alkiota kokonaisluvut = [5, 6, 7, 8, 9] # Liukulukuja sisältävä lista, kolme alkiota liukuluvut = [0.3, 0.33333, 355.555] # Merkkijonoja sisältävä lista, neljä alkiota merkkijonot = ["Kupari", "Hopea", "Kulta", "Roentgenium"] # Tyhjä lista (pelkät hakasulkeet) vakuumi = []
Listan pituus
Listan pituuden voi selvittää len-funktiolla:
jalokaasut = ["He", "Ne", "Ar", "Kr", "Xe", "Rn"] print(f"Jalokaasut: {jalokaasut}") print(f"Jalokaasujen määrä: {len(jalokaasut)}")
tulostaa
Jalokaasut: ['He', 'Ne', 'Ar', 'Kr', 'Xe', 'Rn'] Jalokaasujen määrä: 6
Huomaa, että kun Python tulostaa merkkijonoja sisältävän listan, se käyttää yksinkertaisia lainausmerkkejä ('He'). Tämä on aivan sama kuin "He". Alla olevissa esimerkeissä käytetään listaa määritellessä yksinkertaisia lainausmerkkejä.
Listojen indeksointi
Listan alkioilla on indeksi, jolla niihin voi viitata. Huom! Indeksointi alkaa nollasta.
jalokaasut = ['He', 'Ne', 'Ar', 'Kr', 'Xe', 'Rn'] # indeksi: 0 1 2 3 4 5 print(jalokaasut[0]) print(jalokaasut[3])
tulostaa:
He
Kr
Alkioihin voi viitata myös negatiivisella indeksillä. Tällöin viimeisen alkion indeksi on -1. Negatiivisen indeksoinnin etuja on mm. se, ettei tarvitse käyttää len-funktiota viimeisen alkion osoittamiseksi:
jalokaasut = ['He', 'Ne', 'Ar', 'Kr', 'Xe', 'Rn'] # neg. indeksi: -6 -5 -4 -3 -2 -1 print(jalokaasut[-1]) # Palauttaa viimeisen alkion print(jalokaasut[-2]) # Palauttaa toiseksi viimeisen alkion print(jalokaasut[len(jalokaasut) - 1]) # Toinen tapa palauttaa viimeinen alkio
tulostaa
Rn
Xe
Rn
Listojen siivuttaminen
Listasta voi valita useita alkoita kerralla, jolloin tulos on uusi lista. Tätä kutsutaan listan siivuttamiseksi (engl. slicing)
lista[alku:loppu] # indeksistä alku indeksiin loppu-1 lista[alku:] # indeksistä alku alkaen listan loppuun asti lista[:loppu] # listan alusta indeksiin loppu-1 asti lista[alku:loppu:askel] # indeksistä alku indeksiin loppu-1, käyttäen askelväliä askel lista[:] # Kopio listan kaikista alkioista
eli käytännön esimerkit:
jalokaasut = ['He', 'Ne', 'Ar', 'Kr', 'Xe', 'Rn'] # indeksi: 0 1 2 3 4 5 print(jalokaasut[2:4]) # uusi lista ['Ar', 'Kr'] print(jalokaasut[:3]) # uusi lista ['He', 'Ne', 'Ar'] print(jalokaasut[3:]) # uusi lista ['Kr', 'Xe', 'Rn'] print(jalokaasut[-2:]) # uusi lista ['Xe', 'Rn'], eli kaksi viimeistä alkiota print(jalokaasut[0:6:2]) # uusi lista ['He', 'Ar', 'Xe'] # Viimeisessä esimerkissä poimitaan siis joka toinen alkio käyttämällä askelta 2
Listan täyttäminen range-funktion avulla
for-silmukoiden yhteydessä tutustuimme range-funktioon, jolla voi luoda numerosarjoja. range-funktion avulla voi myös täyttää listoja:
parilliset = list(range(2, 11, 2)) kymmenet = list(range(10, 101, 10)) print(parilliset) print(kymmenet)
tulostaa
[2, 4, 6, 8, 10] [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
Useita tietotyyppejä sisältävät listat
Lista on erittäin monipuolinen tietorakenne ja yksi lista voi sisältää useampia tietotyyppejä:
yhdiste = ['C', 2, 'H', 6, 'O', 1] # str ja int luvut = [0, 0.5, 1, 1.5, 2, 2.5, 3] # int ja float
Lista funktion parametrina
Listoja voi käyttää funktioiden parametreina aivan kuten aiemmin olemme käyttäneet esimerkiksi kokonaislukuja ja merkkijonoja. Määritellään funktio joka_toinen_alkio, joka saa parametrina listan ja palauttaa uuden listan, jossa on alkuperäisen listan joka toinen alkio:
# Funktion määrittely def joka_toinen_alkio(lista): # Siivuteteaan listasta joka toinen alkio uusi_lista = lista[0::2] return uusi_lista # Pääohjelma numerot = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] numerot2 = joka_toinen_alkio(numerot) print(numerot2)
tulostaa
[1, 3, 5, 7, 9]
Syventävää tietoa: listan "purkaminen" funktion parametreiksi
Joillekin funktiolle voi antaa listan "puretussa" muodossa (unpacking). Tällöin parametrina annettavan listan nimen eteen lisätään *-merkki:
jalokaasut = ['He', 'Ne', 'Ar', 'Kr', 'Xe', 'Rn'] print(jalokaasut) print(*jalokaasut) # Jälkimmäinen on sama asia kuin # print('He', 'Ne', 'Ar', 'Kr', 'Xe', 'Rn')
tulostaa
['He', 'Ne', 'Ar', 'Kr', 'Xe', 'Rn'] He Ne Ar Kr Xe Rn
Ensimmäisessä tapauksessa jalokaasut-lista välittyi print-funktiolle listana ja sellaisena se myös tulostui. Jälkimmäisessä tapauksessa lista "purettiin" kuudeksi erilliseksi parametriksi ja print-funktio tulosti nämä parametrit välilyönnillä erotettuina.
Syventävää tietoa: listan kopioiminen
Edellä mainittiin komento lista[:], jolla voi luoda kopion listasta. Käytännön esimerkki, jossa luodaan kopio listasta ja kopion muokkaaminen ei vaikuta alkuperäiseen listaan:
jalokaasut = ['He', 'Ne', 'Ar', 'Kr', 'Xe', 'Rn'] # indeksi: 0 1 2 3 4 5 jalokaasut_kopio = jalokaasut[:] print(jalokaasut_kopio[1]) # Tulostaa Ne jalokaasut_kopio[1] = "Neon" print(jalokaasut_kopio[1]) # Tulostaa Neon print(jalokaasut[1]) # Tulostaa Ne
Listojen kanssa yksinkertainen sijoitus jalokaasut2 = jalokaasut ei enää toimikaan samalla tavalla kuin yksinkertaisten tietotyyppien (kuten int) kanssa. Komennon jälkeen lista jalokaasut2 viittaa alkuperäiseen listaan jalokaasut ja listan jalokaasut2 muokkaaminen muokkaa myös alkuperäistä listaa jalokaasut:
jalokaasut_viittaus = jalokaasut print(jalokaasut_viittaus[1]) # Tulostaa Ne jalokaasut_viittaus[1] = "Neon" print(jalokaasut_viittaus[1]) # Tulostaa Neon print(jalokaasut[1]) # Tulostaa Neon
Tähän toimintatapaan on omat järkevät syynsä, kuten muistin säästäminen. Tämän kurssin puitteissa emme käsittele ylläolevan kaltaisia viittauksia tietorakenteisiin, vaan meille riittää listojen sisällön kopioiminen. Tämä asia on kuitenkin hyvä painaa mieleen, koska viitteiden käyttäminen vahingossa on helppo tapa ns. ampua itseään jalkaan.