1. Canvi d’unitats

Un diccionari de canvi d’unitats és un diccionari en què les claus són noms d’unitats i el valor corresponent és el factor de conversió a la unitat de referència. Per exemple, al diccionari de canvi d’unitats següent, la unitat de referència són els centímetres cúbics.

{
  'cl': 10,     # 1 cl =   10 cm³
  'dl': 100,    # 1 dl =  100 cm³
  'l': 1000,    # 1  l = 1000 cm³
}

Volem facilitar la creació de diccionaris de canvi d’unitats quan les unitats a convertir són del Sistema Internacional d’Unitats (SI). Per això, partirem d’un diccionari de prefixos que contindrà alguns dels prefixos de l’SI. Una clau d’aquest diccionari serà un símbol del prefix i el valor associat la potència de 10 que li correspon. Per exemple, al diccionari de prefixos següent, la clau 'd' és el símbol del prefix deci i li correspon \(10^{-1}\), la clau 'c' és el símbol del prefix centi i li correspon \(10^{-2}\) i així successivament.


>>> prefixos = {
...   'da': 1e1,
...   'h': 1e2,
...   'k': 1e3,
...   'd': 1e-1,
...   'c': 1e-2,
...   'm': 1e-3,
... }

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

unitats.calcula_canvi_unitats(uni_origen, potencia, factor, prefixos)

uni_origen és una unitat de l’SI sense prefix.

potencia a què cal elevar els prefixos. Normalment, serà 1, però pot ser 2 en el cas d’unitats de superfície (m²) o 3 en cas de volum (m³).

factor de conversió entre uni_origen i la unitat de referència (que és implícita).

prefixos és un diccionari de prefixos.

Retorna el diccionari de canvi d’unitats que conté els factors de conversió tant de uni_origen com dels prefixos del diccionari de prefixos cap a la unitat de referència. Cal enganxar els símbols dels prefixos a uni_origen.

Per exemple:


La unitat de referència és cm³

>>> cu = calcula_canvi_unitats('m³', 3, 1e6, prefixos)
>>> ru = {
...   'm³': 1e6,
...   'dam³': 1e9,
...   'hm³': 1e12,
...   'km³': 1e15,
...   'dm³': 1e3,
...   'cm³': 1,
...   'mm³': 1e-3,
... }

ru == cu amb tolerància eps en cada unitat

>>> if any(map(lambda x: abs(cu[x] - ru[x]) >= eps, ru)): print(cu)

Trobaràs més tests al fitxer test-calcula_canvi_unitats.txt.