You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:35:03