title: Python中的generator对象 date: 2017.09.01 23:56 categories:
- 技术博客 tags:
- 语言特性
- Python
编程语言是技术的一个基点,所以不得不说语言也是挺重要的,虽说背后的原理大同小异,但一般来说程序员都有个主力语言,这个主力语言一般是选出来的。
而语言流不流行、强不强原因有很多,以Python为例,原因之一就是其一些优秀的语言特性,或者说语法上的设计,当然跟解释器是配套的。本文就来说一说Python中的generator即生成器对象。
1.基础理论
我推荐廖雪峰大大的官网,我学JavaScript与Python是直接经过他的官网教程来的,十多年的专业程序员,对这点知识点理解相当透彻。
关于Python中generator的基础理论,直接看这篇:。
JavaScript中的跟Python是完完全全一个路子,因为设计者也是学过来的。
综上,generator,生成器,其实就是在OOP的背景下,对于迭代的场景,封装出的特定对象,里面包裹着迭代过程所需要的信息,比如next()
,可以借鉴下Java中LinkedList
的封装细节,实现手段都是源于技术需求。
2.深入理解
还是看廖雪峰的解释:。
包括Python黄哥的解释:。
同时提供一份PDF文档,英文,我给个下载链接:。
划下PDF中的重点,首先他这个解释其实是最好的,我在看完中文的理解后再看到这个有一种豁然开朗的感觉,因为他里面包括了这几个重点:
- Python中栈帧并不分配在栈内存中(Java中相反),而是在堆中
CPython
解释器遇到yield
关键字时,会主动封装好此时需要返回的generator(PDF中使用dis
模块的接口进行了细节分析)- generator存储的信息包括了局部与全局变量,在栈帧中也保存着堆对象调用需要的指针位置
综上,在会使用generator的前提下,可以理解到底层算法的实现,也能体会到设计的优雅之处。对于我们理解使用代码、算法实现思路都有启发。
3.优点
- 优化了性能 在大量迭代数据时,只需要用中间值的场景
- 简化了写法
yield
关键字从语法层面进行了支持,而generator对象自带的接口也进行了对应的功能拓展 - 体现语言设计的独特、优雅
4.小结
综上,我们对Python中的generator由浅入深,从知道到使用再到理解设计用意。过程的积累是我在乎的。
结尾套用一句俗话:人生苦短,快用Python。