第 3 章 容器类型(2)
朱雷
3.3 编程建议
3.3.1 用按需返回替代容器
在 Python 中,用 range() 内置函数可以获得一个数字序列:
在 Python 2 时代,如果你想用 range() 生成一个非常大的数字序列——比如 0 到 1 亿间的所有数字,速度会非常慢。这是因为 range() 需要组装并返回一个巨大的列表,整个计算与内存分配过程会耗费大量时间。
❶ Python 2 中的 range() 会一次性返回所有数字
但到了 Python 3,调用 range(100000000) 瞬间就会返回结果。因为它不再返回列表,而是返回一个类型为 range 的惰性计算对象。
❶ r 是 range 对象,而非装满数字的列表
❷ 只有在迭代 range 对象时,它才会不断生成新的数字
当序列过大时,新的 range() 函数不再会一次性耗费大量内存和时间,生成一个巨大的列表,而是仅在被迭代时按需返回数字。range() 的进化过程虽然简单,但它其实代表了一种重要的编程思维——按需生成,而不是一次性返回。
在日常编码中,实践这种思维可以有效提升代码的执行效率。Python 里的生成器对象非常适合用来实现“按需生成”。
生成器简介
生成器(generator)是 Python 里的一种特殊的数据类型。顾名思义,它是一个不断给调用方“生成”内容的类型。定义一个生成器,需要用到生成器函数与 yield 关键字。
一个最简单的生成器如下:
执行后输出:
虽然都是返回结果,但 yield 和 return 的最大不同之处在于,return 的返回是一次性的,使用它会直接中断整个函数执行,而 yield 可以逐步给调用方生成结果:
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了Python中容器类型的重要性以及在编程中的应用。从Python 2到Python 3的变化开始,介绍了按需返回的重要性以及生成器的使用方法。通过对生成器和列表的比较,阐述了生成器在处理大量数据时的优势。此外,文章还强调了了解容器的底层实现对于编写高效代码的重要性。通过避开列表的性能陷阱,读者可以更好地理解容器类型的使用和底层实现,从而编写更高效的代码。文章还提到了使用集合和字典进行成员存在性判断的优势,以及如何快速合并字典的方法。此外,还介绍了使用有序字典进行去重和避免在遍历列表时同步修改的技巧。最后,强调了编写推导式时避免过于复杂和不要将推导式当作代码量更少的循环。总的来说,本文内容深入浅出,适合读者快速了解Python容器类型的特点和使用方法。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Python 工匠:案例、技巧与工程实践》
《Python 工匠:案例、技巧与工程实践》
立即购买
登录 后留言
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论