Python 3 per a no programadors/Llistes

Variables amb més d'un valor[modifica]

Ja heu vist variables ordinàries que contenen un únic valor. Tanmateix hi ha altres tipus de variables que poden contenir més d'un valor. El tipus més senzill és l'anomenat "llista".

A continuació es mostra un exemple d'utilització d'una llista:

quin = int(input("Quin mes (1-12)? "))
mesos = ['Gener', 'Febrer', 'Març', 'Abril', 'Maig', 'Juny', 'Juliol',
         'Agost', 'Setembre', 'Octubre', 'Novembre', 'Desembre']

if 1 <= quin <= 12:
    print("El mes és", mesos[quin - 1])

Aplicant l'exemple s'obté:

Quin mes (1-12)? 3
El mes és Març

En aquest exemple la variable mesos és una llista. mesos és defineix a les línies mesos = ['Gener', 'Febrer', 'Març', 'Abril', 'Maig', 'Juny', 'Juliol', i 'Agost', 'Setembre', 'Octubre', 'Novembre', 'Desembre'] (noteu que el caràcter \ també es pot fer servir per separar una línia llarga, però no és necessari en aquest casperquè Python és prou intel·ligent per reconèixer que tot el que és entre parèntesis forma un conjunt). Els caràcters [ i ] inicien i acaben la llista, que té els elements separats amb comes (,). La llista es fa servir a mesos[quin - 1]. Una llista consisteix en diversos elements que s'enumenen començant per 0. En altres paraules, si voleu obtenir "Gener" haureu de fer servir mesos[0]. Donant un número a una llista s'obté el valor que hi ha emmagatzemat en aquest lloc.

La declaració if 1 <= quin <= 12: només serà certa si quin és un valor que val entre 1 i 12 (inclosos ambdós).

Les llistes es poden entendtre com a sèries de caixes. Cada caixa té un valor diferent. Per exemple, les caixes creades per llistaexemple = ['vida', 42, 'univers', 6, 'i', 7] tindran aquesta aparença:

número caixa 0 1 2 3 4 5
llistaexemple "vida" 42 "univers" 6 "i" 7

Cada caixa està referenciada pel seu número de manera que la declaració llistaexemple[0] tindrà com a valor 'vida', llistaexemple[1] valdrà 42 i així anar fent fins a llistaexemple[5] que valdrà 7.

Més característiques de les llistes[modifica]

El següent exemple és només per mostrar moltes altres coses que poden fer les llistes (aniria bé que fessiu proves amb les llistes fins a tenir-ne prou coneixement).

Alguns exemples:

llista_exemple = ["vida", 42, "univers", 6, "i", 7]
print("llista_exemple = ",llista_exemple)
llista_exemple.append("tot")
print("després d\'afegir 'tot' a llista_exemple, ara és:")
print(llista_exemple)
print("len(llista_exemple) =", len(llista_exemple))
print("llista_exemple.index(42) =", llista_exemple.index(42))
print("llista_exemple[1] =", llista_exemple[1])

# A continuació fem un bucle de la llista
c = 0
while c < len(llista_exemple):
    print("llista_exemple[", c, "] =", llista_exemple[c])
    c = c + 1

del llista_exemple[2]
print("Després de suprimir 'univers' de la llista, ara tenim:")
print(llista_exemple)
if "vida" in llista_exemple:
    print("s\'ha trobat 'vida' a llista_exemple")
else:
    print("no s\'ha trobat 'vida' a llista_exemple")

if "ameba" in llista_exemple:
    print("s\'ha trobat 'ameba' a llista_exemple")

if "ameba" not in llista_exemple:
    print("no s\'ha trobat 'ameba' a llista_exemple")

altra_llista = [42,7,0,123]
altra_llista.sort()
print("El resultat d'ordenar altra_llista és", altra_llista)

El que s'obté és:

llista_exemple =  ['vida', 42, 'univers', 6, 'i', 7]
després d'afegir 'tot' a llista_exemple, ara és:
['vida', 42, 'univers', 6, 'i', 7, 'tot']
len(llista_exemple) = 7
llista_exemple.index(42) = 1
llista_exemple[1] = 42
llista_exemple[ 0 ] = vida
llista_exemple[ 1 ] = 42
llista_exemple[ 2 ] = univers
llista_exemple[ 3 ] = 6
llista_exemple[ 4 ] = i
llista_exemple[ 5 ] = 7
llista_exemple[ 6 ] = tot
Després de suprimir 'univers' de la llista, ara tenim:
['vida', 42, 6, 'i', 7, 'tot']
s'ha trobat 'vida' a llista_exemple
no s'ha trobat 'ameba' a llista_exemple
El resultat d'ordenar altra_llista és [0, 7, 42, 123]

