如何避免大量嵌套的ifelifelse条件语句来评估许多情况下的快速响应?

2024-06-16 11:04:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在从事一个机电一体化项目,在这个项目中,我从多个来源获取电流(安培)数据,并且必须根据内部和之间的变化趋势(增加/减少值和增加/减少相对差异)计算响应(反馈给机械系统)。有许多要访问的条件(对每个条件的唯一或混合响应)和许多它们依赖的变量,因此我留下了许多嵌套的if-elif-else语句,每个语句都评估多个条件和标志,因此在数据快速流动(高达85 Hz)时需要时间来响应。你知道吗

该模块是更大项目的一部分,只需要使用Python来完成。我现在的代码是这样的-

def function(args):
    if flag1 and flag2 and condition1 and not condition2:
        if condition3 and not flag3:
            response += var1
            flag4 = True
        elif -- :
            response = var2
            flag3 = False
        elif -- :
            ------------
        else :
            ------------
     if not flag_n and flag_m and condition_p and condition_q and not condition_r:
        if.. elif ... else :
            flags... response changes..
     more IFs

我需要的是一个更好的和有效的方法来做这件事或一个完全不同的方法,例如一些机器学习或深入学习算法或适合上述使用的框架。你知道吗


Tags: and数据项目方法ifresponsenot语句
2条回答

从你的问题,我不明白你的问题是,如果else语句越来越大,随着时间的推移越来越混乱,或他们是计算密集型。你知道吗

无论哪种情况,任何类型的机器学习或深度学习框架都可能比你的if-else要慢得多,而且更令人困惑,因为很难知道为什么人工智能深度学习算法会做什么。如果你的机器人翻了怎么办?你永远不会知道为什么。但是,你可以追踪其他语句。。。我强烈建议不要走人工智能路线,如果你的if-else树不是。。。3000-5000行长,他们每天不断更换100-200行,或者类似的。你知道吗

软件开发人员通常尝试遵循良好的设计原则,以避免陷入这种情况,但是,如果更改体系结构为时已晚,What is the best way to replace or substitute if..else if..else trees in programs?(多态性)可以帮助您。你知道吗

也就是说,我做过很多传感器/数学重的项目,它们的发展总是一样的:项目开始时很好很慢,然后是很好的改进,最后是最后期限,最后你会得到一个if else意大利面。总是一样的。至少对我来说。所以,我现在所做的是,每当我有一个改进的时候,我都会尝试将它添加到源代码中,这样一般的架构就不会过时。你知道吗

处理这个问题的另一种方法是编写流程图,如在Matlab的Simulink中,并明确显示您对项目如何工作/如何实际实现等的总体想法

你可以用二进制,也许:

flag_bits = {flag1: 0b0000000001, 
             flag2: 0b0000000010, 
             flag3: 0b0000000100, 
             flag4: 0b0000001000, 
             condition1: 0b0000010000,
             condition2: 0b0000100000,
             ...}

然后,当您接收到标志和条件时,按位计算它们,并有一个结果字典或基于它计算结果的方法:

def add_response(response, add_value):
    return response += add_value

def subtract_response(response, subtract_value):
    return response -= subtract_value

response_actions = {0b0000110011: ('add', var1, 0b0000001000), ...}
response_methods = {'add': add_response, 'sub': subtract_response, ...}

response_action = response_actions[0b0000110011]
response_method = response_action[0]
response = response_method(response, respnose_action[1])
flag_bits = response_action[2]

显然,这并不完全完美,但它将消除大量的if,并将操作转换为查找,希望能节省时间。你知道吗

相关问题 更多 >