Python编程风格与空值规避:条件题函数代码重复问题咨询
嘿,我太懂你这种困扰了——刚啃《How to Think Like a Computer Scientist (Python 3版)》的时候,写条件语句练习题总忍不住堆一堆重复的if-elif,尤其是判断成绩区间这种场景,写完看着就觉得冗余。我当年学这本书时也踩过一模一样的坑!
先猜一下你最初的代码大概是这种典型的重复写法(毕竟新手很容易这么写):
def get_grade(mark): if 90 <= mark <= 100: return 'A' elif 80 <= mark < 90: return 'B' elif 70 <= mark < 80: return 'C' elif 60 <= mark < 70: return 'D' elif 0 <= mark < 60: return 'F' else: return 'Invalid mark'
逻辑是对的,但每个条件都重复写区间上下限,后续要改等级规则(比如加A+、调整及格线)的时候,就得逐个修改,不仅麻烦还容易出错。
这里给你两种实用的优化方案,彻底消除代码重复:
1. 利用条件判断的短路特性简化(最上手)
其实我们可以省略每个条件的下限判断——因为前面的if-elif已经排除了更高区间的情况。比如当程序走到elif mark >=80时,肯定已经不满足mark >=90了,所以完全不用写80<=mark<90这种重复的区间。
优化后的代码是这样的:
def get_grade(mark): # 先做合法性校验,单独抽出来避免重复判断 if not (0 <= mark <= 100): return 'Invalid mark' if mark >= 90: return 'A' elif mark >= 80: return 'B' elif mark >= 70: return 'C' elif mark >= 60: return 'D' else: return 'F'
这样每个条件只保留一个上限判断,去掉了重复的下限比较,代码一下子清爽很多,可读性也更强。
2. 用映射列表存储等级规则(可扩展性拉满)
如果之后需要频繁调整等级体系(比如新增A+、B-这类细分等级),用列表存储区间阈值和对应等级的方式会更灵活,直接把重复的if-elif块替换成一次遍历:
def get_grade(mark): # 把等级规则集中存成列表,按分数从高到低排序 grade_rules = [ (95, 'A+'), (90, 'A'), (85, 'B+'), (80, 'B'), (70, 'C'), (60, 'D'), (0, 'F') ] if not (0 <= mark <= 100): return 'Invalid mark' # 遍历规则列表,匹配第一个符合的等级 for threshold, grade in grade_rules: if mark >= threshold: return grade return 'Invalid mark'
这种方式的好处是,修改等级规则完全不用碰判断逻辑——要加新等级就往列表里插个元组,要调阈值就改数字就行,彻底告别重复代码。而且代码逻辑和规则数据分离,符合Python的最佳实践思路。
另外关于你说的这本书对Python 3最佳实践讲得少的问题,其实可以做完书中练习后,补点PEP8的基础内容(比如函数命名用下划线、缩进统一4空格这些),再结合一些简单的项目练手,慢慢就能积累起规范的编码习惯啦。
内容的提问来源于stack exchange,提问作者valuevillage

