Python整数or多值判断错误,寻求更符合Pythonic规范的实现方案
错误原因说明
你原始代码的逻辑问题出在or运算符的优先级上:model == 3002 or 3003 会被解析为 (model == 3002) or (3003),而非你预期的 model == 3002 or model == 3003。由于非0整数在Python中布尔值为True,所以第一个if判断永远成立,因此永远输出300X。
优化后的Pythonic实现
你的第一种写法用in判断成员关系已经是正确的多值匹配写法,主要问题是存在大量重复代码,我们可以通过配置与逻辑分离的思路优化,完全消除重复,同时方便后续扩展:
import itertools # 提前定义所有型号对应的配置,后续新增型号仅需修改此处 MODEL_CONFIG = { (3002, 3003): { "range_end": 1001, "cycle_pattern": ["C", "C", "A", "A", "B", "B"], "group_name": "300X" }, (4003, 4004): { "range_end": 2001, "cycle_pattern": ["C", "C", "C", "C", "A", "A", "A", "A", "B", "B", "B", "B"], "group_name": "400X" } } model = 4004 cycle_dict = None # 遍历配置匹配对应型号 for model_group, config in MODEL_CONFIG.items(): if model in model_group: print(f"model be {config['group_name']}") # 如果需要打印具体型号,可加下面这行 # print(f"this is a {model}") cycle_dict = { x: z for x, z in zip( range(1, config["range_end"]), itertools.cycle(config["cycle_pattern"]) ) } break else: # 所有分组都没匹配到触发else print("model type not covered") if cycle_dict: print("cycle_dict : ", cycle_dict)
方案优势
- 完全符合DRY原则,没有重复的生成逻辑,代码量大幅减少
- 配置集中管理,后续新增型号不用修改判断逻辑,仅需在
MODEL_CONFIG中添加对应分组和参数即可 - 可读性更强,所有型号的参数规则一目了然
如果你的型号命名规则统一(比如前三位固定为300/400),还可以进一步简化匹配逻辑,无需枚举所有型号:
model_prefix = str(model)[:3] if model_prefix == "300": # 对应300X逻辑 elif model_prefix == "400": # 对应400X逻辑
内容的提问来源于stack exchange,提问作者Windy71
相关产品推荐
相关产品推荐

