Лямбда-функция не принимает сопоставление с помощью ввода (Python)
Как сделать так, чтобы функция в лямбда-форме принимала правила отображения через ввод вместо явного указания в функции?
Вот мой код, я пытаюсь создать программу для числовой интеграции.
while True:
fx=input("Enter a function: ")
a=int(input("Choose lower integration limit: "))
b=int(input("Choose upper integration limit: "))
delta=float(input("Choose delta x: "))
step=int(1/delta)
interval=list(range((a*step),(b*step)))
f= lambda x: (x**2)*delta
Теперь я хочу заменить эту часть
(x**2)
для произвольного многочлена через входfx
result=map(f,interval)
print(sum(list(result))*(delta**2))
continue
если я попробую заменить (x**2)
за fx
это выдаст эту ошибку:
Traceback (most recent call last):
File "C:\Users\Christian\Desktop\Python-Programme\Nummerische Integration.py", line 13, in <module>
print(sum(list(result))*(delta**2))
File "C:\Users\Christian\Desktop\Python-Programme\Nummerische Integration.py", line 11, in <lambda>
f= lambda x: fx*delta
TypeError: can't multiply sequence by non-int of type 'float'
* Я полностью осознаю, что это, вероятно, не оптимальная программа для числовой интеграции, причина, по которой я ее создаю, заключается в том, чтобы просто тренировать свои навыки программирования при создании программ, которые я все еще мог бы теоретически использовать.
2 ответа
Независимо от вопроса, если это имеет смысл, ошибка происходит из-за несоответствия типов:
Когда вы получаете вход от fx=input("Enter a function: ")
переменная fx будет иметь тип str
, Пытаться print(type(fx))
,
Когда вы затем выполните fx*delta
в основном вы пытаетесь умножить строку на числовое значение, что не имеет смысла. Таким образом ваша ошибка TypeError: can't multiply sequence by non-int of type 'float'
,
Быстрое решение будет
while True:
n=int(input("Enter degree of polynomial: "))
print(type(fx))
a=int(input("Choose lower integration limit: "))
b=int(input("Choose upper integration limit: "))
delta=float(input("Choose delta x: "))
step=int(1/delta)
interval=list(range((a*step),(b*step)))
f= lambda x: (x**n)*delta
result=map(f,interval)
print(sum(list(result))*(delta**2))
continue
Для продвинутого решения нужен способ разбить ваш строковый ввод в лямбда-функцию, что, я думаю, не так просто.
Является
f = lambda x: fx(x) * delta
то, что ты хочешь?
Тогда вы должны войти lambda x: x**2
для FX.
Но может быть, это слишком рано для продвинутых концепций, таких как функциональное программирование, так как Python старается не уделять им слишком много внимания? Например, вы можете начать с того, что сделаете этот фрагмент кода более приятным и корректным для любой функции.
step=int(1/delta)
interval=list(range((a*step),(b*step)))
result=map(f,interval)
print(sum(list(result))*(delta**2))