Vous êtes ici : Accueil / Forums & ML / Forums Python / Forum général Python / Affichage d'une liste "curieux" !

Affichage d'une liste "curieux" !

Remonter à Forum général Python
  • Affichage d'une liste "curieux" !

    Envoyé par Papy_Octet le 9 Août 2011 à 07:08
    Bonjour,
    je commence à jouer avec Python (2.7).

    J'ai un petit bout de code tout simple :

    while i<5:     
    mesures.append(float(raw_input("Introduisez une valeur decimale. ")))
    i += 1

    mesures.sort()


    J'introduis les 5 valeurs décimales demandées.
    Mais quand je demande d'afficher le contenu de la liste, voici ce que j'obtiens comme contenu :


    valeur dans mesures: [1.1000000000000001, 2.2000000000000002, 3.2999999999999998, 15.02]


    Ma question : d'où provient cette différence d'affichage (de contenu) dans la liste alors que j'ai introduit les différentes valeurs de la même manière :

    Introduisez une valeur decimale. 15.02
    Introduisez une valeur decimale. 1.1
    Introduisez une valeur decimale. 2.2
    Introduisez une valeur decimale. 3.3


    Je fais un autre essai :

    Introduisez une valeur decimale. 1.2
    Introduisez une valeur decimale. 1.25
    Introduisez une valeur decimale. 0.01
    Introduisez une valeur decimale. 5.999999


    L'affichage du contenu de la liste est :
    valeur dans mesures: [0.01, 1.2, 1.25, 5.9999989999999999]


    Un autre teste :

    Introduisez une valeur decimale. 12.25
    Introduisez une valeur decimale. 7.01
    Introduisez une valeur decimale. 2.65
    Introduisez une valeur decimale. 3

    valeur dans mesures: [2.6499999999999999, 3.0, 7.0099999999999998, 12.25]


    ou encore :

    Introduisez une valeur decimale. 12
    Introduisez une valeur decimale. 2.1
    Introduisez une valeur decimale. 3.2
    Introduisez une valeur decimale. 1.025

    valeur dans mesures: [1.0249999999999999, 2.1000000000000001, 3.2000000000000002, 12.0]


    1. Je ne comprends pas le pourquoi de ces différents affichages pour des valeurs de même type.

    2. Autre question : comment puis-je limiter le nombre de décimales prises en compte dans la liste. Dans une application, je n'ai besoin que des 6 premières décimales. Donc je ne voudrais accepter dans la liste que des nombres à 7 décimales.

    Merci.
    • Re: Affichage d'une liste "curieux" !

      Envoyé par e-vidence le 9 Août 2011 à 10:30
      Bonjour,

      Pour ce qui est de l'affichage qui diffère, c'est tout simplement que certains nombres décimaux ne sont pas des nombres finis en binaire. L'ordinateur ne pouvant que fonctionner en base deux, il vous donne une approximation la plus proche possible du nombre que vous avez entré.

      C'est ainsi avec tous les langages.

      Le nombre sera automatiquement utilisé au mieux dans les opérations mathématiques donc normalement, sauf gros besoin de précision que j'ignore, c'est le formatage qui pose le plus de problème à votre niveau.

      Vous pouvez donc très probablement utiliser vos mesures telles quelles, et formater la sortie ensuite.

      Python fournit des opérateurs de formatage:

      Pour les floats, l'opérateur est %(.precision)f, la précision étant optionnelle:


      >>> "%.3f" % 15.03443
      '15.034'
      >>> "%f" % 15.03443
      '15.034430'
      >>> print u"Dernière mesure : %.1f" % 15.03443
      Dernière mesure : 15.0


      Bien entendu, n'effectuez cette conversion qu'à l'affichage car Python est fortement typé et il n'accepte pas d'opérations entre les floats et les strings.

      Une dernière chose: vous utilisez Python avec la syntaxe d'un autre langage. Ca va marcher, mais ce n'est pas ainsi que vous en profiterez le plus.

      On utilise par exemple très rarement le boucle "while" en Python, la boucle "for" est préférée 99% du temps:


      while i<5:
      mesures.append(float(raw_input("Introduisez une valeur decimale. ")))
      i += 1


      Devient ainsi:


      for i in xrange(i):
      mesures.append(float(raw_input("Introduisez une valeur decimale. ")))


      Cela nous économise un compteur.

      De plus, comme créer des listes est une opération très courante, Python met à disposition du programmeur le concept de "liste en intention". Cela permet de créer une liste, de la remplir (et optionnellement de la filtrer) en une instruction:


      mesures = [ float(raw_input("Introduisez une valeur decimale. ")) for i in xrange(5)]


      Cela nous économise une initialisation de variable préalable.

      Le code Python final aurait donc plutôt ce genre de syntax:


      question = "Introduisez une valeur decimale. "
      mesures = sorted((float(raw_input(question)) for i in xrange(5)))


      Le code est ainsi quasiment déclaratif: "je créé une question" puis "je récupère le résultat de la question 5 fois".

      Notez que si vous voulez boucler plus d'une fois sur mesures, il vous faudra faire:

      mesures = list(mesures)

      Inutile bien sur de s'inquiéter sur la question. Sachez juste que c'est ce qui se fait et petit à petit, découvrez cela à votre rythme.
    • Re: Affichage d'une liste "curieux" !

      Envoyé par Papy_Octet le 9 Août 2011 à 14:18
      Bonjour e-vidence,

      Un tout tout grand merci pour ces explications détaillées.
      Je vais appliquer ces remarques immédiatement puis les classer dans le disque dur de ma pauvre mémoire de soixantenaire.

      Merci.
      A+
    • Re: Affichage d'une liste "curieux" !

      Envoyé par kassoulet le 12 Août 2011 à 10:36
      A noter aussi que python contient un module permettant de gérer des nombres a virgules "parfait". Voir : http://docs.python.org/library/decimal.html
Rendu par Ploneboard