IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Boucle for en décimal


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2007
    Messages : 40
    Points : 37
    Points
    37
    Par défaut Boucle for en décimal
    Bonjour,

    Je recherche à utiliser la fonction suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for X in range (0, 6.18, 0.01)
    mais bien sur le compilateur n'accepte pas car il ne s'agit pas d'entier.

    Existe-t-il une fonction permettant de ce déplacer dans les décimaux ??

    Merci pour vos réponses.

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 222
    Points : 290
    Points
    290
    Par défaut
    Bonjour,
    Tu peux utiliser arange du module numpy:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    import numpy as np
     
    for a in np.arange(0, 6.18, 0.01):
    	print a
    Si ça t'ennuies d'utiliser numpy tu peux créer ta propre fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    def drange(start, stop, step):
    	r = start
    	while r < stop-step :
    		 yield r
    		 r += step
     
     
    for a in drange(0, 6.18, 0.01):
    	print a

  3. #3
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Pas mal la fonction génératrice, mais il faut while r < stop : au lieu de while r < stop-step : , je pense.


    Soit dit en passant, il est impératif de bien mettre
    while r < stop : et non pas while r != stop :
    car, comme on l'a vu récemment
    http://www.developpez.net/forums/d888753/autres-langages/python-zope/general-python/probleme-0-a/#post5051278
    le cumul d'une petite différence d'approximation d'un nombre décimal fait que pour certaines valeurs de stop, c'est à dire certains nombres de tours d'itération, r et stop sont en réalité légèrement différents au moment où ils sont censés être égaux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def drange(start, stop, step):
        r = start
        while r != stop+5:
             yield r
             r += step
             if r>0.10:  break
    stop = 0.06  
    for a in drange(0, stop, 0.01):
     print 'a =',a,'  a-'+str(stop)+' =',a-stop
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    a = 0   a-0.06 = -0.06
    a = 0.01   a-0.06 = -0.05
    a = 0.02   a-0.06 = -0.04
    a = 0.03   a-0.06 = -0.03
    a = 0.04   a-0.06 = -0.02
    a = 0.05   a-0.06 = -0.01
    a = 0.06   a-0.06 = 6.93889390391e-18
    a = 0.07   a-0.06 = 0.01
    a = 0.08   a-0.06 = 0.02
    a = 0.09   a-0.06 = 0.03
    a = 0.1   a-0.06 = 0.04

    Mais pour stop=0.7, c'est bon:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    a = 0   a-0.07 = -0.07
    a = 0.01   a-0.07 = -0.06
    a = 0.02   a-0.07 = -0.05
    a = 0.03   a-0.07 = -0.04
    a = 0.04   a-0.07 = -0.03
    a = 0.05   a-0.07 = -0.02
    a = 0.06   a-0.07 = -0.01
    a = 0.07   a-0.07 = 0.0
    a = 0.08   a-0.07 = 0.01
    a = 0.09   a-0.07 = 0.02
    a = 0.1   a-0.07 = 0.03

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 046
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 046
    Points : 1 376
    Points
    1 376
    Par défaut
    et ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for X in range (0, 618, 1):
        X = X/100.
    ...non ?

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    OT
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    >>> Poster
    <class '__main__.Poster'>
    >>> eyquem = Poster()
    >>> heyquem = Poster()
    >>> id(eyquem)
    7123161
    >>> id(heyquem)
    6325706
    >>> heyquem is eyquem
    True
    >>> arf
    Traceback (most recent call last):
      File "<interactive input>", line 1, in <module>
    NameError: name 'arf' is not defined

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2007
    Messages : 40
    Points : 37
    Points
    37
    Par défaut
    Merci beaucoup c'est parfait !

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Points : 184
    Points
    184
    Par défaut
    Salut,

    je me permets quelques petites améliorations (honteusement pompées du Python CookBook).

    La fonction ci-dessous permet de simuler au plus proche la fonction xrange (mes commentaires dans le code) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    def drange(start, stop=None, step=1.0):
        """
        Version de xrange pour les nombres flottants.
        Admet les mêmes arguments que xrange.
        Admet aussi les nombres négatifs.
     
        >>> list(drange(3))
        [0.0, 1.0, 2.0]
        >>> list(drange(2, 6, 1.5))
        [2.0, 3.5, 5.0]
        >>> list(drange(1, -6, -1))
        [1.0, 0.0, -1.0, -2.0, -3.0, -4.0, -5.0]
        """
        # On s'assure de ne pas tomber dans une boucle infinie en vérifiant que step
        # ne vaut pas 0.
        assert step
        # Si 1 seul argument est entré, il s'agit alors de stop. start vaut dont 0
        # et step vaut 1.
        if stop is None:
            stop = start
            start = 0.0
        # On s'assure de ne travailler que sur des flottants. Cela n'a d'impact que
        # sur l'affichage.
        start, stop, step = (float(x) for x in (start, stop, step))
        # itertools est notre ami !
        for i in itertools.count():
            # On évite d'accumuler les erreurs d'arrondi.
            nbr = start + i * step
            # Condition de fin de boucle (pour les incréments positifs ET négatifs).
            if (step > 0 and nbr >= stop) or (step < 0 and nbr <= stop):
                return
            yield nbr
    La vraie bonne idée de cette fonction est de ne pas accumuler les erreurs d'approximations intrinsèques aux nombres flottants. Cela dit, on ne s'en débarasse pas, on les limite juste.

    Il faudrait utiliser le package decimal pour se garantir le calcul exact.

    Après, si une telle fonction existe déjà dans numpy, je préfère m'en servir plutôt que de la réécrire à ma façon.

    J'ai bien aimé la suggestion de josmiley. Intéressant comme idée, mais il faut bien faire attention à multiplier par 100 tous les arguments de la fonction (x)range ce qui est une contrainte forte (en tout cas, pour ma p'tite tête).

    Ciao !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Boucle for dans un script cmd
    Par nicolas.ganache dans le forum Développement
    Réponses: 4
    Dernier message: 19/07/2004, 16h07
  2. Réponses: 3
    Dernier message: 06/07/2004, 10h21
  3. [Debutant] Batch et Boucle for
    Par ludovic.fernandez dans le forum Scripts/Batch
    Réponses: 8
    Dernier message: 06/05/2004, 19h21
  4. [Swing][boucles] for, do, if .....comment faire simple?
    Par chastel dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 02/05/2004, 22h49
  5. [langage] boucle "for" modification du pas
    Par K-ZimiR dans le forum Langage
    Réponses: 4
    Dernier message: 29/04/2004, 11h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo