Python的if语句中存在多个and连接的条件是否属于糟糕代码?
结论先行
你写的这段代码功能完全正确,做算法题这类一次性交付的代码时,这种写法是高效实用的,算不上质量差。但如果是需要长期维护、后续还有迭代需求的代码,这种长条件拼接的写法确实有可优化的空间。
现有写法的优劣势
- 优势:逻辑直白无额外封装,写起来速度快,运行时没有额外开销,对于固定的判断场景完全够用。
- 劣势:
- 可维护性低:如果后续需要新增/删除校验字段、修改判断规则,要在长串的
and条件里修改,很容易出现漏改、拼写错误的问题。 - 可读性弱:多个条件挤在同一行,很难快速扫全所有必填的校验项。
- 可维护性低:如果后续需要新增/删除校验字段、修改判断规则,要在长串的
更易维护的改写方案
你可以把必填字段抽成独立的常量集合,用Python内置的all()语法或者集合子集判断来简化逻辑,改写后代码如下:
# 提前定义所有必填字段,后续修改规则只要改这个列表/集合即可 REQUIRED_FIELDS = {"byr", "iyr", "eyr", "hgt", "hcl", "ecl", "pid"} def check_for_valid_passports(inp): num_of_valid_passports = 0 for x in inp: # 替换原来的长串and条件 if all(field in x for field in REQUIRED_FIELDS): num_of_valid_passports += 1 return num_of_valid_passports
如果你的输入项x是字典结构,还可以用集合的子集判断进一步简化:
if REQUIRED_FIELDS.issubset(x.keys()):
写法选择的判断标准
- 如果是写算法题、临时脚本这类用完即弃的代码,你原来的写法没有任何问题,不需要额外修改。
- 如果是业务代码、或者后续还要拓展校验逻辑(比如这道题的第二问还要校验每个字段的格式是否合法),建议用抽离规则常量的写法,后续拓展成本会低很多。
内容的提问来源于stack exchange,提问作者vašek černohorskej
相关产品推荐
相关产品推荐

