Python中的generator对象

title: Python中的generator对象 date: 2017.09.01 23:56 categories:

  • 技术博客 tags:
  • 语言特性
  • Python

编程语言是技术的一个基点,所以不得不说语言也是挺重要的,虽说背后的原理大同小异,但一般来说程序员都有个主力语言,这个主力语言一般是选出来的。

而语言流不流行、强不强原因有很多,以Python为例,原因之一就是其一些优秀的语言特性,或者说语法上的设计,当然跟解释器是配套的。本文就来说一说Python中的generator即生成器对象。

1.基础理论

我推荐廖雪峰大大的官网,我学JavaScript与Python是直接经过他的官网教程来的,十多年的专业程序员,对这点知识点理解相当透彻。

关于Python中generator的基础理论,直接看这篇:生成器。

JavaScript中的generator跟Python是完完全全一个路子,因为设计者也是学过来的。

综上,generator,生成器,其实就是在OOP的背景下,对于迭代的场景,封装出的特定对象,里面包裹着迭代过程所需要的信息,比如next(),可以借鉴下Java中LinkedList的封装细节,实现手段都是源于技术需求。

2.深入理解

还是看廖雪峰的解释:Python yield 使用浅析。

包括Python黄哥的解释:黄哥漫谈Python 生成器。

同时提供一份PDF文档,英文,我给个下载链接:The Magic Behind Python Generator Functions - Hacker Noon。

划下PDF中的重点,首先他这个解释其实是最好的,我在看完中文的理解后再看到这个有一种豁然开朗的感觉,因为他里面包括了这几个重点:

  • Python中栈帧并不分配在栈内存中(Java中相反),而是在堆中
  • CPython解释器遇到yield关键字时,会主动封装好此时需要返回的generator(PDF中使用dis模块的接口进行了细节分析)
  • generator存储的信息包括了局部与全局变量,在栈帧中也保存着堆对象调用需要的指针位置

综上,在会使用generator的前提下,可以理解到底层算法的实现,也能体会到设计的优雅之处。对于我们理解使用代码、算法实现思路都有启发。

3.优点

  • 优化了性能 在大量迭代数据时,只需要用中间值的场景
  • 简化了写法 yield关键字从语法层面进行了支持,而generator对象自带的接口也进行了对应的功能拓展
  • 体现语言设计的独特、优雅

4.小结

综上,我们对Python中的generator由浅入深,从知道到使用再到理解设计用意。过程的积累是我在乎的。

结尾套用一句俗话:人生苦短,快用Python。

你可能感兴趣的:(Python中的generator对象)