python代码自动生成器原理 python 生成器原理

news2024/11/17 15:59:38

python生成器原理剖析

函数的调用满足“后进先出”的原则,也就是说,最后被调用的函数应该第一个返回,函数的递归调用就是一个经典的例子。显然,内存中以“后进先出”"方式处理数据的栈段是最适合用于实现函数调用的载体,在编译型程序语言中,函数被调用后,函数的参数,返回地址,寄存器值等数据会被压入栈,待函数体执行完毕,将上述数据弹出栈。这也意味着,一个被调用的函数一旦执行完毕,它的生命周期就结束了。

在python这样的解释型语言中,函数的调用也是依赖栈的。之前说过,pvthon的标准解释器是用C写的。解释器用-个叫做PyEval EvalFrameEx的C函数来执行python程序。对于一个python中的函数,解释器接受一个python的栈帧对象,并在这个栈帧的上下文中执行python字节码。

我们来看看这样一个例子:

我们用dis模块可以查看python程序的字节码,下面是函数f00()的字节码:

fo0函数将bar加载到栈中并调用它,然后从栈中弹出返回值,最后加载并返回None,当PyEval EvalFrameEx遇到CALL FUNCTION字节码的时候,它会创建一个新的python栈帧,然后用这个新的帧作为参数递归调用PyEval EValFrameEx来执行bar。不过有一点要注意的是,python解释器是个普通的C程序,所以它的堆栈帧就是普通的堆栈。但是它操作的pvthon堆栈帧是分配在堆上的,所以pvthon的栈帧可以在它的调用之外存活。而且可以显式的保存下来。

这是python生成器的技术基础,下面是一个生成器:

返回的结果是:

调用gen()产生的所有生成器都指向同一个代码对象,但是每个都有自己的堆栈帧。这个堆栈帧并不存在于实际的堆栈上,它在堆内存上等待着被使用。

堆栈帧有个"last instruction”指针,指向最近执行的那条指令。刚开始的时候last instruction指针是-1意味着生成器尚未开始,这就是为什么上面的例子中有next(a)这行代码。生成器可以在任何时候被任何函数恢复执行,因为它的栈帧实际上不在栈上而是在堆上。生成器在调用调用层次结构中的位置不是固定的,也不需要遵循常规函数执行时遵循的先进后出顺序。因为这些特性,生成器不仅能用于生成可迭代对象,还可以用于实现多任务协作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1656029.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TMS320F28335学习笔记-时钟系统

第一次使用38225使用了普中的clocksystem例程进行编译,总是编译失败。 问题一:提示找不到文件 因为工程的头文件路径没有包含,下图的路径需要添加自己电脑的路径。 问题二 找不到库文件 例程种的header文件夹和common文件夹不知道从何而来…

Windows下,基于Gradle用Docker发布自己的程序

方案1: windows下打包程序,然后,上传到linux下,生成docker镜像,然后执行。 首先: 由于是采用Gradle管理的项目,打包的时候需要执行build任务。执行完成后,再build\libs目录下应该…

Unity Editor 找物体助手

找啊找朋友~ 🍱功能介绍🥙使用方法 🍱功能介绍 💡输入相关字符串,它会帮你找到名称中带有该字符串的所有物体,还会找包含该字符串的Text、TextMeshProUGUI。 🥙使用方法 💡导入插…

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第17课-跳转用户主页

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第17课-跳转用户主页 使用dtns.network德塔世界(开源的智体世界引擎),策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎…

45天拿下HCIE!誉天云计算 HCIE 3.0 最新通关攻略来啦!

大家好,我是誉天云计算的黄同学。历经4个半月,我成功拿下了自己的云计算HCIE证书。 从学习到备考,再到通过考试拿下证书,这整个过程中我看到了很多,也学到了很多,技术知识和思维能力都受益匪浅。以下是我在…

人工智能_大模型050_模型微调010_模型数据_模型WEB界面代码记录---人工智能工作笔记0185

上面我们把chatglm3的训练代码,和llama2的训练代码,都记录了,然后,再就是: web_demo的代码我们记录一下,然后,我们就继续说下面的内容.至于data目录中的内容,都是一些训练数据,我会 放到资源中,提供下载,这里就不贴出来了,太大了. E:\2024\人工智能\fine-tuning-lab\fine-tun…

