2016-09-29 3 views
0

Je souhaite que les utilisateurs saisissent des formules mathématiques dans mon système. Comment peut-on convertir la formule case1 en formule case2 en utilisant Python? En un mot, je voudrais changer l'ordre mathématique spécifiquement pour les doubles astérisques.Comment modifier la priorité dans l'ordre mathématique (astérisque)

#case1 
3*2**3**2*5 
>>>7680 

#case2 
3*(2**3)**2*5 
>>>960 
+0

Que voulez-vous exactement faire? Vous avez changé l'ordre mathématique ... – MooingRawr

+0

Vous voulez que l'exponentiation se lie plus étroitement que la multiplication? Vous devrez écrire du code qui passe et insère des parenthèses avant de le passer à votre fonction d'évaluation. –

Répondre

0

est Ci-dessous l'exemple pour y parvenir en utilisant re comme:

expression = '3*2**3**2*5' 
asterisk_exprs = re.findall(r"\d+\*\*\d+", expression) # List of all expressions matching the criterion 
for expr in asterisk_exprs: 
    expression = expression.replace(expr, "({})".format(expr)) # Replace the expression with required expression 

# Value of variable 'expression': '3*(2**3)**2*5' 

Afin d'évaluer la valeur mathématique de l'expression str, utilisez eval comme:

>>> eval(expression) 
960 
+0

Votre sortie est syntaxiquement invalide. Edit: was –

+0

Mis à jour la réponse. –

1

Non seulement est ce n'est pas quelque chose que Python supporte, mais vraiment, pourquoi voudriez-vous? Modifier BIDMAS ou PEMDAS (en fonction de votre emplacement), non seulement vous donnerait des réponses incorrectes, mais aussi confondre les développeurs qui regardent le code.

Il suffit d'utiliser des crochets comme dans le cas 2, c'est à quoi ils servent.

+1

Correction, OP ne change pas la priorité d'opérateur différente, mais plutôt l'ordre d'exponentiation empilé. Cela aurait été plus clair, si l'exemple était '2 ** 3 ** 2' contre' (2 ** 3) ** 2' - dans les deux cas c'est le même opérateur - voir https: // fr .wikipedia.org/wiki/Order_of_operations # Special_cases – RafazZ

+0

Même l'associativité est à peu près définie comme standard, 'x ** y ** z' devrait toujours être associatif, c'est donc' x ** (y ** z) '. Ceci est nécessaire pour des choses comme la distribution normale où vous avez une formule comme 'e ** (-t ** 2)'. –

1

Si les utilisateurs sont supposés entrer des formules dans votre programme, je suggère de le conserver tel quel. La raison en est que l'exponentiation en mathématiques est right-associative, ce qui signifie que l'exécution va du plus haut niveau vers le bas. Par exemple: a**b**c = a**(b**c), par convention. Il y a quelques programmes qui utilisent la résolution ascendante de l'exponentiation empilée - MS Excel et LibreOffice sont certains d'entre eux, cependant, c'est contre la convention ordinaire, et toujours confus de l'enfer hors de moi.

Si vous souhaitez remplacer ce comportement, et toujours être mathématiquement correct, vous devez utiliser des crochets.

Vous pouvez toujours déclarer votre propre méthode d'alimentation qui résoudrait la façon dont vous le souhaitez - quelque chose comme numpy.pow(). Vous pourriez surcharger le built-in, mais c'est trop hâté.

Read this