我如何添加f(x)作为python函数的参数?

问题描述 投票:0回答:3

好吧,所以我试图在某个范围内找到任何函数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'

我不知道是否有更简单的方法或更正代码,以便我可以转换该字符串。

python function max
3个回答
1
投票

问题是您的字符串实际上未被评估。它只是被转换为浮点数,因此错误提示您正在执行的操作是将“ 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)

4
投票

您的问题是float()接受已经代表浮点数的字符串(例如float("1.23"),而不是将导致结果的表达式(例如float("2**3"))。因此,您必须首先评估该字符串。

float(eval("3**2"))

[eval()将运行字符串中包含的任何代码,因此请不要在不信任的代码上使用它。


1
投票

使用此:

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标识符引用的值或代码中的常量)。

© www.soinside.com 2019 - 2024. All rights reserved.