Pythonissa tuplen tai listan elementit voidaan laajentaa ja määrittää useisiin muuttujiin. Tätä kutsutaan sekvenssin purkamiseksi tai pakkaamattomaksi osoittamiseksi.
Tässä kuvataan seuraavat yksityiskohdat.
- Tuplien ja listojen purkamisen perusteet
- Sisäkkäiset tuplat, pakkaamattomat luettelot
- Pakkauksen purkaminen alikirjaimilla:
_
- Pakkauksen purkaminen tähdillä:
*
Seuraavassa artikkelissa on tietoja tähtien käytöstä tuplien, luetteloiden ja sanakirjojen laajentamiseen ja siirtämiseen funktioiden argumentteina.
Tuplien ja listojen purkamisen perusteet
Kun muuttujat kirjoitetaan vasemmalle puolelle pilkulla erotettuna, jokaiselle muuttujalle annetaan oikealla puolella olevan tuplan tai luettelon elementti. Se on sama sekä tuplille että listoille (seuraavat esimerkit on kirjoitettu tuplina).
t = (0, 1, 2)
a, b, c = t
print(a)
print(b)
print(c)
# 0
# 1
# 2
l = [0, 1, 2]
a, b, c = l
print(a)
print(b)
print(c)
# 0
# 1
# 2
Huomaa, että koska tuplat voivat jättää pyöreät sulut pois, tätä voidaan käyttää useiden arvojen antamiseen useille muuttujille yhdellä rivillä seuraavasti.
a, b = 0, 1
print(a)
print(b)
# 0
# 1
Jos muuttujien lukumäärä ei vastaa elementtien lukumäärää, tapahtuu virhe.
# a, b = t
# ValueError: too many values to unpack (expected 2)
# a, b, c, d = t
# ValueError: not enough values to unpack (expected 4, got 3)
Jos muuttujien määrä on pienempi kuin elementtien määrä, jäljelle jäävät elementit voidaan määrittää luettelona lisäämällä tähti muuttujan nimeen (katso alla).
Sisäkkäiset tuplat, pakkaamattomat luettelot
Sisäkkäiset tuplat ja luettelot voidaan myös purkaa. Jos haluat purkaa myös sisällön, sulje muuttuja johonkin seuraavista tavoista.
()
[]
t = (0, 1, (2, 3, 4))
a, b, c = t
print(a)
print(b)
print(c)
# 0
# 1
# (2, 3, 4)
print(type(c))
# <class 'tuple'>
a, b, (c, d, e) = t
print(a)
print(b)
print(c)
print(d)
print(e)
# 0
# 1
# 2
# 3
# 4
Purettu pakkauksesta _underscore_.
Pythonissa, ei vain pakkaamattomia, arvot, joita ei tarvita, on perinteisesti osoitettu alaviivalla (underscore) _. Mitään erityistä kieliopillista merkitystä ei ole; ne yksinkertaisesti osoitetaan muuttujaan nimeltä _.
t = (0, 1, 2)
a, b, _ = t
print(a)
print(b)
print(_)
# 0
# 1
# 2
Pakkauksen purkaminen tähdillä
Jos muuttujien määrä on pienempi kuin elementtien määrä, muuttujan nimessä oleva tähti aiheuttaa sen, että elementit määritetään yhdessä luettelona.
Tämä syntaksi on otettu käyttöön Python 3:sta lähtien, eikä sitä ole saatavilla Python 2:ssa.
Elementit osoitetaan alusta ja lopusta alkaen muuttujille, joissa ei ole tähtiä, ja loput elementit osoitetaan luettelona muuttujille, joissa on tähtiä.
t = (0, 1, 2, 3, 4)
a, b, *c = t
print(a)
print(b)
print(c)
# 0
# 1
# [2, 3, 4]
print(type(c))
# <class 'list'>
a, *b, c = t
print(a)
print(b)
print(c)
# 0
# [1, 2, 3]
# 4
*a, b, c = t
print(a)
print(b)
print(c)
# [0, 1, 2]
# 3
# 4
Jos esimerkiksi haluat määrittää muuttujaan vain tuplen tai listan kaksi ensimmäistä elementtiä, voit käyttää edellä mainittua alaviivaa niiden osien kohdalla, joita ei tarvita.
a, b, *_ = t
print(a)
print(b)
print(_)
# 0
# 1
# [2, 3, 4]
Sama voidaan kirjoittaa myös seuraavasti
a, b = t[0], t[1]
print(a)
print(b)
# 0
# 1
Vain yksi tähti voidaan liittää. Jos tähdellä merkittyjä muuttujia on useita, syntyy SyntaxError-virhe, koska ei ole mahdollista määrittää, kuinka monta elementtiä kullekin muuttujalle on määritetty.
# *a, b, *c = t
# SyntaxError: two starred expressions in assignment
Huomaa, että jopa yksittäinen elementti, joka on annettu tähdellä merkitylle muuttujalle, annetaan listana.
t = (0, 1, 2)
a, b, *c = t
print(a)
print(b)
print(c)
# 0
# 1
# [2]
print(type(c))
# <class 'list'>
Jos ylimääräisiä elementtejä ei ole, annetaan tyhjä lista.
a, b, c, *d = t
print(a)
print(b)
print(c)
print(d)
# 0
# 1
# 2
# []