简-理解Python的装饰器、迭代器和生成器底层原理

        装饰器、迭代器和生成器是 Python 中的高级功能,它们分别用于扩展函数或方法的功能、遍历容器元素和创建简洁的迭代器。

装饰器

        装饰器是一个用于修改或扩展函数或方法的功能的函数。装饰器接受一个函数作为参数,并返回一个新的函数,新函数通常会在原函数的基础上添加一些额外的功能。装饰器的常见用途包括日志记录、性能测试、权限检查等。

def demo_decorator(func):def hh(*args, **kwargs):print("Before function call")result = func(*args, **kwargs)print("After function call")return hhreturn wrapper@demo_decorator
def a_function():print("Inside function")a_function()'''
结果:
Before function call
Inside function
After function call
'''

        底层:本质上是一个高阶函数,作为闭包,内部函数调外部函数引用,并返回内部函数。在调用被修饰的函数时,实际上是在调用装饰器返回的新函数。

        闭包是指一个函数即使离开作用域后,也能够记录并访问其定义的作用域中的局部变量。常用于创建具特定行为的函数,允许不用全局变量保留函数的状态。Python 中,闭包可通过定义嵌套函数并捕获外部作用域变量来实现。

迭代器

        迭代器是 Python 中用于遍历容器(如列表、元组、集合等)元素的对象。迭代器实现了 __iter__() 和 __next__() 方法,提供了一种统一的遍历容器元素的接口,使得你可以在 for 循环和其他迭代方法中使用它。

class DemoIterator:def __init__(self, data):self.data = dataself.index = 0def __iter__(self):return selfdef __next__(self):if self.index < len(self.data):result = self.data[self.index]self.index += 1return resultelse:raise StopIteration# 使用自定义的迭代器遍历列表
my_list = [1, 2, 3, 4, 5]
iterator = DemoIterator(my_list)for item in iterator:print(item)'''
1
2
3
4
5
'''

        底层:依赖于 __iter__() 和 __next__() 方法。当在 for 循环中使用迭代器时,Python 首先调用 __iter__() 方法获取迭代器对象,然后反复调用 __next__() 方法获取容器的下一个元素,直到遇到 StopIteration 异常,表示迭代已完成。

        大多数情况下,不需手动实现迭代器。只有创建自定义容器类型时,可能需实现迭代器接口。

        可迭代对象(Iterable)是 Python 中具一定遍历规则的对象,可以在 for 循环或其他迭代方法中使用。

  1. 可迭代对象实现了 __iter__() 方法。当 for 循环或其他迭代方法中使用可迭代对象时,Python 会自动调用该方法。__iter__() 方法返回一个迭代器对象,用于遍历容器的元素

  2. 迭代器对象实现了 __next__() 方法。每次迭代时,Python 会调用这个方法来获取容器的下一个元素。当没更多的元素可供迭代时,__next__() 方法应抛出一个 StopIteration 异常,通知 Python 结束迭代。

生成器

        生成器是一种特殊的迭代器,它允许使用更简洁的方式创建迭代器。生成器使用 yield 语句生成一系列的值,而不是显式地实现 __iter__() 和 __next__() 方法。当生成器函数被调用时,它会返回一个生成器对象,该对象可用于遍历生成的值。

def demo_generator(n):i = 0while i < n:yield ii += 1for item in demo_generator(5):print(item)'''
0 
1 
2 
3 
4
'''

        底层:依赖于 yield 语句和生成器函数。生成器函数被调用时,会返回一个生成器对象,实际上是一个迭代器,它会在每次迭代时自动保存函数的状态(包括局部变量、指令指针等),并在下一次迭代时从上次中断的地方继续执行。遇到 yield 语句时,生成器会暂停函数的执行,并将 yield 语句后的值作为迭代的当前值返回。当再次调用 next() 函数时,生成器会从上次暂停的地方恢复执行,直到遇到下一个 yield 语句或抛出 StopIteration 异常。

   yield 是 Python 中的一个关键字,用于实现生成器。在底层,yield 的实现依赖于 Python 的协程(coroutine)机制。当一个生成器函数包含 yield 语句时,它会被编译器识别为一个生成器,而不是普通的函数。生成器函数的执行不同于普通函数,它可以在执行过程中暂停和恢复,保持当前的状态。

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

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

