Capítol 11

Combinar tot el que s'ha après

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 és aprendre com tots els 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.
  • Una iteració principal que recorre totes les preguntes en ordre aleatori.
  • Un comptador d'encerts i un missatge final, segons la puntuació obtinguda.

Peça 1: les dades

Comencem desant 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.

Fixa't en la intrucció del codi anterior: 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.
Dit d'una altra manera, ja no cal escriure preguntes[i][0] i preguntes[i][1].

Peça 2: la funció pregunta()

Tot el procediment de "fer una pregunta", el posem en una funció independent. Així el nostre programa principal queda net, i la funció es pot provar sola:

La funció pregunta rep dos paràmetres: el text de la pregunta i la resposta correcta.
La funció fa servir input() per obtenir la resposta de l'usuari; posteriorment, la normalitza fent servir .lower().strip() (és a dir, converteix a minúscules i treu espais dels extrems). Finalment, retorna True o False, segons l'usuari l'hagi encertat, i així el codi que l'ha cridat sabrà si s'ha encertat.

Pots provar, a continuació, la funció pregunta amb una resposta incorrecta i veuràs el missatge que retorna:

Peça 3: la iteració principal i el comptador

Ara combinem la llista de preguntes amb la funció. Una iteració principal for recorre totes les preguntes, crida la funció per a cadascuna i compta els encerts:

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. Atenció, modifica directament la llista, és a dir, no retorna una còpia nova.
Cal afegir una funcionalitat a Python per tal que pugui fer operacions aleatòries. Per aquest motiu, comencem amb la instrucció import random.

Pots executar el codi anterior diverses vegades i observaràs com canvia l'ordre de les preguntes.

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 agrupem totes les peces i en l'ordre adequat.
Pots executa el programa i pots respondre directament les preguntes al simulador:

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 preguntes amb 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 si resposta 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: math per a funcions matemàtiques, datetime per a dates i hores, os per al sistema de fitxers, i molts més. La comunitat ha creat llocs com requests (per a internet) o pygame (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 random dona 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.

Vols mes diversio?

Ara que has completat el curs, hi ha un capitol extra esperant-te: programar el classic joc de taula 4 en ratlla amb Python. Tu contra la maquina!

Jugar a 4 en ratlla →