【发布时间】:2019-01-20 06:27:38
【问题描述】:
我正在编写一个导数计算器,作为其中的一部分,我必须能够创建函数表示,然后能够用数字替换变量,然后进行数学运算。我试图使用 lambdas 为我做这件事,但我不断收到错误 TypeError: unsupported operand type(s) for -: 'function' and 'int'
def doit(p):
a = p.get_base()
b = p.get_deg()
return lambda x: a ** b.get_val()
if __name__ == '__main__':
fext = make_pwr('x', 5)
f = lambda x: doit(fext) + x.get_val()
print(f(make_const(5)))
下面是 const 类的样子:
#!/usr/bin/python
class const(object):
def __init__(self, val=0.0):
self.__val__ = val
def get_val(self):
return self.__val__
def __str__(self):
return str(self.__val__)
@staticmethod
def add(c1, c2):
assert isinstance(c1, const)
assert isinstance(c2, const)
v1, v2 = c1.get_val(), c2.get_val()
return const(val=(v1 + v2))
@staticmethod
def mult(c1, c2):
assert isinstance(c1, const)
assert isinstance(c2, const)
v1, v2 = c1.get_val(), c2.get_val()
return const(val=(v1 * v2))
@staticmethod
def divide(c1, c2):
assert isinstance(c1, const)
assert isinstance(c2, const)
v1, v2 = c1.get_val(), c2.get_val()
return const(val=(v1 / v2))
和功率等级:
#!/usr/bin/python
from const import const
class pwr(object):
def __init__(self, base=None, deg=None):
self.__base__ = base
self.__deg__ = deg
def get_base(self):
return self.__base__
def get_deg(self):
return self.__deg__
def __str__(self):
return '(' + str(self.__base__) + '^' + str(self.__deg__) + ')'
这是回溯:
Traceback (most recent call last):
File "D:/Shared/OneDrive/skewl/Spring 2019/CS 3430/hw01/maker.py", line 39, in <module>
print(f(make_const(5)))
File "D:/Shared/OneDrive/skewl/Spring 2019/CS 3430/hw01/maker.py", line 37, in <lambda>
f = lambda x: doit(fext) + x.get_val()
TypeError: unsupported operand type(s) for +: 'function' and 'int'
【问题讨论】:
-
请附上
make_pwr和make_const的代码 -
请显示回溯。错误发生在哪里?
-
如果我猜不到,你不会在某个地方调用 lambda。
-
读取错误:你正在尝试添加一个函数(
doit的返回值)和一个整数。 -
如果您是 Python 新手,这看起来是一件非常复杂的事情。您的代码中有大量非pythonic 的东西可能会让您更难理解出了什么问题(并且让我们更难理解您打算做什么)。例如,您不恰当地为自己的变量使用
__dunder__名称(可能应该只使用简单的self.value名称)并且 not 使用定义明确的 dunder 方法,例如__add__和 @987654332 @.