Question débutant python

Fermé
psykaram Messages postés 84 Date d'inscription mardi 28 décembre 2010 Statut Membre Dernière intervention 26 juin 2017 - 24 juil. 2012 à 05:59
psykaram Messages postés 84 Date d'inscription mardi 28 décembre 2010 Statut Membre Dernière intervention 26 juin 2017 - 24 juil. 2012 à 17:53
Bonjour,

Bonjour,

j ai suivi pas mal de tutos et a un certain moment j ai voulu mettre en oeuvre tous ce que j'ai appris en écrivent un code pour une petite calculette .
au moment ou j ai voulus combiner les opération comme (12+9)*(8/4)je n ai pas su quoi mettre .voila mon code
l1=["yes","ok","oui","ah"]
yes="yes"
ok="ok"
oui="oui"
ah="ah"
Exit=0
while Exit not in l1:
 l=raw_input()
 r=0
 
 if "+" in l:
     i=len(l.split("+"))-1
     while i>-1:
         if i-2>=-1:
          r=r+(float(l.split("+")[i]) + float(l.split("+")[i-1]))
         if i==0:
          r=r+(float(l.split("+")[i]))
         i=i-2
 if "-" in l:
     i=len(l.split("-"))-1
     while i>-1:
         if i-2>=-1:
          r=r+(float(l.split("-")[i]) - float(l.split("-")[i-1]))
         if i==0:
          r=r+(float(l.split("-")[i]))
         i=i-2
 if "*" in l:
     i=len(l.split("*"))-1
     while i>-1:
         if i-2>=-1:
          r=r+(float(l.split("*")[i]) * float(l.split("*")[i-1]))
         if i==0:
          r=r+(float(l.split("*")[i]))
         i=i-2
 if "/" in l:
     i=len(l.split("/"))-1
     while i>-1:
         if i-2>=-1:
          r=r+(float(l.split("/")[i]) / float(l.split("/")[i-1]))
         if i==0:
          r=r+(float(l.split("/")[i]))
         i=i-2
 print r
 Exit=str(input("exit?"))

je voudrai quelque indice sur comment combiner les operation

4 réponses

dna.factory Messages postés 24956 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 25 avril 2024 1 609
24 juil. 2012 à 07:24
je suis pas spécialiste en python, mais ton problème est au niveau de l'algo...
Tu ne t'y connais pas encore assez pour faire un calculatrice complexe (opération multiples).
Cela nécessite l'utilisation de piles (FIFO) qui te seront surement présentée dans les chapitres à venir. et de la gestion de caractère un par un.
au passage, un controle de caractère est généralement apprécié. ne serait-ce que pour éviter la division par zéro.
0
tuxboy Messages postés 994 Date d'inscription lundi 23 juillet 2012 Statut Membre Dernière intervention 28 mai 2019 189
24 juil. 2012 à 10:33
Bonjour,

La fonction eval, tu connais ?



import math
import re

def psy_eval(expr, symbols={}):
return eval(expr, dict(__builtins__=None), symbols)

def calc(expr):
return psy_eval(expr, vars(math))

print calc('(12+9)*(8/4)') # 42
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 130
Modifié par heyquem le 24/07/2012 à 11:15
Bonjour

Je crois que tu t'es donné en effet un exercice un peu trop ambitieux. Ce que tu veux faire est trop compliqué, car il faudra aussi gérer les priorités d'opérations et les parenthèses qui peuvent être imbriquées et ce sera pas de la tarte.

Or ton code est déjà trop compliqué alors qu'il ne traite que des cas hyper simples: que des +, ou que des -, etc. D'après ce que j'ai pu voir rapidement.

De plus, même pour ces cas simples, il est faux.
Si on entre par exemple 100 - 5, on obtient -95
Si on entre 2*2*5, on obtient 12


Il te faudrait étudier un peu plus Python pour penser à des solutions plus condensées, sinon avec simplement split() et des if, ton code atteindrait une longueur phénoménale.
Par exemple, en utilisant sum() et les expressions régulières, on peut traiter le cas des chaînes ne contenant que des nombres et les signes + et -:

import re 

rig = re.compile('(\A| *[+-]) *([.,\d]+)') 

while True: 
    ss = raw_input("\nEntrer l'expression : ") 
    print 'r ==',sum(-float(nb) if '-' in signe else float(nb) 
                     for signe,nb in rig.findall(ss))


Ce code tient compte des cas où on écrit une chaîne commençant par un nombre positif sans spécifier le signe + ( \A dans le motif de regex signifie "là doit se trouver le début de la chaîne", et un peu plus loin | signifie OU ; de fait (\A| *[+-]) envisage deux cas possibles)

Mais étudier les expressions régulières va te prendre un paquet d'heures. Nota Bene: les expressions régulières sont INDISPENSABLES à connaître en programmation.

Débuter en Python est aisé, ensuite ça se corse parce que c'est un lmangage extrêmemnt puissant. Mais rassure toi, c'est toujours moins compliqué de progresser en Python que dans des langages dantesques comme C++ ou Java
0
psykaram Messages postés 84 Date d'inscription mardi 28 décembre 2010 Statut Membre Dernière intervention 26 juin 2017 12
24 juil. 2012 à 17:53
merci pour vos réponses je me remet au travaille tout de suite.
a bientôt pour un code plus élaboré
0