You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 2 Next »

Joskus ohjelmassa saatetaan tarvitaan kokoelmaa, joka sisältää alkioita jonkin yksinkertaisen kaavan mukaan (esim. kokonaislukujen neliöitä). Tällöin voitaisiin alustaa muuttuja tyhjällä kokoelmalla ja käyttää toistorakennetta, joka syöttää kokoelmaan arvoja. Tässä esimerkki, jossa tehdään lista kokonaislukujen 1 - 10 neliöistä.

>>> L = []
>>> for i in range(1, 11):
	L.append(i * i)

	
>>> L
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>> 

Tähän on kumminkin Pythonissa kätevämpi keino list comprehension - jolle en löytänyt suomenkielistä nimeä. Se on lauseke, jossa on ikäänkuin for toistorakenne kokoelman sisässä; aluksi listan sisään tulee jokin ilmaisu, jossa käytetään jotain muuttujaa ja sen jälkeen for toistorakenteen ylimmäisin osa ilman kaksoispistettä. Näin synnytetään for toistorakenteen mukaiset arvot, käytetään niitä halutussa lausekkeessa ja sijoitetaan listan alkoiksi.

Tässä aiempi esimerkki käyttäen list comprehensonia.

>>> L = [i * i for i in range(1, 11)]
>>> L
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>>

List comprehesnsionissa voi myös käyttää useita for rakenteita peräkkäin, jolloin ne toimivat ikäänkuin sisäkkäiset for toistorakenteet. Tässä tehdään kaikki kertotaulun luvuilla 1 - 5 tulokset.

>>> [i * j for i in range(1, 5) for j in range(1, 5)]
[1, 2, 3, 4, 2, 4, 6, 8, 3, 6, 9, 12, 4, 8, 12, 16]
>>>

Nimestään huolimatta tämä tekniikka toimii myös joukoille ja hakurakenteille. Niissä täytyy vain käyttää vastaavasti aalto sulkuja ja hakurakenteessa erottaa avain ja arvo kaksoispisteellä. Tässä niistä esimerkki.

>>> {i ** 3  for i in range(1, 10)}
{64, 1, 8, 512, 343, 216, 729, 27, 125}
>>>
>>> D = {i : i ** 3  for i in range(1, 10)}
>>> D[3]
27
>>> D[7]
343
>>> D
{1: 1, 2: 8, 3: 27, 4: 64, 5: 125, 6: 216, 7: 343, 8: 512, 9: 729}
>>> 

Tässä voi myös käyttää ehtoa avainsanan if avulla; jos avainsanan if jälkeinen totuusarvo on tosi, alkio lisätään kokoelmaan, muuten ei. Ehtoja voi olla peräkkäin useampikin. Tässä taas tehdään kokonaislukujen neliöistä, mutta valitaan vain parittomat luvut.

>>> [i * i for i in range(1, 10) if i % 2]
[1, 9, 25, 49, 81]
>>>
  • No labels
You must log in to comment.