如何用**替换用户输入的^?

时间:2014-05-24 20:27:18

标签: python replace lambda

嘿所以我想我会从我的代码开始然后进入我的问题:

def trapezoidal(a, b, deltax, func = None):

func = lambda x: (raw_input("Enter a function to have a trapezoidal approximation taken     
of. Enter it in the form a*x^m + b*x^n + c*x, a*x^m +c, etc. (ex. 3*x^3 + 4*x^2...) ")

h = float(b - a) / deltax  
s = 0.0                 
s += func(a)/2.0
for i in range(1, deltax):
    s += func(a + i*h)
s += func(b)/2.0
return s * h

基本上我试图让这个用户友好。我需要做的是将raw_input中的^替换为**,以便lambda可以对其进行评估。最后我想插入a,b和delta x的值,按回车键,使用接近正常的表示法输入函数(使用^而不是**)。我知道这看似愚蠢而毫无意义,但用户友好是必须的。我甚至想摆脱不得不让用户在系数和变量之间放入*((最好3x ^ 2将被评估为3 * x ** 2)然后插入lambda然后其余的它跑了。我意识到我可以简单地放入

def trapezoidal(a, b, deltax, func):

h = float(b - a) / deltax  
s = 0.0                 
s += func(a)/2.0
for i in range(1, deltax):
    s += func(a + i*h)
s += func(b)/2.0
return s * h

trapezoidal(5, 10, 100, lambda x: 3*x**2 + 2*x)

并且评价很好。但这不是用户友好的。

3 个答案:

答案 0 :(得分:1)

在源文件的开头:

import re

raw_input来电更改为:

re.sub(r'([\d])x', r'\1*x', raw_input("Enter a function...")).replace('^', '**')

说明: re.sub进行正则表达式替换。在这种情况下,你是:

  • 替换数字[\d]
  • 通过将其括在括号([\d])
  • 中来捕获第1组中的数字
  • 后跟x

  • 在第1组\1
  • 中捕获的相同数字
  • 后跟星号*
  • 后跟x

最后,我们将^的所有实例替换为**,并进行简单的str.replace调用。


然而,作为tripleee says,这不足以实际评估函数;这只会执行标题和问题第一部分中描述的文本操作问题。实际上将文本作为一个函数进行评估是一个单独的问题。

答案 1 :(得分:0)

func只是一个字符串。您必须eval将其作为Python表达式执行。在此之前,您可以执行任何您喜欢的字符串操作。

func = raw_input()
func.replace('^', '**')
# TODO: valudation here
f = eval(func)

在您eval之前,您应该验证它是否符合您预期的输入格式;否则,您的代码中存在巨大的安全漏洞。

答案 2 :(得分:-1)

以下是我解决问题的方法:

def trapezoidal(a, b, deltax, func = None):

#first we find the height using our range divided by deltax

h = float(b - a) / deltax  

'''
 next we find start to calculate the sum; set s to 0 to make it start at 0
we divide func(a) by two, because of the area of trapezoid 1/2(b1 + b2)h
next use a for loop to evaluate the b1 + b2
s is basically the 1/2(b1 + b2), then we multiply it by h, the height.
tr '''   
s = 0.0                 
s += func(a)/2.0
for i in range(1, deltax):
    s += func(a + i*h)
s += func(b)/2.0
return s * h

     '''
    next we are going to get our values for a, b, and deltax
    we must use eval(func) to use the lambda x:.
    it then runs through trapezoidal()
    '''
def userexp():
    a = int(raw_input("Enter your a "))
    b = int(raw_input("enter your b "))
    deltax = int(raw_input("enter your deltax "))
    func = raw_input("Enter your function as a*x**n + b*x**m.. ex 3*x**3 + 5*x**2 ")
    return trapezoidal(a, b, deltax, lambda x: eval(func))