Python 3:如何更简洁优化含for循环的函数?以完全数为例
简洁实现完全数判断的Python技巧 & 通用精简代码方法
嘿,很高兴你在追求代码的简洁优雅!完全数的判断确实有不少更Pythonic的写法,我来给你分享几种,顺便聊聊能帮你拓展函数储备的通用精简技巧~
一、完全数判断的简洁实现
1. 生成器表达式 + 数学优化(推荐)
利用约数成对出现的特性,只遍历到sqrt(n)就能找到所有约数,结合生成器表达式直接求和,代码简洁还高效:
import math def is_perfect(n): # 成对计算约数和,最后减去自身(因为遍历中包含了n这个约数) return n == sum(i + n//i for i in range(1, int(math.sqrt(n)) + 1) if n % i == 0) - n
解释:比如n=6时,遍历i=1和2:i=1时n//i=6,i=2时n//i=3,求和得1+6+2+3=12,减去n=6后得到6,刚好等于原数,符合完全数定义。
2. 函数式风格(filter + sum)
如果喜欢函数式编程的写法,可以用filter筛选约数再处理:
import math def is_perfect(n): # 筛选出所有能整除n的数(到sqrt(n)) divisors = filter(lambda x: n % x == 0, range(1, int(math.sqrt(n)) + 1)) # 计算成对约数和并减去自身 total = sum(x + n//x for x in divisors) - n return total == n
3. 一行式写法(极致简洁)
如果逻辑简单,也可以用匿名函数写成一行,适合快速测试:
import math is_perfect = lambda n: n == sum(i + n//i for i in range(1, int(math.sqrt(n))+1) if n % i == 0) - n
注意:一行式可读性稍弱,复杂场景还是推荐用普通函数,便于添加注释和维护。
二、拓展精简代码的通用方法
除了完全数的特定写法,这些通用技巧能帮你写出更简洁的Python代码:
- 善用生成器/列表推导式:替代冗余的for循环累加、筛选逻辑。比如
sum(x for x in nums if x > 0)比先初始化total=0再循环判断高效又简洁。 - 活用内置函数:
sum()、filter()、map()、any()、all()这些内置函数能帮你把循环逻辑压缩成一行。比如判断质数可以用all(n % i != 0 for i in range(2, int(math.sqrt(n))+1))。 - 数学逻辑优化:像完全数这里利用约数成对的特性减少循环次数,不仅代码更短,运行效率也更高——这是“逻辑上的精简”,比单纯写法精简更有价值。
- 合理使用匿名函数lambda:适合简单的单逻辑函数,但不要滥用,复杂逻辑用
def定义更易读。 - 迭代器工具库itertools:比如
itertools.chain()合并多个迭代对象、itertools.compress()筛选元素,能大幅减少循环代码量。
最后提醒:简洁的前提是可读性,不要为了短而写晦涩的代码,必要时添加注释才是专业的做法~
内容的提问来源于stack exchange,提问作者user8872
相关产品推荐
相关产品推荐

