使用Lambda从输入获取功能

时间:2019-02-01 11:29:34

标签: python-3.x lambda

我正在尝试在python中进行数字积分,并想制作一个状态机,在其中向用户询问方法,函数,范围和间隔。但是我似乎无法正常工作,只是不断要求我输入另一个功能。

我是新手程序员,所以我只尝试了下面显示的代码。

def venstre_sum(start,end,inv,func):
    return sum([((end-start)/inv)*func(((end-start)/inv)*i+start) for i in range(inv)])

def hoejre_sum(start,end,inv,func):
    return sum([((end-start)/inv)*func(((end-start)/inv)+((end-start)/inv)*i+start) for i in range(inv)])

def trapez(start,end,inv,func):
    returnv  = (venstre_sum(start,end,inv,func)+hoejre_sum(start,end,inv,func))/2
    return returnv

def midtsum(start,end,inv,func):
    return sum([((end-start)/inv)*func(((end-start)/inv)*(i+0.5)+start) for i in range(inv)])


while True:

    state = input("Which method would you like to use? (v,h,t,m,s)")
    f = lambda x: eval(input("Funktion:"))
    ranges1 = int(input("Give a x0:"))
    ranges2 = int(input("Give a xn:"))
    inv = int(input("Amount of intervals:"))
    h = (ranges2-ranges1)/inv

    if state == "v":
        print("###########VENSTRESUMS-AREAL:")
        print(inv,"intervaller",f.__name__,"(x) A=",venstre_sum(ranges1,ranges2,inv,f))

我希望它在功能下打印我的区域,但是它一直在问我另一个功能。抱歉,我不知道如何粘贴我的代码。 :/

1 个答案:

答案 0 :(得分:0)

此:

f = lambda x: eval(input("Funktion:"))

完全等于

def f(x):
    return eval(input("Funktion:"))

然后,您将f传递给venstre_sum,后者将调用f,该input("Funktion")执行eval(),并将结果传递给eval()并返回结果。

IOW,这是预期的行为-即使您不是预期的行为;-)

这里的第一点:请勿使用def area(x): return x * x def spam(x): return x * "spam" # etc FUNCTIONS = { "area": area, "spam": spam, # ... } # and then: funcname = input("Funktion:") f = FUNCTIONS[funcname] ,尤其不要在用户输入上使用(除非您当然希望第一个脚本小子来控制您的程序)。

现在,您没有发布任何关于有人应该键入“功能”的内容的信息,但是如果它是现有功能的名称,则解决方案非常简单,并且是一种非常常见的模式:构建允许功能的字典并从中获取功能,即:

const struct userData const*