2016-02-19 40 views
1

我在某些類型的計算器的工作了使用from fractions import *下一個邏輯以下餾分:Python的 - 執行的字符串編碼對於餾分

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

print(a+b*c) 

輸出

11/20 

但我需要從字符串執行語句,就像​​,由於某種原因總是返回我或:

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)' 

但我真正需要的是這樣的(我認爲這是IMPOSIBLE到做):

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

還有我是做這種事情的一種方式......?

+1

使用eval而不是EXEC –

+0

或用[sympy(http://www.sympy.org/en/index.html) –

+0

不工作與'的eval()' – PsychoMantis52

回答

1

沒有什麼是可變的我的朋友......!你可以這樣做是這樣的:

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 
+1

謝謝,那就是我正在尋找的對於。 – PsychoMantis52

2

您可以使用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,你需要做1.0/4在Python 2 python3將採用雙類型的計算的話所以它會返回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'] 
+0

這也返回0,我不知道爲什麼。 – PsychoMantis52

+0

它在python3中工作,你使用的是2.7.x嗎? – vittore

+0

我的版本是2.7.10 – PsychoMantis52

2

我嘗試這樣做,這是工作(我輸入的是形式/ 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)