我正在尝试学习python中的符号操作的来龙去脉(我是初学者)。
我有以下基本代码,输出给我一个错误,告诉我它“无法将表达式转换为浮动”。
此代码出了什么问题:
from sympy import *
from math import *
def h(x):
return log(0.75392 * x)
x = symbols('x')
hprime = h(x).diff(x)
print(hprime)
答案 0 :(得分:5)
这是PEP-8关于通配符导入的一个典型例子:
应避免使用通配符导入(
from <module> import *
),因为它们不清楚命名空间中存在哪些名称,使读者和许多自动化工具都感到困惑。
问题是您需要使用sympy.log
类,但使用math.log
函数代替float
个对象,而不是Symbol
个对象。
写作时
from sympy import *
您正在模块命名空间中导入sympy
包裹在顶层提供的所有内容(并且有许多内容,大部分内容根本不需要),包括{{1 }。class。
下一个陈述后
sympy.log
您要导入from math import *
模块中的所有内容,包括math
,它会覆盖以前导入的math.log
类。
考虑到这一点,您的示例可能写成
sympy.log
给我们
import sympy
def h(x):
return sympy.log(0.485022 * x)
x = sympy.symbols('x')
h_x = h(x)
hprime = h_x.diff(x)
print(hprime)
<强> P上。 S。:我已删除1.0/x
导入,因为它未在给定示例中使用。
答案 1 :(得分:2)
这里的问题是sympy
和math
包都定义了一个名为log
的函数。
将其导入为from sympy import *
,然后from math import *
会将sympy.log
覆盖为math.log
。
最好始终使用import sympy
,然后调用您的函数sympy.log
或(如果像我一样懒惰)执行import sympy as sym
,然后sym.log
。一定要使用数学包。这种方法将在未来为您节省大量麻烦,并使您的代码更易于理解。