Fractions en Python

Je me réapprends les bases "tout seul" (avec Google, en gros). Il existe certainement une fonctionnalité Python qui, quand on lui donne $2+\dfrac{1}{3}$, renvoie $\dfrac{7}{3}$ et pas $2.3333333333$. "Python fractions" sur Google c'est hyper vague, je ne trouve pas ce que je veux.
Je n'ai besoin que de "entier+fraction" mais en gros une fonction qui prend en entrée $\dfrac{a}{b}$ et $\dfrac{c}{d}$ sous forme de fractions et renvoie $\dfrac{ad+bc}{bd}$ sous forme de fraction, c'est ça que je cherche.
EDIT : J'ai trouvé un truc qui marche mais j'ai une autre question sur les fractions.
Merci :)


Réponses

  • Bonjour Homo Topi.

    Dans la documentation :
    https://docs.python.org/3/c-api/index.html

    Dans la zone de saisie de texte pour recherche ("Quick search"), taper : "fraction" puis appuyer sur la touche Entrée du clavier.

    Résultats :
    • fractions (Python module, in fractions — Rational numbers)
    • fractions.Fraction (Python class, in fractions — Rational numbers)
    • fractions — Rational numbers

      fractions — Rational numbers Source code: Lib/fractions.py The fractions module provides support for rational number arithmetic. A Fraction instance can be constructed from a pair of integers, from another rational number,...

    • What’s New in Python 2.6

      ...numerator and denominator properties, and can be converted to floats. Python 2.6 adds a simple rational-number class, Fraction, in the fractions module. (It’s called Fraction instead of Rational to avoid a name clash with numbers.Rationa...

    Etc. etc.

    Parfois, la documentation officielle est plus efficace que des exemples via Google.





  • Homo Topi
    Modifié (November 2022)
    Deuxième question : J'ai une liste dont les éléments sont de la forme "Fraction(a,b)" avec  donc la fonction "fraction".
    Quand je demande à Python de "print(Fraction(2,3))" il m'affiche "2/3".
    Quand je lui demande de "print(L)" avec L ma liste de fractions, il m'affiche "[Fraction(a,b),Fraction(c,d),...]" au lieu de "[a/b,c/d,...]". C'est juste un souci de confort de lecture du résultat, mais j'aimerais vraiment avoir une liste facile à lire.
  • @Sato merci, de mémoire souvent c'est moi qui suis trop débile pour comprendre la doc' officielle  :D
    J'ai découpé mon problème en deux et résolu la partie facile.
  • Salut @Homo Topi,
    Essaie print(list(map(str, L))) pour afficher ta liste de fractions.
  • En effet, ça printe ['a/b' , 'c/d' ,...], c'est clairement mieux, merci ! Ce qui serait parfait, ça serait la même chose mais juste sans les guillemets de chaine de caractères autour de chaque fraction, mais je ne sais pas si c'est possible de faire ça.
    Je bidouillais un truc qui printe chaque fraction dans la fonction qui les génère, ça les affiche en colonne sans guillemets mais j'ai un "None" qui apparait et qui m'embête parce que je n'ai aucune idée d'où il sort.
    Les joies d'être un blaireau en programmation :D
  • Pourquoi pas print(*L,sep=', ') ? :-)

  • nicolas.patrois
    Modifié (November 2022)
    Ou sinon :
    
    >>> from fractions import Fraction
    >>> l=[Fraction(1,2),Fraction(3,4)]
    >>> print(*l)
    1/2 3/4
    Dans le même genre, tu as le module decimal.

    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Homo Topi
    Modifié (November 2022)
    Ah ben tiens, vous avez eu la même idée en même temps ! Je préfère la version avec virgules mais les deux font exactement ce que je cherchais, merci !
    Je ne connaissais pas ce truc de l'astérisque.
  • nicolas.patrois
    Modifié (November 2022)
    Il sert à déplier un itérable, par exemple quand une fonction demande plusieurs éléments en entrée mais que tu as à la place un itérable.
    Par exemple :
    >>> def pgcd(a,b):
    ...   a,b=abs(a),abs(b)
    ...   a,b=max(a,b),min(a,b)
    ...   while b:
    ...     a,b=b,a%b
    ...   return a
    ... 
    >>> pgcd(24,40)
    8
    >>> l=(24,40)
    >>> pgcd(l)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: pgcd() missing 1 required positional argument: 'b'
    >>> pgcd(*l)
    8
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Homo Topi
    Modifié (November 2022)
    A retenir !
    Pour ceux qui veulent voir ce sur quoi je planchais, voici un petit code :
    import math
    from fractions import Fraction
    
    def coefficients(x,n): #liste des n premiers coefficients entiers dans le développement de x en fraction continuée    
    i=1   
    L=[math.floor(x)]    
    a=x
    while i <= n:        
            a=1/(a-math.floor(a))
            L.append(math.floor(a))
           i=i+1
    return L
    
    #print(coefficients(math.pi,5))
    
    def fractions(x,n): #liste des n premières fractions continuées qui approximent x
        L=coefficients(x,n)
        i=len(L)-1
        while i >= 1:
            j=i
            a=L[j]
            while j >= 1:
                a=Fraction(L[j-1],1)+Fraction(1,a)
                j=j-1
            L[i]=a
            i=i-1
        return L
    
    print(*fractions(math.pi,10),sep=', ')
    Je me doute bien qu'il existe des fonctions standard très optimisées pour faire les fractions continuées en Python. Mais je m'en fiche, ça c'est mon algo à moi (there are many like it, but this one is mine !), qui m'a servi à apprendre des trucs. Et il fonctionne comme je voulais !

    EDIT : je ne sais pas pourquoi le code s'affiche mal, @AD au secours c'est bon

  • Clique sur le bouton </> puis enlève les <br> disgracieux.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • nicolas.patrois
    Modifié (November 2022)
    Le truc de l’étoile permet aussi de copier une liste sans copier l’adresse, par exemple :
    >>> l=[20,40]
    >>> L=l
    >>> L[0]=30
    >>> l
    [30, 40]
    >>> l=[*L]
    >>> l[0]=20
    >>> l
    [20, 40]
    >>> L
    [30, 40]
    C’est plut court que list(L).
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Voilà j'ai à peu près nettoyé mon code ci-dessus, à part 1-2 indentations.
  • Rescassol
    Modifié (November 2022)
    Bonsoir,

    Message inutile. 
    Quand je l'ai écrit, il n'y avait que la question initiale, puis plusieurs messages sont apparus, rendant ma réponse inutile.
    C'est bizarre.

    Cordialement,
    Rescassol

Connectez-vous ou Inscrivez-vous pour répondre.