相关文章

APUE学习62章终端(二): stty命令特殊字符终端标志

1. stty命令 stty命令的英文解释: 很明显stty有一个-F参数 所以准确的说: stty命令是设置当前终端驱动程序(也有可能直接配置了硬件&#xff0c;这点目前不清楚)的属性&#xff0c;使当前终端的驱动程序能够使能/去使能一些特殊字符的识别与处理等等 2. stty命令的结构 3. 终端…

使用vuex让购物车联动

// 1.vuex点击加减触发函数提交仓库把我们请求的数据存到仓库 2.在仓库定义这个函数和对象 把我们存进去的数据存起来 // 3。在我们需要的页面拿出数据&#xff0c;然后循环就可以 // 4.当我们点击加号就触发函数然后在vuex对这个数据进行处理 // 5.对我们点进来的数据进行一个…

【SLAM】LoFTR知多少

1. LoFTR: Detector-Free Local Feature Matching with Transformers PAPER 论文 | LoFTR: Detector-Free Local Feature Matching with Transformers 代码 | CODE: 关键词 | detector-free, local feature matching LoFTR知多少 1. LoFTR: Detector-Free Local Feature M…

O3DE的Pass

Pass介绍 Pass是具有输入和输出的渲染过程。 在最终渲染帧中看到的每个细节都是通过一系列Pass&#xff08;前一个Pass的输出是下一个Pass的输入&#xff09;计算出来的。Pass可以生成图像&#xff08;作为纹理、缓冲区或渲染目标&#xff09;。每个图像都包含关于场景的特定…

不藏了!极狐GitLab 向你介绍一位研发效能「六边形战士」

怎么用数字说清研发效能&#xff1f; 总是觉得研发资源不够用&#xff1f; 高效工作全靠领导盯&#xff1f; 不问不知道项目推迟发布&#xff1f; 代码泄漏了才紧急采取措施&#xff1f; 是时候甩开这些“研发人的 PTSD”了&#x1f623; 极狐星&#xff0c;给专业的你更…

Unity Shader:常用的C#与shader交互的方法

俗话说久病成医&#xff0c;虽然不是专业技术美术&#xff0c;但代码写久了自然会积累一些常用的shader交互方法。零零散散的&#xff0c;总结如下&#xff1a; 1&#xff0c;改变UGUI的材质球属性 有时候我们需要改变ui的一些属性&#xff0c;从而实现想要的效果。通常UGUI上…

Spring如何通过三级缓存解决循环依赖问题?

目录 一、什么是Spring 二、循环依赖问题 三、三级缓存机制 四、如何通过三级缓存解决循环依赖问题 一、什么是Spring Spring框架是一个开源的Java应用程序开发框架&#xff0c;提供了一种全面的、一致的编程模型&#xff0c;用于构建企业级应用程序和服务。它由Rod Johnso…

多个List 合并变成一个List+一个List 根据某个字段相等的另一个字段相加,并排序变成新的List

List<CurveTimeAndValueDomain> curves new ArrayList<>();for (int i 0; i < columnNames.size(); i){if (columnNames.get(i).equals(PlantConstant.TENDOWNFX) || columnNames.get(i).equals(PlantConstant.TENDOWNQP)) {//10千伏以下 数据 进行缓慢处理cu…

代码随想录算法训练营第五十三天 | 1143.最长公共子序列、1035.不相交的线、53.最大子数组和

文章目录 一、1143.最长公共子序列二、1035.不相交的线三、最大子数组和 一、1143.最长公共子序列 题目链接 代码如下&#xff1a; class Solution { public:int longestCommonSubsequence(string text1, string text2) {vector<vector<int>> dp (text1.size() …

Stable Diffusion中人物生成相关的negative prompts

下面是常用的negative prompt&#xff0c;在使用stable Diffusion webui等工具生成时可以填入。 bad anatomy, bad proportions, blurry, cloned face, deformed, disfigured, duplicate, extra arms, extra fingers, extra limbs, extra legs, fused fingers, gross proporti…

深度学习(32)——CycleGAN(1)

深度学习&#xff08;32&#xff09;——CycleGAN&#xff08;1&#xff09; 文章目录 深度学习&#xff08;32&#xff09;——CycleGAN&#xff08;1&#xff09;1. GAN原理2. CycleGAN&#xff08;1&#xff09;原理&#xff08;2&#xff09;核心思想&#xff08;3&#xf…

git回退到指定版本

#首先使用该方法查看版本号&#xff0c;后面可以接-n,n为数量&#xff0c;指定展示前几个版本记录。 git log &#xff08;或 git reflog&#xff09;#xxx换成你想回退的版本号。 git reset --hard xxx#强制推送到远程仓库&#xff0c;让远程仓库版本号一致。 git push origin…

PtahDAO:全球首个DAO治理资产信托计划的金融平台

金融科技是当今世界最具创新力和影响力的领域之一&#xff0c;区块链技术作为金融科技的核心驱动力&#xff0c;正在颠覆传统的金融模式&#xff0c;为全球用户提供更加普惠、便捷、安全的金融服务。在这个变革的浪潮中&#xff0c;PtahDAO&#xff08;普塔道&#xff09;作为全…

优漫动游|前端程序员容易出错的基础知识

web全栈是目前比较流行的语言&#xff0c;因为前端较其他语言相比&#xff0c;简单好学&#xff0c;而且现在的互联网公司几乎缺不了web前端开发&#xff0c;行业的需求致使大量的人转型前端&#xff0c;对于刚学前端的同学来讲&#xff0c;他们缺乏开发经验&#xff0c;在项目…

【C++】类与对象(2)

文章目录 前言一、类的6个默认成员函数二、构造函数1.概念2.特性3.初始化列表 三、析构函数1.概念2.特性 四、拷贝构造函数1.概念2.特性 五、赋值运算符重载1.运算符重载2.赋值运算符重载3.前置和后置重载 六、取地址及const取地址操作符重载总结 前言 在前面&#xff0c;给大…

【题解】单链表的排序

单链表的排序 题目链接&#xff1a;单链表的排序 解题思路1&#xff1a;分治、双指针 分治就是分而治之的意思&#xff0c;分的意思是说将一个大且复杂的问题划分成多个性质相似但是规模更小的问题&#xff0c;子问题继续按照同样的思路进行划分&#xff0c;直到问题被划分为…

【C++】开源:matplotlib-cpp静态图表库配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍matplotlib-cpp图表库配置与使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&…

DC.js教程_编程入门自学教程_菜鸟教程-免费教程分享

教程简介 DC.js 是一个优秀的 JavaScript 库&#xff0c;用于在浏览器、移动设备中进行数据分析&#xff0c;最终有助于创建数据可视化&#xff1b;DC.js 是一个用于探索大型多维数据集的图表库&#xff0c;它依靠 D3.js 引擎以 CSS 友好的 SVG 格式呈现图表。它允许呈现复杂的…

ES6 - 数组新增的一些常用方法

文章目录 1&#xff0c;Array.from()2&#xff0c;Array.of()3&#xff0c;find()&#xff0c;findIndex()&#xff0c;findLast()和findLastIndex()4&#xff0c;Array.fill()5&#xff0c;keys()&#xff0c;values() 和 entries()6&#xff0c;Array.includes()7&#xff0c…

flask-----请求和响应,session

1 所有web:请求对象&#xff0c;响应对象(go,java,ptyhon) django&#xff1a;request&#xff08;每个请求一个request&#xff09;&#xff0c;新手四件套 flask&#xff1a;requset&#xff1a;全局的&#xff0c;但是也是每个请求一个request&#xff0c;新手三件套 2 fl…