Aquest exemple fa servir gran quantitat de noves funcions. Podeu veure que es pot imprimir (print) tota una llista. També es fa servir la funció append per afegir un element nou al final de la llista. len retorna quans elements hi ha a la llista. Els índexs vàlids (com a números que es poden fer servir dins de []) per una llista, des de 0 fins a len - 1. La funció index dóna com a resultat la primera posició on es troba situat un element dins una llista. Vegeu com llista_exemple.index(42) dóna com a resultat 1, i com en executar llista_exemple[1] dóna com a resultat 42. La línia # A continuació fem un bucle de la llista és simplement una explicació o recordatori pel programador (també anomenada comentari). Python ignora qualsevol línia que comenci amb #.

A continuació, les línies:

c = 0
while c < len(llista_exemple):
    print('llista_exemple[', c, '] =', llista_exemple[c])
    c = c + 1

creen una variable c, que comença amb un valor de 0 que es va incrementant fins que assoleix el darrer index de la llista. Mentres, la declaració print va donant com a resultat cada element de la llista. L'ordre del es fa servir per suprimir un element d'una llista. Les línies següents fan servir l'operador in per comprovar si un element és o no inclòs a una llista. La funció sort ordena la llista. Aquesta funció és útil si és necessari tenir la llista ordenada del número més petit al més gran, o alfabèticament. Vegeu que això reordena la llista. Resumint, es poden fer servir les següents operacions amb una llista:

exemple explicació
llista_exemple[2] accedeix a l'element que té l'índex 2
llista_exemple[2] = 3 estableix que l'element que té l'índex 2 passi a tenir el valor de 3
del llista_exemple[2] suprimeix l'element que té l'índex 2
len(llista_exemple) retorna el nombre d'elements de la llista llista_exemple
"valor" in llista_exemple és True si "valor" és un element de llista_exemple
"valor" not in llista_exemple és True si "valor" no és un element de llista_exemple
altra_llista.sort() ordena altra_llista. S'ha de tenir en compte que, perquè es pugui ordenar, la llista ha de tenir només números o només paraules.
llista_exemple.index("valor") retorna l'índex de la primera posició en la que hi ha l'element "valor"
llista_exemple.append("valor") afegeix l'element "valor" al final de la llista
llista_exemple.remove("valor") suprimeix la primera aparició de "valor" de llista_exemple (passa el mateix amb del llista_exemple[llista_exemple.index("valor")])


L'exemple següent també fa servir aquestes característiques:

element_menu = 0
llista_noms = []
while element_menu != 9:
    print("--------------------")
    print("1. Visualitza la llista")
    print("2. Afegeix un nom a la llista")
    print("3. Suprimeix un nom de la llista")
    print("4. Canvia un element a la llista")
    print("9. Surt")
    element_menu = int(input("Seleccioneu un element del menú: "))
    if element_menu == 1:
        actual = 0
        if len(llista_noms) > 0:
            while actual < len(llista_noms):
                print(actual, ".", llista_noms[actual])
                actual = actual + 1
        else:
            print("La llista és buida")
    elif element_menu == 2:
        nom = input("Escriviu un nom a afegir: ")
        llista_noms.append(nom)
    elif element_menu == 3:
        suprimeix_nom = input("Quin nom voleu suprimir: ")
        if suprimeix_nom in llista_noms:
            # llista_noms.remove(suprimeix_nom) anirà bé
            numero_element = llista_noms.index(suprimeix_nom)
            del llista_noms[numero_element]
            # El codi anterior només suprimeix la primera aparició del nom.
            # El codi que hi ha a continuació d'en Gerald suprimeix totes les aparicions.
            # while suprimeix_nom in llista_noms:
            #       numero_element = llista_noms.index(suprimeix_nom)
            #       del llista_noms[numero_element]
        else:
            print("No s'ha trobat", suprimeix_nom)
    elif element_menu == 4:
        nom_antic = input("Quin nom voleu canviar: ")
        if nom_antic in llista_noms:
            numero_element = llista_noms.index(nom_antic)
            nom_nou = input("Quin és el nom nou: ")
            llista_noms[numero_element] = nom_nou
        else:
            print("No s'ha trobat", nom_antic)

print("A reveure")

A continuació observem alguns resultats del funcionament:

--------------------
1. Visualitza la llista
2. Afegeix un nom a la llista
3. Suprimeix un nom de la llista
4. Canvia un element a la llista
9. Surt

Seleccioneu un element del menú: 2
Escriviu un nom a afegir: Jack

Seleccioneu un element del menú: 2
Escriviu un nom a afegir: Jill

Seleccioneu un element del menú: 1
0 . Jack
1 . Jill

