news 2026/10/5 1:55:47

30 seconds of code Python 技巧:用 `range()` 与列表推导式求解幂和(Sum of Powers)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
30 seconds of code Python 技巧:用 `range()` 与列表推导式求解幂和(Sum of Powers)
  • 教程
  • 文档

【免费下载链接】30-seconds-of-code

Coding articles to level up your development skills

项目地址:https://gitcode.com/gh_mirrors/30/30-seconds-of-code
点击查看免费下载

导读

本文讲解 30 seconds of code 仓库中 Python 数学片段sum_of_powers的实现原理与用法:如何借助range()与列表推导式生成指定闭区间内所有整数的幂,再用sum()一次性求和。读完本文,你将掌握该函数的参数语义、边界行为与运行示例,并理解列表推导式 +range()这一组合在数值序列生成中的通用价值。对应源码片段位于 sum-of-powers.md,归类于 Python Math 集合。

核心实现:一行代码完成幂和计算

片段的核心逻辑非常紧凑,全部体现在一个函数中:

def sum_of_powers(end, power = 2, start = 1): return sum([(i) ** power for i in range(start, end + 1)]) sum_of_powers(10) # 385 sum_of_powers(10, 3) # 3025 sum_of_powers(10, 3, 5) # 2925

该函数计算从start到end(两端均包含)的所有整数的power次幂之和,数学上等价于:

sum_of_powers(end, power, start) = Σ (i ** power), i ∈ [start, end]

其内部流程分三步:

  1. range(start, end + 1)生成闭区间[start, end]的整数序列。由于range()的右端点不包含,因此传入end + 1来保证end本身被纳入求和范围;
  2. 列表推导式[(i) ** power for i in ...]对序列中每个元素执行幂运算** power,得到一个新的幂值列表;
  3. sum()将列表中的全部幂值累加,返回最终结果。

参数语义与默认值

参数含义默认值说明
end区间右端点(含)必填range(start, end + 1)的终止值
power幂指数2默认计算平方和,即平方数之和
start区间左端点(含)1默认从 1 开始

三个示例分别验证了三种典型用法:

  • sum_of_powers(10):计算1² + 2² + … + 10² = 385(利用默认的power=2, start=1);
  • sum_of_powers(10, 3):计算1³ + 2³ + … + 10³ = 3025,即前 10 个自然数的立方和;
  • sum_of_powers(10, 3, 5):计算5³ + 6³ + … + 10³ = 2925,验证了自定义起始点对求和区间的影响。

边界行为与注意事项

  • 闭区间语义:end与start均包含在内,这是由end + 1的写法保证的。这一点与range()默认的“左闭右开”语义不同,是容易出错的地方;
  • start大于end时:range(start, end + 1)生成空序列,列表推导式结果为空列表,sum()返回0,不会抛错;
  • 负数与零:range()支持负数与零,因此可计算包含0或负数的区间;0 ** power在power > 0时为0,不影响结果;
  • 性能取舍:该实现先构造完整幂值列表再求和,中间列表会占用内存。对于超大规模区间,可改用生成器表达式sum(i ** power for i in range(start, end + 1))以惰性求值、减少内存占用;片段选择列表推导式则是为了简洁直观,符合“30 秒读懂”的风格。

在仓库语境中的定位:range()+ 列表推导式的通用模式

sum_of_powers并非孤立片段,它体现了 30 seconds of code Python 集合中反复出现的“range()生成区间 + 列表推导式变换”的通用数值序列模式。仓库中同类思想的其他片段包括:

  • initialize-list-with-range-value-daterange.md:同样使用列表推导式与range()生成指定区间、指定步长的数值列表,并讨论闭区间(end + 1)与开区间写法的区别,可与本文互相印证;
  • code-anatomy-performant-python.md:分析了列表推导式相对filter()+list()组合的性能优势,指出列表推导式是接近原生for循环的写法,几乎没有额外函数调用开销,这也解释了本片段优先采用列表推导式的原因。

从仓库的模型定义看,该片段属于Snippet内容模型(见 src/models/snippet.js),其元数据(tags: [math]、language: python、cover: river-flow)由 snippet-template.md 规定的 frontmatter 结构描述;math标签会将其归入 content/collections/python/math.yaml 所定义的 Python Math 集合。

延伸练习:将片段泛化与复用

理解核心实现后,可以基于同一思路做小幅扩展,例如:

# 改用生成器表达式,适合大区间、节省内存 def sum_of_powers_lazy(end, power = 2, start = 1): return sum(i ** power for i in range(start, end + 1)) # 指定步长(如只求偶数幂和) def sum_of_powers_step(end, power = 2, start = 1, step = 1): return sum(i ** power for i in range(start, end + 1, step))

这些变体保持了原有闭区间语义与默认参数习惯,可直接替换或作为学习range()步长参数的练习。全部示例均可在本地 Python 3.6+ 环境中直接运行验证(仓库 Python Math 集合 即注明面向 Python 3.6)。

  • 教程
  • 文档

【免费下载链接】30-seconds-of-code

Coding articles to level up your development skills

项目地址:https://gitcode.com/gh_mirrors/30/30-seconds-of-code
点击查看免费下载
上一篇:解决日志轮转痛点:Bunyan钩子函数实现日志预处理全攻略
下一篇:Bunyan与GitLab CI集成:自动化测试与日志分析

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/5 1:51:12

Himalaya 打包规范解析:从 Cargo 特性门控到发布产物的工程实践

CLI 【免费下载链接】himalaya CLI to manage emails 项目地址: https://gitcode.com/gh_mirrors/hi/himalaya 点击查看 免费下载 Himalaya(CLI to manage emails)作为 Pimalaya 技术栈顶层的应用层,其打包策略决定了二进制产物的…

作者头像 李华
网站建设 2026/10/5 1:50:32

如何实现Nano ID可观测性:日志与指标集成的完整指南

如何实现Nano ID可观测性:日志与指标集成的完整指南 【免费下载链接】nanoid A tiny (118 bytes), secure, URL-friendly, unique string ID generator for JavaScript 项目地址: https://gitcode.com/GitHub_Trending/na/nanoid Nano ID作为一款轻量级&…

作者头像 李华
网站建设 2026/10/5 1:37:56

MobileViG实战:轻量图神经网络图像分类从训练到部署

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华