2.30. Lyhennetyt muodostimet¶
Lyhennetty muodostin rakentaa uuden listan, joukon, sanakirjan tai generaattorin olemassa olevasta iteroitavasta yhdellä lausekkeella. Se korvaa yleisen mallin, jossa aloitetaan tyhjästä säiliöstä ja lisätään alkioita silmukassa.
2.30.1. Listamuodostimet¶
squares = [x * x for x in range(5)]
print(squares)
Tuloste:
[0, 1, 4, 9, 16]
Sama silmukka auki kirjoitettuna:
squares = []
for x in range(5):
squares.append(x * x)
Muodostinmuoto on yksi lauseke, joka rakentaa listan paikallaan. Ei ole squares = []-riviä eikä .append-kutsua – tulos on muodostimen arvo.
Alkupään lauseke tuottaa jokaisen alkion; for-lause nimeää silmukkamuuttujan; valinnainen if suodattaa alkioita pois.¶
2.30.2. Suodatus if-lauseella¶
Valinnainen if-lause säilyttää vain alkiot, jotka täsmäävät:
evens = [x for x in range(10) if x % 2 == 0]
print(evens)
Tuloste:
[0, 2, 4, 6, 8]
Suodatin suoritetaan ennen alkupään lauseketta – x % 2 == 0 tarkistetaan ensin; vain täsmäävät arvot päätyvät muuttujaan x tulostetta varten.
2.30.3. Sanakirja- ja joukkomuodostimet¶
Sama muoto toimii sanakirja- ja joukkoliteraalien kanssa.
Sanakirjamuodostimessa on key: value -pari ennen for-osaa:
squares = {x: x * x for x in range(5)}
print(squares)
Tuloste:
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
Joukkomuodostin käyttää aaltosulkeita ja yhtä lauseketta:
unique_lengths = {len(w) for w in ["a", "bb", "c", "bb"]}
print(unique_lengths)
Tuloste:
{1, 2}
2.30.4. Generaattorilausekkeet¶
Tavalliset sulkeet tuottavat generaattorilausekkeen listan sijaan. Arvot lasketaan yksi kerrallaan tarpeen mukaan:
total = sum(x * x for x in range(1000))
Miljoonan alkion listaa ei koskaan rakenneta. Arvot virtaavat yksitellen sum()-funktioon, joka laskee ne yhteen ja hylkää kunkin sitä mukaa.
Generaattorilausekkeet ovat oikea valinta, kun syötät arvoja pelkistävään funktioon (sum(), max(), any(), all()) tai mihin tahansa muuhun iteraattoria kuluttavaan koodiin – ne säästävät muistin, jonka vastaava lista olisi käyttänyt.
2.30.5. Milloin lyhennettyä muodostinta ei kannata käyttää¶
Muodostimet ovat tiiviitä mutta eivät aina selkeämpiä. Tartu tavalliseen for-silmukkaan kun:
Runko tarvitsee enemmän kuin yhden lauseen (muodostimeen mahtuu täsmälleen yksi lauseke).
Rungolla on sivuvaikutuksia (tulostus, tiedostoon kirjoittaminen) – muodostimet ovat kokoelman rakentamista varten, eivät toimintojen suorittamista varten.
Suodattimessa tai muunnoksessa on niin monta osaa, ettei muodostin enää luetu vasemmalta oikealle.