Seleccioneu un element del menú: 3
Quin nom voleu suprimir: Jack

Seleccioneu un element del menú: 4
Quin nom voleu canviar: Jill
Quin és el nom nou: Jill Peters

Seleccioneu un element del menú: 1
0 . Jill Peters

Seleccioneu un element del menú: 9
A reveure

Aquest és un programa llarg. Fem un cop d'ull al codi. La línia llista_noms = [] estableix la variable llista_noms com una llista sense cap element. La següent línia important és while element_menu != 9:. Aquesta línia inicia un bucle que posa en funcionament el sistema de menú del programa. Les línies següents mostren el menú i decideixen quina part del programa s'executa.

La secció

actual = 0
if len(llista_noms) > 0:
    while actual < len(llista_noms):
        print(actual, ".", llista_noms[actual])
        actual = actual + 1
else:
    print("La llista és buida")

es mou per la llista i va escrivint cada nom. len(llista_noms) retorna el nombre d'elements que hi ha a la llista. Si len retorna 0, aleshores la llista és buida.

Mirant algunes línies més endavant, apareix la declaració llista_noms.append(nom). Es fa servir la funció append per afegir un element al final de la llista.

Saltant dues línies més avall, ens fixem en la següent secció del codi:

numero_element = llista_noms.index(suprimeix_nom)
del llista_noms[numero_element]

Aquí es fa servir la funció index per trobar el valor de l'índex que es farà servir posteriorment per suprimir un element. del llista_noms[numero_element] es fa servir per suprimir un element de la llista.

La secció següent

nom_antic = input("Quin nom voleu canviar: ")
if nom_antic in llista_noms:
    numero_element = llista_noms.index(nom_antic)
    nom_nou = input("Quin és el nom nou: ")
    llista_noms[numero_element] = nom_nou
else:
   print("No s'ha trobat", nom_antic)

fa servir index per trobar el numero_element i aleshores posa el contingut de nom_nou on hi havia el nom_antic.

Exemples[modifica]

test.py

## Aquest programa executa una prova de coneixement

# Primer, obté les preguntes de la prova
# Posteriorment això es modificarà per fer servir file io.
def obte_preguntes():
    # Fixeu-vos que les dades s'emmagatzemen com una llista de llistes
    return [["Quin és el color del cel en un dia clar? ", "blau"],
            ["Quina és la resposta a la vida, a l'univers i per qualsevol cosa? ", "42"],
            ["Quina és la paraula de tres lletres per un caçador de rates? ", "gat"]]

# Això farà una sola pregunta
# agafa una sola pregunta
# retorna True si la resposta escrita és la correcta, en cas contrari retorna False

def comprova_pregunta(pregunta_i_resposta):
    # extreu la pregunta i la resposta de la llista
    pregunta = pregunta_i_resposta[0]
    resposta = pregunta_i_resposta[1]
    # fa la pregunta a l'usuari
    resposta_donada = input(pregunta)
    # compara la resposta de l'usuari amb la resposta del programa
    if resposta == resposta_donada:
        print("Correcte")
        return True
    else:
        print("Incorrecte, la resposta correcta és:", resposta)
        return False

# Això anirà fent totes les preguntes
def executa_prova(preguntes):
    if len(preguntes) == 0:
        print("No hi ha preguntes.")
        # el return surt del programa
        return
    index = 0
    correcte = 0
    while index < len(preguntes):
        # Comprova la pregunta
        if comprova_pregunta(preguntes[index]):
            correcte = correcte + 1
        # va a la pregunta següent
        index = index + 1
    # vegeu l'ordre dels càlculs, primer multiplicai després divideix
    print("Heu encertat el", correcte * 100 / len(preguntes),\
           "% de les", len(preguntes), "preguntes")

# ara fem les preguntes

executa_prova(obte_preguntes())

Els valors True i False valen 1 i 0, respectivament. Es fan servir en comprovacions, condicions dels bucles etc. Aprendreu una mica més sobre això més endavant (capítol Expressions Booleanes).

Exemple d'aplicació del programa:

Quin és el color del cel en un dia clar?verd
Incorrecte, la resposta correcta és:: blau
Quina és la resposta a la vida, a l'univers i per qualsevol cosa?42
Correcte
Quina és la paraula de tres lletres per un caçador de rates?gat
Correcte
Heu encertat el 66 % de les 3 preguntes

Exercicis[modifica]

Ampliar el programa test.py de manera que tingui un menú que doni l'opció de fer la prova, veure la llista de preguntes i respostes i l'opció de sortir. També afegeix una nova qüestió per preguntar, "Quin soroll fa una màquina avançada?" amb la resposta de "ping".