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 我 0 或 1:
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/4
和 1/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
我一直在使用 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 我 0 或 1:
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/4
和 1/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