lambda函数不接受通过输入的映射规则(Python)

时间:2016-11-26 21:05:16

标签: python lambda calculus

如何在lambda表单中创建一个函数,通过输入接受映射调节,而不是在函数中明确说明它?

这是我的代码,我正在尝试创建一个用于数字集成的程序。

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 个答案:

答案 0 :(得分:0)

f = lambda x: fx(x) * delta

你想要什么?

然后你必须为fx输入lambda x: x**2

但是对于像函数式编程这样的高级概念来说可能有点太早了,因为Python试图不过分强调它们?例如,你可以通过使这段代码更好,更正确任何函数来开始。

step=int(1/delta)
interval=list(range((a*step),(b*step)))
result=map(f,interval)
print(sum(list(result))*(delta**2))

答案 1 :(得分:0)

无论问题是否合理,错误都来自类型不匹配:

当您从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

高级解决方案需要一种方法将字符串输入解析为lambda函数,我认为这并不容易。