实现返回不大于n的数的几何平均值的函数及对应Python代码分析
几何平均值函数代码分析
需求说明:编写可返回不大于n的所有数的几何平均值的函数
待分析的现有代码:def geometric_mean(n): x = [] b = list(range(n)) for i in b: p = (i*i)**2 x.append(p) return x
首先明确不大于n的正整数几何平均值的计算规则:对1、2、…、n共n个正整数,先计算所有数的乘积,再对乘积开n次方得到结果;如果包含0的话乘积直接为0,无实际统计意义,因此这类需求默认统计范围为1到n的正整数。
现有代码的核心问题
- 返回值类型完全不符合要求:需求需要返回的是一个浮点型的平均值结果,现有代码返回的是列表类型,输出完全不匹配需求。
- 遍历范围错误:
range(n)生成的是0到n-1的整数序列,既漏掉了不大于n的最大数n本身,又引入了无统计意义的0,范围完全不符合要求。 - 计算逻辑完全偏离需求:代码中对每个遍历值i计算的是
(i*i)**2也就是i的四次方,和几何平均值要求的「所有数连乘后开方」逻辑没有任何关联。 - 循环提前终止:
return x语句写在for循环的内部,第一次循环执行完成就会直接终止函数返回结果,根本不会遍历完所有数值,最终返回的列表只会包含i=0时的计算结果0。 - 无输入合法性校验:没有对输入参数n做类型、取值范围校验,输入n为0、负数、非整数时会直接返回错误结果或触发运行异常。
参考正确实现
import math def geometric_mean(n): # 输入合法性校验 if not isinstance(n, int) or n < 1: raise ValueError("参数n必须为不小于1的正整数") # 采用对数求和再取指数的方式计算,避免n较大时乘积溢出、计算效率低的问题 log_total = sum(math.log(num) for num in range(1, n + 1)) return math.exp(log_total / n)
内容的提问来源于stack exchange,提问作者Calvin
相关产品推荐
相关产品推荐

