Posant-ho tot junt
Hora de combinar tot el que has après en un programa de veritat.
El projecte: un quiz de cultura general
Aquest capítol és diferent dels anteriors. En lloc d'un concepte nou, construirem un programa complet pas a pas: un quiz de cultura general. El programa farà preguntes en ordre aleatori, comprovarà les respostes i mostrarà una nota final.
Per a cada peça que afegim faràs servir coses que ja coneixes: llistes, funcions, bucles for, condicionals, input() i el mòdul random. L'objectiu no és aprendre res nou, sinó veure com tots aquests elements treballen junts en un programa real.
Aquí tens un resum del que construirem:
- Una llista de parelles pregunta–resposta com a dades del programa.
- Una funció
pregunta()que fa una pregunta i diu si l'usuari ha encertat. - Un bucle principal que recorre totes les preguntes en ordre aleatori.
- Un comptador d'encerts i un missatge final segons la puntuació.
Peça 1: les dades
Comencem guardant les preguntes i les respostes. Cada element de la llista és una altra llista de dos elements: el text de la pregunta i la resposta correcta en minúscules (per simplificar la comparació més endavant):
Fixa't en el bucle for p, r in preguntes:. Com que cada element és una llista de dos valors, Python desempaqueta automàticament el primer valor a p i el segon a r. Ja no cal escriure preguntes[i][0] i preguntes[i][1].
Peça 2: la funció pregunta()
En lloc d'escriure la lògica de "fer una pregunta" dins del bucle, la posem en una funció. Així el bucle principal queda net i la funció es pot provar sola:
La funció rep el text de la pregunta i la resposta correcta com a paràmetres. Crida input(), normalitza la resposta de l'usuari amb .lower().strip() (converteix a minúscules i treu espais dels extrems) i retorna True o False perquè el codi que la crida sàpiga si s'ha encertat.
Prova-la amb una resposta incorrecta per veure el missatge d'error:
Peça 3: el bucle principal i el comptador
Ara combinem la llista de preguntes amb la funció. Un bucle for recorre totes les preguntes, crida la funció per a cadascuna i compta els encerts:
El if pregunta(p, r): és una forma concisa d'aprofitar que la funció retorna True o False directament. Si retorna True, la condició és certa i sumem un encert.
Peça 4: l'ordre aleatori
Un quiz que sempre fa les preguntes en el mateix ordre és fàcil de memoritzar. El mòdul random de Python té la funció shuffle(), que barreja una llista al seu lloc (la modifica directament, no retorna una còpia nova):
Executa aquest codi diverses vegades i observa com canvia l'ordre de les preguntes. Ara ja pots afegir import random i random.shuffle(preguntes) al programa principal, just abans del bucle.
Peça 5: el missatge final
L'última peça és mostrar un missatge diferent segons la puntuació obtinguda. Fem servir if / elif / else per cobrir els diferents rangs de resultats:
Fixa't que en lloc de valors fixos com 4 o 3, fem servir total * 0.8 i total * 0.6. Així el missatge s'adapta automàticament si canvies el nombre de preguntes del quiz.
El programa complet
Ara juntem totes les peces. Executa el quiz i respon les preguntes directament al simulador:
Nota tècnica: al curs el programa rep les respostes predefinides (totes correctes)
perquè Pyodide no suporta input interactiu. Si executes aquest mateix codi fora del
navegador, podràs respondre-hi manualment. Prova de canviar alguna resposta del
data-stdin per veure el missatge d'«Incorrecte».
Repte obert
Tens el programa complet. Aquí tens algunes idees per ampliar-lo. No hi ha validació automàtica: és la teva oportunitat d'experimentar lliurement.
- Afegeix preguntes. Allarga la llista
preguntesamb 5 o 10 preguntes noves sobre els temes que més t'agradin. - Permet tornar a jugar. Al final del quiz, pregunta a l'usuari si vol repetir i, si diu que sí, torna a barrejar i a fer les preguntes (pista: fes servir
while). - Mostra la puntuació en percentatge. En lloc de "3 de 5", mostra "60%". Pots calcular-ho amb
encerts / total * 100. - Accepta sinònims. Modifica la funció
pregunta()perquè admeti diverses respostes correctes (pista: guarda les respostes en una llista i comprova siresposta in respostes_correctes).
I ara què?
Has completat el curs de PyCat. Saps escriure programes que llegeixen dades, prenen decisions, repeteixen accions, treballen amb textos i llistes, i organitzen el codi en funcions. Però Python té molt més a oferir.
Aquí tens alguns temes que podries explorar a continuació:
- Diccionaris (
dict). Una estructura com les llistes, però on cada element s'identifica per una clau en lloc d'un índex numèric. Perfectes per guardar dades relacionades, com ara{"nom": "Anna", "edat": 14}. - Fitxers. Llegir i escriure dades en fitxers de text amb
open(), perquè el programa recordi informació entre execucions. - Mòduls i llibreries. Python té milers de mòduls que pots importar:
mathper a funcions matemàtiques,datetimeper a dates i hores,osper al sistema de fitxers, i molts més. La comunitat ha creat llocs comrequests(per a internet) opygame(per a jocs). - Classes i objectes. Una manera d'agrupar dades i funcions relacionades en un sol concepte, que és la base de la programació orientada a objectes.
Per continuar aprenent, els millors recursos en català i castellà per a principiants són python.org/doc (documentació oficial, en anglès) i les nombroses plataformes d'exercicis en línia com Codewars o Exercism. La millor manera d'aprendre és escriure molts programes petits sobre coses que t'interessin.
Bona sort, i segueix programant!
Resum del curs
- Un programa es construeix combinant peces petites: dades en llistes, lògica en funcions, repetició en bucles i decisions en condicionals.
import randomdona accés a funcions d'aleatorietat;random.shuffle(llista)barreja una llista al seu lloc.for p, r in llista_de_parelles:desempaqueta cada element en dues variables d'un sol cop, fent el codi més net.- Separar les dades (la llista de preguntes), la lògica (la funció
pregunta()) i el flux (el bucle principal) facilita llegir, provar i modificar el programa. - Els programes reals no usen cap concepte "màgic": combinen les mateixes instruccions bàsiques que has après en aquest curs.