【问题标题】:Implicit functions, looking to perform different math functions based on a key隐式函数,希望根据一个键执行不同的数学函数
【发布时间】:2014-03-08 16:03:43
【问题描述】:

标题有点奇怪,但我想不出更好的表达方式。我正在开发 3D 软件的插件。它将数据存储在称为“通道”的东西中,我正在开发的插件是基于一些数学关系同步不同的“通道”。基本上是这样的:

如果用户更新频道“质量”,我想根据公式更新“光线”和“比率”。如果他们更新“光线”或“比率”,我只想更新“质量”。我需要更新一大堆不同的东西,不仅仅是这些,但为了......好吧,简单,我会保持简单。

目前我有一个字典,其中列出了要为每个获得更新的频道键更新的频道列表,如下所示:

channel_relationships = {
"quality": ["rays", "ratio"],
"rays":    ["quality"],
"ratio":   ["quality"]
}

这对于找出正在发生的变化非常有效。我的代码收到一个发送给它的值,以通知它用户更改了哪个频道,所以我只需使用字典中的右键访问正确的列表:

channels_to_update = channel_relationships[incoming_channel]
for channel in channels_to_update:
     UpdateChannel(channel)

这一切都很好,花花公子。但棘手的是,所有不同的通道使用一些相当长的数学表达式以不同的方式相互影响。目前我正在通过我的 UpdateChannel 函数中的一堆 if/elif 语句来解决这个问题,如下所示:

def UpdateChannel(channel):
    if channel == "rays":
        pass #do math here
    elif channel == "ratio":
        pass #do other math...
    elif channel == "quality"
        pass #do other math...

这不是很优雅。理想情况下,我希望将函数本身以隐式方式存储在字典中,如下所示:

functions = {"quality": {"rays": 0.5*x**2+3.2*x+2, 
                         "ratio": 7.3*x**2+1.2*x-5}}

基本上将函数本身直接存储在字典中。请注意,我不想真正计算字典中的所有值。我希望他们只根据需要进行评估。因此,当我访问函数["quality"]["rays"] 时,我想获取隐式函数或基于“x”计算的值。类似的东西。问题是,我不知道这在 Python 中是否可能,也不知道从哪里开始寻找这样的东西。我可以为每个关系明确定义我的函数,但我最终会得到很多函数。因为所有函数实际上只是基于输入浮点值的单个浮点值,所以这似乎是最优雅的方式。

【问题讨论】:

    标签: python function dictionary


    【解决方案1】:

    函数是一等对象,你可以将它们存储在字典中,检索它们,然后调用它们,没问题。

    lambda 将从单个表达式生成一个函数:

    functions = {
        "quality": {
            "rays": lambda x: 0.5*x**2+3.2*x+2, 
            "ratio": lambda x: 7.3*x**2+1.2*x-5
        }
    }
    

    现在查找您的函数并调用它们:

    functions['quality']['rays'](input_float_value)
    

    是的,就是这么简单。 :-)

    【讨论】:

    • defined 函数也是对象,如果 lambda 变长,则可以按名称传递
    猜你喜欢
    • 1970-01-01
    • 2020-05-05
    • 2021-12-18
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 2016-03-08
    相关资源
    最近更新 更多