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".
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".
## Aquest programa fa una prova de coneixement
preguntes = [["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"],
["Quin soroll fa una màquina avançada?", "ping"]]
# 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")
#Mostra la llista de preguntes i respostes
def mostrapreguntes():
q = 0
while q < len(preguntes):
a = 0
print("Q:" , preguntes[q][a])
a = 1
print("A:" , preguntes[q][a])
q = q + 1
# ara definim la funció del menú
def menu():
print("-----------------")
print("Menú:")
print("1 - Fes la prova")
print("2 - Visualitza la llista de preguntes i respostes")
print("3 - Visualitza el menú")
print("5 - Surt")
print("-----------------")
opcio = "3"
while opcio != "5":
if opcio == "1":
executa_prova(preguntes)
elif opcio == "2":
mostrapreguntes()
elif opcio == "3":
menu()
print()
opcio = input("Trieu l'opció del menú que voleu: ")