Python - 为分数执行字符串代码

Python - Execute a String Code For Fractions

我一直在使用 from fractions import * 的某种分数计算器,遵循以下逻辑:

a = Fraction(1,4)
b = Fraction(2,5)
c = Fraction(3,4)

print(a+b*c)

输出

11/20

但我需要从字符串中执行语句,就像 1/4 + 1/2 并且出于某种原因总是 returns 我 01:

from fractions import *

class main():
    for i in range(0, 10):
        print "\t\nWRITE YOUR OPERATION"
        code = 'print('
        s = raw_input()
        elements = s.split()

        for element in elements:
            print(element)

            if '/' in element:
                fraction = element.split('/')
                numerator = fraction[0]
                denominator = fraction[1]
                a = Fraction(int(numerator),int(denominator))
                code = code + str(a)
            else:
                code = code + str(element)                

        code = code + ')'        

        exec code

这是我缺少的东西?

编辑 1

我知道这里出了什么问题

字符串代码是这样的:

code = 'print(1/4+2/5*3/4)'

但我真正需要的是这个(我认为这是不可能做到的):

code = 'print(Fraction(1,4)+Fraction(2,5)*Fraction(3,4))'

或者有办法做这样的事情...?

您可以使用ast eval

import ast

def myfunc():
   localvars = {}
   expr = 'x = 1/4 + 1/2'
   eval(compile(ast.parse(expr), '<input>', mode="exec"), localvars)
   return localvars['x']

请注意,在 python 2 中它将产生 0,因为 1/41/2 都会产生 0,您需要在 [=20= 中执行 1.0/4 ] 2. python3 将使用 double 类型计算它,因此它将 return 0.75 如您所料,即 python2 版本:

 import ast

 def myfunc():
    localvars = {}
    expr = 'x = 1.0/4 + 1.0/2'
    eval(compile(ast.parse(expr), '<input>', mode="exec"), localvars)
    return localvars['x']

我试过了,效果很好(我输入的格式是 a/b + c/d):

from fractions import*

print ("your operation:")

op = input()
#print (op)

elements = op.split()

for el in elements:
    if ('/' in el):
       fraction = el.split('/')
       numerator = fraction[0]
       denominator = fraction[1]

       a = Fraction(int(numerator),int(denominator))

    print (numerator)
    print (denominator)
    print (a)

你可以这样做:

from fractions import *

def returnElement(element):
    if '/' in element and len(element) > 1:
        fraction = element.split('/')
        numerator = fraction[0]
        denominator = fraction[1]
        return 'Fraction(' + numerator + ',' + denominator + ')'        
    else:
        return element  

class main():
    for i in range(0, 10):
        print "\t\nWRITE YOUR OPERATION"
        code = 'print('
        s = raw_input()
        elements = s.split()

        for element in elements:
            code = code + returnElement(element)           

        code = code + ')'        

        print code
        exec code