如何简化从p11到p55的长elif判断链?并求反向操作讲解
简化多条件判断与反向逻辑实现
一、正向逻辑:简化elif判断链
原来的代码需要逐个判断p11到p55是否为"+",匹配后赋值对应的loc。可以通过遍历变量规则来简化,不用写几十个elif:
方法1:利用变量名动态查找(适合快速改造)
通过循环生成目标变量名,从局部/全局作用域中获取变量值进行判断:
loc = None # 遍历1-5行、1-5列,生成pXX格式的变量名 for row in range(1, 6): for col in range(1, 6): var_name = f"p{row}{col}" # 从局部作用域取变量,全局变量则替换为globals() if locals().get(var_name) == "+": loc = row * 10 + col break if loc is not None: break
找到第一个匹配的"+"后立即停止循环,和原elif逻辑完全一致。
方法2:使用字典管理变量(推荐,更易维护)
把所有pXX变量存入字典,直接遍历键值对,代码可读性和可维护性更高:
# 先将变量整理到字典中 p_vars = { "p11": p11, "p12": p12, "p13": p13, "p14": p14, "p15": p15, "p21": p21, "p22": p22, "p23": p23, "p24": p24, "p25": p25, "p31": p31, "p32": p32, "p33": p33, "p34": p34, "p35": p35, "p41": p41, "p42": p42, "p43": p43, "p44": p44, "p45": p45, "p51": p51, "p52": p52, "p53": p53, "p54": p54, "p55": p55, } loc = None for var_name, value in p_vars.items(): if value == "+": loc = int(var_name[1:]) # 提取变量名后两位转为数字 break
这种方式避免了动态查找作用域变量,后续调整变量范围只需修改字典即可。
二、反向逻辑:根据loc设置对应变量
反向操作即已知loc的值,将对应的pXX变量设为"+",同样有两种实现方式:
方法1:动态修改变量
# 假设loc为已知值,比如23 row = loc // 10 col = loc % 10 var_name = f"p{row}{col}" # 修改局部变量用locals(),全局变量用globals() locals()[var_name] = "+"
方法2:通过字典修改(推荐)
如果用字典管理变量,直接操作字典更安全可控:
# 假设loc=45 target_var = f"p{loc//10}{loc%10}" p_vars[target_var] = "+" # 若需要同步到原独立变量,可补充赋值:p45 = p_vars["p45"]
内容的提问来源于stack exchange,提问作者w1ndnd
相关产品推荐
相关产品推荐

