Tema 9: Tuples

Objectius i argument

Aquest és un tema de transició que aporta poc coneixements nous però que treballa els conceptes de mutabilitat/inmutabilitat i les funcions de manera reiterada. Els nous conceptes se centren en les estructures anomenades tuples (que en el context de Python no s'han de confondre amb els registres) i amb les comprehensions, una eina molt potent per treballar amb llistes.

Resultats d'aprenentatge

Després d'assolir aquest tema una estudianta ha de:

  • Saber què és el tipus de dades "tuple" i quines són les seves característiques.
  • Ser conscient de les similituds entre els tipus string, llista i tuple, que en termes de Python es conteixen com "sequences" (que no s'han de confondre amb les seqüències dels esquemes de tractament seqüencial).
  • Consolidar els conceptes de mutabilitat i inmutabilitat d'un objecte i ser capaç de gestionar les conseqüències pràctiques que se'n deriven.
  • Entendre el concepte i la sintaxi de les comprehensions i ser capaç d'usar-les per descriure de manera sintètica operacions sobre llistes.

Conceptes clau

Tupla (en el sentit Python). Operacions sobre tuples. Immutabilitat de les tuples. Assignació de tuples: extensió al cas de les funcions. Comprehensions.

Referència principal

  • How to Think Like a Computer Scientist: Learning with Python 2nd Edition: capítol 11 (excepte apartats 11.5 fins 11.8 i 11.10).

Referències complementàries

Trobareu exemples resolts i resum i característiques de tuples i list comprehensions en els següents enllaços:

Exercicis obligatoris de teoria

Recordeu que per resoldre els següents exercicis, totes les funcions han d'estar correctament documentades amb els doctests.

EOT 9.1

Dins d'un mateix mòdul, dissenyeu una funció que demani a l'usuari dades utilitzant com a sentinella la paraula "fi", aquestes dades es guardaran a una nova tupla. Afegiu un altre funció que elimini tots els elements imparells de la tupla, si aquests són números de més de dos xifres o que modifiqui, si són cadenes de caràcters, tots els caràcters passant aquests a majúscules. Finalment afegiu una funció que retornarà la llista que contindrà la tupla anteriorment modificada.

EOT 9.2

Dissenyeu una funció on donades una primera tupla de cadenes de caràcters on cadascuna d'elles representa el nom i cognom d'una persona i una llista on cada element d'aquesta conté el nom d'una persona com a primer element, el cognom com a segon element i la població on resideix com a tercer element, retorni una tupla on només hi hagi els noms de les persones de les quals tenim informació de la població on resideix.

EOT 9.3

Dissenyeu un nou mòdul de nom eines_sequencies.py que contingui les següents funcions, que també heu de dissenyar:

  • La funció afegeix_al_mig, on passant per paràmetre una seqüència (ja sigui una llista, cadena de caràcters o una tupla) i una dada (sigui del tipus que sigui), afegeix a la posició del mig de la seqüència la dada parametritzada. Aquesta funció ha de retornar la nova seqüència un cop modificada.
  • La funció afegeix_al_principi, on passant per paràmetre una seqüència (ja sigui una llista, cadena de caràcters o una tupla) i una dada (sigui del tipus que sigui), afegeix a la posició inicial de la seqüència la dada parametritzada. Aquesta funció ha de retornar la nova seqüència un cop modificada.
  • La funció afegeix_al_final, on passant per paràmetre una seqüència (ja sigui una llista, cadena de caràcters o una tupla) i una dada (sigui del tipus que sigui), inserta a la posició final de la seqüència la dada parametritzada. Aquesta funció ha de retornar la nova seqüència un cop modificada.
  • La funció eliminar, on passant per paràmetre una dada i una seqüència (ja sigui una llista, cadena de caràcters o una tupla), elimini totes les aparicions de la dada dins de la seqüència i retorni la nova seqüència modificada.
  • La funció ordenar, on passant per paràmetre una seqüència (ja sigui una llista, cadena de caràcters o una tupla) del mateix tipus de dades, retorni la nova seqüència però ordenada en sentit ascendent.

EOT 9.4

Utilitzant el format estructurat "list comprehension" (detallat al punt 11.9 de la referència principal), dissenyeu les següents funcions:

  • Una funció que passada una llista de enters retorni la mateixa però canviant els valors de les posicions parell per el seu cub.
  • Una funció que passada una llista de paraules, retorni la mateixa llista però només amb les paraules que comencin amb majúscula.
  • Una funció que passada tres llistes diferents de números enters, retorni els resultats de multiplicar tots els elements de totes les llistes entre si, sempre i quan el resultat d'aquestes multiplicacions siguin superiors a 20.

EOT 9.5

Escriviu el codi necessari per transformar les següents estructures en format "list comprehension" per blocs de codi sense aquest format (utilitzant seqüències de recorregut o de cerca com fins ara):

  • [name for name in files if name[0] != '.']
  • [x**3 for x in nums]
  • [x**2 for x in nums if x**2 !=4]
  • [(x,y) for x in nums for y in nums]
  • [llista1[i]*llista2[i] for i in range(len(llista1))]

EOT 9.6

Definiu una funció on donada una llista de números reals, retorni aquesta mateixa llista però canviant l'element de la posició 0 per l'element de la posició 1, l'element de la posició 2 per l'element de la posició 3,... Aquests canvis de valors s'han de realitzar en una sola línea de codi mitjançant els intercanvis de valor ràpid de les tuples.

Exercicis obligatoris de laboratori

Recordeu que per resoldre els següents exercicis, totes les funcions han d'estar correctament documentades amb els doctests.

EOL 9.1

Per aquest exercici de laboratori cal usar les "List Comprehensions" quan fem un recorregut de les tuples.

Un departament de la universitat vol guardar la informació dels grups que treballen en un projecte. Per cada grup cal guardar la informació sobre la nota del projecte i el titol del projecte. Per tal de fer aquesta pràctica ens cal un menú on el professor pugui entrar primer els diferents alumnes, afegir i borrar grups de projecte i finalment escriure la informació de cada projecte. El menú quedaria amb les opcions de :

  • Afegir alumne
  • Afegir grup de projecte - Aquí t'ha de demanar quins alumnes vols escollir i el titol del projecte
  • Llistar els grups de projecte
  • Posar nota al grup de projecte
  • Esborrar alumne - Cal estar alerta que esborrar un alumne pot modificar els grups de projecte, en cas de que un grup es quedi sense alumnes s'ha d'esborrar el grup
  • Calcular la mitjana de les notes dels grups de projecte

EOL 9.2

Afegiu a l'exercici anterior la opció de llegeir i escriure la informació en un fitxer. Ha d'apareixer una nova opció al menú que digui llegir les dades d'un fitxer i una altra opció que escrigui les dades en un fitxer. En tots dos casos cal indicar el nom del fitxer on ho guardarem.

Exercicis optatius

EOP 9.1

Dissenyeu un programa anomenat tracta_seq.py que, donats una sèrie de valors enters entrats per la línia de comandes, en generi una tupla, en calculi el màxim i el mínim (en una sola funció) i guardi aquestes tres dades en una llista. Finalment, el programa ha d'emmagatzemar en un fitxer anomenat fitxer_tupla.txt la llista creada.

EOP 9.2

Dissenyeu una funció que, donat el nom d'un fitxer, retorni una tupla formada pel nom del fitxer, la lletra que més vegades apareix en el fitxer i el nombre de vegades que hi apareix.

EOP 9.3

Dissenyeu una funció que, donat el nom d'un fitxer, retorni una tupla formada pel nom del fitxer, la frase més llarga del fitxer i la frase més curta.

EOP 9.4

Dissenyeu una funció que, donada una llista d'elements l i un enter n, retorni una tupla amb els elements de la llista l que ocupin posicions múltiples de n.

EOP 9.5

Donada la llista d'enters [1, 2, 3, 4], useu la comprehensió per tal de crear una nova llista que contingui, per cada element de la llista original, una tupla amb l'enter, la conversió a real de l'enter i la conversió a cadena de l'enter. Així, la llista resultant hauria de ser [(1, 1.0, "1"), (2, 2.0, "2"), (3, 3.0, "3"), (4, 4.0, "4")].

EOP 9.6

Donades les llistes numbers = [1, 2, 3, 4], paraules = ["hola", "adeu"], l = [["no", "nop"], ["si", "sip"]] què retorna la següent comprehensió?

[(n*elem)+value for n in numbers for elem in paraules for subl in l for value in subl if ("h" in elem and len(value)%2==0)]

Raoneu el resultat sense fer servir l'intèrpret de Python.