好吧,所以我试图在某个范围内找到任何函数f(x)的最大值,并且在x内会发生这种情况。 python函数的参数为(f(x),[a,b])。 f(x)是任意函数,并且[a,b]是我们要研究的范围。
目前,我已经尝试了一些方法,但是没有一个起作用。我最喜欢的一个失败是因为尝试将字符串转换为浮点数。
def maxf(function,interval):
maxresult = 0
for x in range(interval[0]-1,interval[1]+1):
result=float(function.replace("x",str(x)))
if result >= maxresult:
maxresult = result
maxresultx = x
return maxresult,maxresultx
print(maxf("x**2",[1,3]))
此返回:
Traceback (most recent call last):
File "main.py", line 10, in <module>
print(maxf("x**2",[1,3]))
File "main.py", line 4, in maxf
result=float(function.replace("x",str(x)))
ValueError: could not convert string to float: '0**2'
我不知道是否有更简单的方法或更正代码,以便我可以转换该字符串。
问题是您的字符串实际上未被评估。它只是被转换为浮点数,因此错误提示您正在执行的操作是将“ 0 ** 2”转换为浮点数,这是不可能的,您可以使用eval函数评估任何给定的字符串,然后比较结果。
您只需要进行如下小的更改:
result=eval(function.replace("x",str(x)))
这不是最好的方法,您应该在此使用Generator:
def maxf(function,interval):
maxresult = 0
for x in range(interval[0]-1,interval[1]+1):
yield eval(function.replace("x",str(x))), x
print(max(maxf("x**2", [1, 3])))
更多的pythonic方法将使用以max函数为键的lambda
a_list = [1,3]
max_item = max(a_list, key=lambda x: eval("x**2"))
print(eval("x**2".replace("x", str(max_item))), max_item)
您的问题是float()
接受已经代表浮点数的字符串(例如float("1.23")
,而不是将导致结果的表达式(例如float("2**3")
)。因此,您必须首先评估该字符串。
float(eval("3**2"))
[
eval()
将运行字符串中包含的任何代码,因此请不要在不信任的代码上使用它。
使用此:
def maxf(function,interval):
maxresult = 0
for x in range(interval[0]-1,interval[1]+1):
result=float(function(x))
if result >= maxresult:
maxresult = result
maxresultx = x
return maxresult,maxresultx
print(maxf(lambda x: x**2,[1,3]))
[lambda
定义了一个作为参数传递的函数(匿名函数),因此maxf
可以根据需要调用它。
Python是(也是)一种功能语言,这意味着您可以在使用int或float时运行。功能只是一堆可调用的代码,您可以将标识符与功能关联或不关联(就像int标识符引用的值或代码中的常量)。