2016-11-26 52 views
0

如何在lambda表单中创建函数通过输入接受映射规则而不​​是在函数中明确声明它?lambda函数不接受通过输入映射规则(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 

Now I want to substitute this part (x**2) for an arbitray polynomial via the input fx

result=map(f,interval) 
print(sum(list(result))*(delta**2)) 


continue 

,如果我尝试了fx(x**2)它会产生这样的错误:

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' 

*我充分意识到,这可能是不适合nummerical整合的最佳方案,我建立这个的原因是为了锻炼我的编程技能,同时制作我仍然可以理论上使用的程序。

回答

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函数,我认为这是不那么容易。

0

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