当前位置: 首页 > news >正文

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。

相关文章:

  • 数据结构C++ 队列——队列的应用
  • PS注意
  • 提升工作效率的方法
  • 基于Redis实现分布式锁,避免重复执行定时任务
  • 一篇文章告诉你React里为什么不能用index作为key
  • 阿武老师百搭傲娇句式
  • LaTeX模板(二)
  • java可重入锁(ReentrantLock)的实现原理
  • React Native声明属性和属性确认
  • JavaScript深入之词法作用域和动态作用域
  • 竞赛回忆录
  • 简单团队-爬取豆瓣电影TOP250-需求分析
  • JS实现简单的MVC模式开发小游戏
  • 虚拟就Ubuntu 14.0.4 安装配置jenkins
  • 大数据学习(2)HDFS文件管理
  • 【技术性】Search知识
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • android图片蒙层
  • Laravel 实践之路: 数据库迁移与数据填充
  • PermissionScope Swift4 兼容问题
  • php的插入排序,通过双层for循环
  • Sass 快速入门教程
  • swift基础之_对象 实例方法 对象方法。
  • Travix是如何部署应用程序到Kubernetes上的
  • TypeScript实现数据结构(一)栈,队列,链表
  • Vue 动态创建 component
  • 搞机器学习要哪些技能
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 浅谈Golang中select的用法
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 网页视频流m3u8/ts视频下载
  • 一道闭包题引发的思考
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 一些css基础学习笔记
  • 译有关态射的一切
  • 与 ConTeXt MkIV 官方文档的接驳
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • Spring第一个helloWorld
  • #pragma once与条件编译
  • (20050108)又读《平凡的世界》
  • (4)(4.6) Triducer
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (WSI分类)WSI分类文献小综述 2024
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (三)模仿学习-Action数据的模仿
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (译) 函数式 JS #1:简介
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .Family_物联网
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter