
import fractions


def fraccio_reciproca(f):
    return fractions.Fraction(1, f)


def fraccio_mixta(f):
    p_entera = int(f)
    return p_entera, f - p_entera


def millor_aprox(x, lfracs):
    millor = lfracs[0]
    dif = abs(x - millor)
    for f in lfracs[1:]:
        diff = abs(x - f)
        if diff < dif:
            millor = f
            dif = diff
    return millor


# Solució alterativa: utilitzant min() amb una "funció clau"
def millor_aprox2(x, lfracs):

    def fdif(a):
        return abs(a-x)

    return min(lfracs, key=fdif)

def fr_positives_1(itfrac):
    it1 = filter(lambda f: f > 0, itfrac)
    return map(fraccio_mixta, it1)

def fr_positives_2(itfrac):
    for fr in itfrac:
        if fr > 0:
            yield fraccio_mixta(fr)

# fr_positives = fr_positives_1
fr_positives = fr_positives_2

def seq_fraccions_1(den):
    return map(lambda num: fractions.Fraction(num, den), range(1, den))

def seq_fraccions_2(den):
    for num in range(1, den):
        yield fractions.Fraction(num, den)

# seq_fraccions = seq_fraccions_1
seq_fraccions = seq_fraccions_2
