1. Reconstruir una sèrie de temperatures (5 punts)

Avís

Per resoldre aquest exercici no es poden fer servir llistes, tuples, diccionaris ni cap altra estructura de dades per desar tots els elements d’un iterador.

Disposem d’una sèrie temporal T de temperatures reals amb un decimal, mesurades al llarg del temps. La sèrie pot contenir valors perduts, que es representen amb el símbol '*'. En aquesta sèrie mai apareixeran dos o més '*' consecutius.

Volem reconstruir la sèrie generant una nova sèrie T” on tots els valors perduts hagin estat substituïts segons les regles següents:

  • Si un '*' es troba entre dues temperatures conegudes a i b, s’ha de substituir per dues temperatures reals obtingudes mitjançant interpolació lineal uniforme:

    \[u = a + \frac{b-a}{3}, \qquad v = a + \frac{2(b-a)}{3}\]

    Els valors obtinguts s’han d’arrodonir a un decimal.

  • Si un '*' apareix al principi de la sèrie, s’ha de substituir per una repetició del segon element.

  • Si un '*' apareix al final de la sèrie, s’ha de substituir per una repetició del penúltim element.

Dissenya la funció següent i desa-la al mòdul temperatures (fitxer temperatures.py):

temperatures.reconstrueix(it)
Paràmetres:

it – iterador sobre una sèrie no buida T de temperatures reals amb un decimal i el símbol '*'

Retorna:

iterador sobre la sèrie T” amb els valors perduts reconstruïts

Per exemple,


>>> it = iter([10.4, '*', 19.6, '*', 25.6])
>>> it2 = reconstrueix(it)
>>> next(it2)
10.4
>>> next(it2)
13.5
>>> next(it2)
16.5
>>> for x in it2:
...    print(x, end=',')
19.6,21.6,23.6,25.6,

>>> for x in reconstrueix(iter(['*', 5.8, '*', 2.2])):
...    print(x, end=',')
5.8,5.8,4.6,3.4,2.2,

Disposes d’un joc de proves més complet al fitxer tests-temperatures.txt.