所以我必须创建一个程序,它采用以下形式的字符串:2x^3 + x^2 - 4
并计算其衍生物,即使它像这样:6x^2 + 2x
所以我创建了一个class Monomial
,它有三个成员变量:系数,变量名和功率。换句话说,我必须将多项式分解为单项式。然后我必须采用每个单项式并将其分成前面提到的变量。所以2x^3
将被表示为以下对象:Monomial(2, 'x', 3)
但是,我如何拆分字符串呢?我不想使用'SymPy'或其他库来轻松计算衍生物。
pattern = "(\d+)?([a-z])\^(\d+)"
result = re.match(pattern, "323x^22")
print result.groups()
生产:
('323', 'x', '22')
该模式的解释如下:
每个括号将包含一个组,第一个匹配数字,由“\ d”表示,并匹配尽可能多的数字,用“+”表示。问号表示如果没有匹配(例如,因为它是x ^ 2),则表示正常。在中央组中,您会看到[a-z],它将匹配任何单个小写字母。所以,如果你找到“23c ^ 2”它也会匹配。最后,你需要使用“\ ^”来转义“^”符号,它在正则表达式中有其自己的含义。
result = re.match(pattern, "x^2")
print result.groups()
现在,对于“x ^ 2”的输入,此代码将产生:
(None, 'x', '2')
所以只需确保用1代替None。
首先,我们需要将表达式拆分为简单的位,但我们必须删除字符串中的空格。
simplerExpression = " "
expression = input("Expression to derive: ")
for x in range(len(expression)):
if expression[x] != " ":
simplerExpression = simplerExpression + expression[x]
知道你知道将每个单项式分开的所有内容都是+符号,所以我们将所有单项式分成一个数组:
ARRMonomial = []
for x in range(len(simplerExpression)):
if simplerExpression[x] != '+':
ARRMonomial.append(monomial)
monomial = 0
else:
monomial = monomial + simplerExpression[x]
你所做的是因为你确定'x'之前的所有内容都是一个系数,你将循环遍历字符串中的所有字符,直到找到x然后将它们转换为int(如果你需要它)。还要注意我只对+符号做了这个而不是负号,这是因为我们需要在这个循环后面对数字进行否定:
ARRCoefficients = []
for monomial in ARRMonomial:
sign = 1
pos = 0
coefficient = ""
while monomial[pos] != 'x' and pos <= len(monomial)+1:
if monomial[pos] = '-':
sign = "-1"
else:
coefficient = coefficient + expression[pos]
pos = pos +1
#And if there is no coefficient then return 1
if coefficient == "":
coefficient = 1
ARRcoefficient.append(coefficient)
知道你有办法把系数拿出来。你所做的是搜索指数的值。你可以通过循环直到找到x然后在'^'后面使用数字来实现。
ARRExponents = []
for monomial in ARRMonomial:
Xexists = True
x = 0
while monomial[x] != 'x':
if x == len(monomial):
Xexists = False
break
x = x + 1
if monomial[x+1] == '^' and Xexists == True:
for y in range(x+1,len(monomial)):
exponent = exponent + monomial[y]
elif Xexists == True:
exponent = 1
else:
exponent = 0
ARRExponent.append(exponent)
你最终会得到一个系数列表和xs的指数(包括x到幂0),以便你把你的函数放在一边。如果您不知道该怎么做:
for x in range(len(ARRExponent)):
monome(ARRCoefficiant[x],'x',ARRExponent[x])
我首先将初始字符串拆分为monomes并识别每个monome的元素:
现在使用re
模块处理字符串很简单:
def process(txt):
monomes = []
for elt in re.findall('([+-]?) *([\d]*)([a-zA-Z]?)(?:\^(\d+))?', txt):
coeff, var, exp = None, None, None
#print(elt)
if elt != ('','','',''):
if elt[1] == '':
coeff = 1
else:
coeff = int(elt[1])
if elt[0] == '-': coeff = - coeff
if elt[3] == '':
if elt[2] == '':
var = 'x'
exp = 0
else:
var = elt[2]
exp = 1
else:
exp = int(elt[3])
var = elt[2]
#print ((coeff, var, exp))
monomes.append(Monome(coeff, var, exp))
return monomes
我们现在得到:
>>> process(poly)
[Monome(2, 'x', 3), Monome(1, 'x', 2), Monome(-4, 'x', 0)]