RAC GCS_SERVER_PROCESSES参数

参考文档: GCS_SERVER_PROCESSES (oracle.com) 在awr报告中,看到addm建议如下: 其中有Global Cache Messaging和 Global Cache Congestion Activity During the Analysis Period ----------------------------------- Total database tim…

一键接入电商API数据接口1688API通过商品ID、URL采集商品详情页实时数据API接入指南

要一键接入1688电商API数据接口,并通过商品ID或URL采集商品详情页的实时数据,您可以按照以下步骤操作: 注册账号:您需要注册API账号获取必要的API凭证,如Api Key和Api Secret。选择API:根据您的需求&#…

C++学习笔记——对仿函数的理解

文章目录 思维导图仿函数出现的逻辑仿函数使用上的巧妙 仿函数的本质仿函数的优势仿函数语法的巧妙 思维导图 仿函数出现的逻辑 我们在学习stack时会遇到一些新的问题,这些问题需要我们使用非类型模板参数去解决,即我们需要在设计类时需要有一个途径去快…

【MySQL】——函数、存储过程、触发器

💻博主现有专栏: C51单片机(STC89C516),c语言,c,离散数学,算法设计与分析,数据结构,Python,Java基础,MySQL,linux&#xf…

社交新时代:Facebook如何塑造我们的互动方式

在当今社交媒体充斥着人们日常生活的情况下,Facebook作为影响力最大的社交平台之一,已经深深地影响了我们的互动方式和社交行为。从初期的大学校园社交网络发展到如今的全球社交巨头,Facebook已经成为许多人日常生活中不可或缺的组成部分。本…

【软考高项】三十八、风险管理7个过程

一、规划风险管理 1、定义、作用 定义:定义如何实施项目风险管理活动的过程作用:确保风险管理的水平、方法和可见度与项目风险程度相匹配,与对组织和其他干系人的重要程度相匹配 2、输入 项目管理计划 项目章程 项目文件 干系人登记册…

初识C++ · 内存管理

目录 1 C/C的内存分布 2 C语言的内存管理 3 C的内存管理 4 operator new 和 operator delete 5 定位new 1 C/C的内存分布 语言不同,内存分布是相同的,对于局部变量都是放在栈上,全局变量都是放在静态区(数据段)&…

O2OA(翱途)支持高斯_openGauss,瀚高_HighGo,磐维_panweidb等各种国产postgres分支数据库接入

O2OA(翱途)作为一款企业级应用平台,其支持多种数据库系统是其灵活性和可扩展性的重要体现。从MySQL、Oracle到国产的达梦、神州等数据库,再到对PostgreSQL的原生支持,O2OA展现了其对不同数据库环境的良好适应性。特别地…

Vue-路由介绍

目录 一、思考引入 二、路由介绍 一、思考引入 单页面应用程序,之所以开发效率高,性能高,用户体验好,是因为页面按需更新。 而如果要按需更新,首先需要明确:访问路径和组件的对应关系。该关系通过路由来…

2024最新同城吃喝玩乐小程序源码+同城分类信息小程序搭建+开源无需授权+详细图文安装部署教程

在繁忙的都市生活中,生活节奏飞快,人们希望能够快速、便捷地获取各类生活信息,满足日常的吃喝玩乐需求。同城吃喝玩乐同城分类信息小程序,非常受欢迎,提供一站式便捷生活新体验。 分享一款2024最新同城吃喝玩乐小程序…

1707jsp电影视频网站系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 校园商城派送系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统采用web模式,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发,数…

基于springboot+mybatis+vue的项目实战之前端

步骤: 1、项目准备:新建项目,并删除自带demo程序,修改application.properties. 2、使用Apifox准备好json数据的mock地址 3、编写基于vue的静态页面 4、运行 整个的目录结构如下: 0、项目准备 新建项目&#xff0…

【可实战】被测需求理解(需求文档是啥样的、从哪些角度进行需求评审、需求分析需要分析出哪些内容、如何提高需求分析能力)

产品人员会产出一个需求文档,然后组织一个需求的宣讲。测试人员的任务就是在需求宣讲当中,分析需求有没有存在一些问题,然后在需求宣讲结束之后通过分析需求文档,分析里面的测试点并预估一个排期。 一、需求文档是什么样的&#x…