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

如何用列表推导式替代循环中的extend?将Python求约数代码改为一行

当然可以,这里给你两种用列表推导式(结合或不结合itertools.chain)的改写方式,都能把原逻辑压缩成一行函数体:

方式1:嵌套列表推导式

from math import sqrt

def divisors(n):
    return list(set(item for div in range(1, int(sqrt(n)) + 1) if n % div == 0 for item in [div, n // div]))

这里用双层循环的列表推导式替代extend:外层遍历可能的约数div并判断整除条件,内层遍历[div, n//div]把两个元素逐个生成,最后通过集合去重再转回列表,和原逻辑完全一致。

方式2:结合itertools.chain

from math import sqrt
from itertools import chain

def divisors(n):
    return list(set(chain.from_iterable([div, n//div] for div in range(1, int(sqrt(n)) + 1) if n % div == 0)))

这种方式用chain.from_iterable把每个符合条件的[div, n//div]小列表拼接成一个连续的迭代器,再去重转列表,和你尝试的思路匹配。

另外建议把原代码里的n / div改成n // div,确保得到整数类型的约数,避免出现浮点数(比如当n是完全平方数时,虽然集合去重不受影响,但整数更符合约数的定义)。

内容的提问来源于stack exchange,提问作者Ashtart

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 06:45:13