Как я могу добавить af (x) в качестве аргумента функции python? - PullRequest
0 голосов
/ 07 февраля 2020

Хорошо, поэтому я пытаюсь найти максимум любой функции 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'

Я не знаю, есть ли более простой способ сделать это или как исправить код, чтобы я мог преобразовать эту строку.

Ответы [ 3 ]

3 голосов
/ 07 февраля 2020

Используйте это:

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 (также) является функциональным языком, что означает, что вы можете использовать функции так же, как вы используете ints или float, et c. Функция - это просто набор вызываемого кода, вы можете связать идентификатор с функцией или нет (точно так же, как значения int, на которые ссылаются идентификаторы, или как константа в коде).

----- EDIT --- - предложено @ bacjist

Если вы не хотите использовать лямбду, вы можете определить функцию как обычно:

def f(x):
    return x**2

и затем вызвать:

print(maxf(f,[1,3]))
3 голосов
/ 07 февраля 2020

Ваша проблема в том, что float() принимает строку, которая уже представляет число с плавающей точкой (например, float("1.23"), а не выражение, которое приведет к одному (например, float("2**3")). Итак, вы должны сначала оцените строку.

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

eval() запустит любой код, содержащийся в строке, поэтому не используйте его в коде, которому вы не доверяете.

1 голос
/ 07 февраля 2020

Проблема в том, что ваша строка фактически не оценивается. Он просто конвертируется в float, так как ошибка говорит о том, что вы делаете, конвертируете «0 ** 2» в float, что невозможно. Вы можете использовать функцию eval для оценки любой заданной строки и затем сравнить результат. .

Вам просто нужно внести небольшое изменение, как это:

result=eval(function.replace("x",str(x)))

Это еще не лучший способ сделать это, вы должны использовать генератор там:

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])))

Более подход Pythoni c будет использовать лямбда с функцией max в качестве ключа

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...