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 :

Une équation en mode texte


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Une équation en mode texte
    Bonjour

    J'ai un dictionnaire qui contient deux nombres et un signe opératoire, construit en format texte.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    nombre = '774.2*4'
    dico = {0: '774.2', 1: '*', 2: '4'}
    operation = (''.join(val for val in dico.values()))
    print(operation)
    Mon problème est de pouvoir obtenir le résultat de l'énoncé du nombre original ('774.2*4'), soit : 3096.8.
    Convertir '774.2' et '4' est aisé, mais convertir '*' en *, c'est difficile à obtenir ça...

  2. #2
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    nombre = '774.2*4'
    dico = {0: '774.2', 1: '*', 2: '4'}
    operation = eval(''.join(val for val in dico.values()))
    print(operation)
    ?

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par marco056 Voir le message

    ?
    Ouai, merci marco et du premier coup (very much
    Dernière modification par Invité ; 10/04/2018 à 20h02.

  4. #4
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    selon le proverbe "eval() c'est mal", c'est la solution la plus simple à mettre en œuvre, mais si on veut coder un poil plus propre on aura tout intérêt à s'y prendre autrement
    on peut par exemple définir les opération (il n'y en a que 4 après tout...) et appeler la fonction qui correspond selon le cas, un truc dans ce style :

    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
    def addition(i, j):        return i+j
    def soustraction(i, j):    return i-j
    def multiplication(i, j):  return i*j
    def division(i, j):        return i/j
    def conversion(i):         return float(i) if '.' in i else int(i)
     
    signe = { '+' : addition, '-' : soustraction, '*' : multiplication, '/' : division }
     
    if __name__ == '__main__':
       expression = ['774.2', '*', '4']
       nombre1     = conversion(expression[0])
       operation   = signe[expression[1]]
       nombre2     = conversion(expression[2])
       resultat    = operation(nombre1, nombre2)
       print (resultat)
    au delà pour des expressions plus complexes (avec des parenthèses, plusieurs opérateurs etc. par exemple) on aura tout intérêt à écrire un parser en bonne et due forme

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 707
    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 707
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    selon le proverbe "eval() c'est mal", c'est la solution la plus simple à mettre en œuvre, mais si on veut coder un poil plus propre on aura tout intérêt à s'y prendre autrement
    Bah si on commence à essayer d'améliorer les codes de toumic, il y a du boulot... D'autant que le monsieur n'est pas vraiment réceptif.
    Autre perle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dico = {0: '774.2', 1: '*', 2: '4'}
    operation = eval(''.join(val for val in dico.values()))
    qui ne marche qu'en 3.6 par effet de bord d'une nouvelle implémentation des dict qui les rend "ordonnés".

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    J'ai donné la solution simple. eval(), qui est peut-être mal mais pour ma part, je trouve la solution de remplacement vraiment indigeste...

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    salut,

    selon le proverbe "eval() c'est mal", c'est la solution la plus simple à mettre en œuvre, mais si on veut coder un poil plus propre on aura tout intérêt à s'y prendre autrement
    on peut par exemple définir les opération (il n'y en a que 4 après tout...) et appeler la fonction qui correspond selon le cas, un truc dans ce style :

    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
    def addition(i, j):        return i+j
    def soustraction(i, j):    return i-j
    def multiplication(i, j):  return i*j
    def division(i, j):        return i/j
    def conversion(i):         return float(i) if '.' in i else int(i)
     
    signe = { '+' : addition, '-' : soustraction, '*' : multiplication, '/' : division }
     
    if __name__ == '__main__':
       expression = ['774.2', '*', '4']
       nombre1     = conversion(expression[0])
       operation   = signe[expression[1]]
       nombre2     = conversion(expression[2])
       resultat    = operation(nombre1, nombre2)
       print (resultat)
    au delà pour des expressions plus complexes (avec des parenthèses, plusieurs opérateurs etc. par exemple) on aura tout intérêt à écrire un parser en bonne et due forme
    Bien reçu

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

Discussions similaires

  1. [Électronique] Réalisation d'une carte graphique mode texte pour Arduino ou autre µC
    Par Iradrille dans le forum Embarqué
    Réponses: 9
    Dernier message: 05/03/2016, 13h53
  2. Récupération données d'une base en mode texte
    Par bs1705 dans le forum Prolog
    Réponses: 1
    Dernier message: 14/12/2007, 21h54
  3. Configuration d'une console en mode texte
    Par legapounet dans le forum Administration système
    Réponses: 2
    Dernier message: 16/11/2006, 16h23
  4. Réponses: 3
    Dernier message: 24/10/2006, 18h36
  5. ouvrir une page Web en mode texte
    Par Halleck dans le forum Windows
    Réponses: 7
    Dernier message: 03/03/2004, 15h08

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