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 :

Condition sur float


Sujet :

Python

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 8
    Par défaut Condition sur float
    Bonjour

    Je récupère une liste de chiffre.

    par exemple :

    1.0, 1.5, 1.6, 2.5, 3.5, 4.0

    Je voudrai faire un si le chiffre après la virgule différent de 0 alors...

    Avez vous une idée?

    et ensuite récupéré ce chiffre, cela devrait fonctioner avec un [:1]

    Merci d'avance

  2. #2
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 327
    Par défaut
    Bonjour,

    cela devrait fonctioner avec un [:1]
    Oui je pense que sur votre exemple cela marche mais cela sous entend également que vous ne pouvez pas avoir deux chiffres après à la virgule... C'est pourquoi je vous invite à utiliser le split :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    nombre = 1.0
    decimal = int(str(nombre).split(".")[-1])
    if decimal == 0:
        ... # A vous de continuer ^^
    Si votre [:1] marche pas, c'est parce que ce dernier s'applique aux chaines de charactères (les strings) et non aux ints, utilisez si vous voulez garder votre méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nombre = 1.0
    chaine = str(nombre)
    Bon courage à vous, si vous avez un autre probleme, n'hesitez pas...

    Mickael

  3. #3
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Allez, en une ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    x = int(divmod(nombre, 1)[1] * 10)

  4. #4
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Très pythonien ! C'est marrant mais il me semble moins tortueux de faire :

  5. #5
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 327
    Par défaut
    Bonsoir,

    Moi et les maths c'est pas toujours mon fort MDR, mais très ingénieux...

    Mickael

  6. #6
    Membre chevronné Avatar de Pierre Maurette
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 283
    Par défaut
    Comme l'énoncé du problème est un peu flou, une proposition tolérante sur la saisie (accepte des int et tous les float), une proposition:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    f = (1.0, 15.5, 1.6, 2.5, 10, 6.0, 3.52, 4.0)
    liste = [(_1, int((_1%1)*10)) for _1 in [float(_2) for _2 in f]]
    print liste
    Les tests:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #test
    def test(liste):
        for f, i in liste:
            assert int(str(f).split('.')[1][:1]) == i, f
     
    test(liste)
     
    #test du test
    test(liste + (30.45, 2))

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 8
    Par défaut
    Merci beaucoup pour vos réponses.

    j'ai réussi avec la première méthode proposer mais je teste les autres également, cela permet de me former

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 8
    Par défaut
    petite question encore le _1 par exemple que signifie le _?

  9. #9
    Membre chevronné Avatar de Pierre Maurette
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 283
    Par défaut
    Citation Envoyé par laurent0 Voir le message
    petite question encore le _1 par exemple que signifie le _?
    C'est une habitude personnelle peut-être pas très heureuse. Le simple _ initial est un indicateur faible d'usage interne. J'utilise _1, _2, etc. pour avoir un réservoir de noms non significatifs courts, typiquement dans des fonctions, boucles, list comprehensions, etc. Mais mon utilisation ici est mauvaise. En effet, le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    liste = [(_1, int((_1%1)*10)) for _1 in [float(_2) for _2 in f]]
    laisse penser que j'ai besoin de deux noms, ce qui justement est faux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    liste = [(_1, int((_1%1)*10)) for _1 in [float(_1) for _1 in f]]
    marche aussi bien.
    J'utilisais auparavant simplement _, ça marchait, mais c'est parfois déconseillé. De plus dans mon IDE (Pydev) les noms dummy, _ et unused font par défaut taire le warning "unused variable".
    Notez également que _ est une variable particulière dans IDLE (en interactif). Elle contient le dernier résultat retourné:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> 10 + 5
    15
    >>> _ + 5
    20
    Enfin je ne suis pas très cohérent, puisque je mélange les _? avec les noms parlant, par exemple j'écrirai toujours "from line in lines:".

  10. #10
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Bonjour.

    Citation Envoyé par Apocalypses Voir le message
    Moi et les maths c'est pas toujours mon fort MDR, mais très ingénieux...
    Rien de mystique dans tout ceci... Supposons que nombre = 7.12345
    • On a nombre*10 = 71.234 .
    • % renvoie le "reste" de la division par dix, comme ici 71.2345 = 7*10 + 1.2345, on a : nombre*10%10 = 1.2345 .
    • Pour finir, on garde la partie entière en utilisant int(...) ce qui donne bien 1.

  11. #11
    Membre chevronné Avatar de Pierre Maurette
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 283
    Par défaut
    Notez que int(nombre*10%10) comme int(nombre%1*10) donnent un résultat pas nécessairement attendu sur des négatifs.

  12. #12
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Citation Envoyé par Pierre Maurette Voir le message
    Notez que int(nombre*10%10) comme int(nombre%1*10) donnent un résultat pas nécessairement attendu sur des négatifs.
    Hu?!?
    Pour int(nombre%1*10), je suis d'accord mais ne n'est pas une question de signe.
    Pour int(nombre*10%10), je ne comprends pas votre remarque.
    Le signe du résultat de la fonction "modulo" est celui du diviseur en non celui du dividende.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  13. #13
    Membre chevronné Avatar de Pierre Maurette
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 283
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Hu?!?
    Pour int(nombre%1*10), je suis d'accord mais ne n'est pas une question de signe.
    Pour int(nombre*10%10), je ne comprends pas votre remarque.
    Le signe du résultat de la fonction "modulo" est celui du diviseur en non celui du dividende.
    - W
    Les deux écritures donnent le même résultat, et c'est heureux. Et mathématiquement c'est un résultat parfaitement normal, prévisible. Simplement, nous proposons du code avec des bribes de cahier des charges (d'énoncé ?). Et parmi ces bribes je lis "le chiffre après la virgule". Donc il n'est pas évident du tout que le résultat attendu pour -1.2 soit 8.

  14. #14
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    En effet, ca se défend.
    Plus littéralement, ca donnerait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    li = (1.0, 15.5, 1.6, 2.5, -10, 6.0, 3.52, 4.0)
    f = lambda x: (int(abs(x) * 10 % 10), x)
    print map(f, li)
    Autre chose croquée sur un coin de table à l'appréciation de l'auteur.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. UPDATE avec condition sur d'autres tables
    Par guda dans le forum Langage SQL
    Réponses: 7
    Dernier message: 10/03/2005, 11h20
  2. Besoin d'explications sur float et l'élasticité !
    Par KneXtasY dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 14/01/2005, 15h15
  3. [XSLT][ACCESS]condition sur valeur
    Par kor dans le forum XSL/XSLT/XPATH
    Réponses: 23
    Dernier message: 10/01/2005, 14h14
  4. [SQL] Conditions sur une date dans une requete
    Par poufouille dans le forum Bases de données
    Réponses: 4
    Dernier message: 17/03/2004, 14h25
  5. Condition sur debug et release
    Par xave dans le forum MFC
    Réponses: 3
    Dernier message: 04/02/2004, 15h04

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