Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 4.0
Wiki Markup
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ä.

...



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

	
>>> L
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>> 
{code}
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.

...


{code
}
>>> L = [i * i for i in range(1, 11)]
>>> L
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>>
{code}
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.

...



{code
}
>>> [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]
>>>
{code}
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.

...



{code
}
>>> {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}
>>> 
{code}
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.

...



{code
}
>>> [i * i for i in range(1, 10) if i % 2]
[1, 9, 25, 49, 81]
>>>
{code}