Question débutant python

psykaram Messages postés 86 Date d'inscription   Statut Membre Dernière intervention   -  
psykaram Messages postés 86 Date d'inscription   Statut Membre Dernière intervention   -
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 26003 Date d'inscription   Statut Modérateur Dernière intervention   1 618
 
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 995 Date d'inscription   Statut Membre Dernière intervention   190
 
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   Statut Membre Dernière intervention   131
 
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 86 Date d'inscription   Statut Membre Dernière intervention   12
 
merci pour vos réponses je me remet au travaille tout de suite.
a bientôt pour un code plus élaboré
0