编写无列表推导式的向量内积函数及现有代码合规性咨询
无列表推导式实现向量内积的思路及代码优化
一、不用列表推导式的实现思路
- 循环累加:初始化结果变量为0,遍历两个列表的对应元素,逐个相乘后累加到结果中,最终返回总和。
- 结合
zip与生成器表达式:用zip将两个列表的对应元素配对,通过生成器表达式计算每对元素的乘积,再用sum直接求和(生成器不会创建临时列表,内存更高效)。 - 使用
map函数:用map结合匿名函数,对zip后的元素对执行乘法操作,再用sum汇总结果。
二、你的代码是否使用了列表推导式?
是的,代码里的[vec1[n]*vec2[n] for n in range(len(vec1))]属于列表推导式——它用方括号包裹,会生成一个临时列表存储所有乘积结果,再传给sum计算总和。
三、替代列表推导式的方法
1. 生成器表达式(推荐)
把列表推导式的方括号改成圆括号,避免创建临时列表,提升内存效率:
def inner_product(vec1, vec2): if len(vec1) == len(vec2) and len(vec1) != 0: return sum(vec1[n] * vec2[n] for n in range(len(vec1))) else: return 0
2. 手动循环累加
完全通过遍历实现,无推导式或高阶函数依赖:
def inner_product(vec1, vec2): if len(vec1) != len(vec2) or len(vec1) == 0: return 0 result = 0 for num1, num2 in zip(vec1, vec2): result += num1 * num2 return result
3. 结合map与zip
用map处理元素对的乘法,再求和:
def inner_product(vec1, vec2): if len(vec1) == len(vec2) and len(vec1) != 0: return sum(map(lambda x, y: x * y, vec1, vec2)) else: return 0
补充说明
如果两个列表长度不一致,你的代码返回0是合理的,但也可以根据需求抛出异常(比如raise ValueError("向量长度必须一致")),让错误更明确。
内容的提问来源于stack exchange,提问作者Husam
相关产品推荐
相关产品推荐

