2016-02-19 3 views
1

я работал в каком-то типа калькулятора для фракций с помощью from fractions import * следуя следующей логике:Python - Execute строковое Код для дробей

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

print(a+b*c) 

OUTPUT

11/20 

Но мне нужно для выполнения инструкции из строки, точно так же, как 1/4 + 1/2 и почему-то всегда возвращает меня или :

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 

Это что-то мне не хватает?

EDIT 1

Я знаю, что здесь не так

Код строки выглядит так:

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

Но что мне действительно нужно это (я думаю, это невозможное, чтобы do):

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

Или там i это способ сделать что-то подобное ...?

+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/4 и 1/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

Я попробовал это, и это работает (мой вход был в виде а/Ь + с/д):

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) 
Смежные вопросы