首页 > 解决方案 > 使用 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))

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

标签: python-3.xlambda

解决方案


这个:

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

是完全等价的

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

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

IOW 这是预期的行为——即使不是你所期望的 ;-)

这里的第一点:不要使用eval(),特别是不要在用户输入上使用(除非你当然希望第一个脚本小子控制你的程序)。

现在你没有发布任何关于某人应该输入什么作为“函数”的内容,但如果它是现有函数的名称,则解决方案非常简单并且是一种非常常见的模式:构建允许函数的字典并获取函数由此,即:

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]

推荐阅读