当前位置:
首页 > Python基础教程 >
-
PythonI/O进阶学习笔记_9.python的生成器
参考视频
https://www.xin3721.com/eschool/pythonxin3721/
content:
1. 什么是生成器
2. 生成器的实现
3. 生成器的应用
一.生成器简介
1.什么是生成器
在 Python 中,使用了 yield 的函数被称为生成器(generator)。
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
调用一个生成器函数,返回的是一个迭代器对象。
可以看到,普通函数就是返回的return,而生成器函数是生成了一个生成器对象。
为什么能和普通函数不一样返回生成器对象?
因为在python在运行之前进行编译成字节码。发现了yield关键字,所以在编译的时候就定义了。
生成器对象,实际上也是实现了我们的迭代协议的。
为啥会用到生成器?
简单举个例子:
列表所有数据都在内存中,如果有海量数据的话将会非常耗内存。如果仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
如果列表元素能按照某种算法推算出来,那我们就可以在循环的过程中不断推算出后续的元素,这样就不必创建完整的list,从而节省大量的空间。
生成器在python中的设计使用
实现了延迟求值和惰性求值,也是后面协程实现的基础。
2.生成器怎么用
例子:实现斐波拉契数列
#input def fib(x): if x<3: return 1 else: return fib(x-1)+fib(x-2) def fib2(x): n=0 last=1 sum=0 while n<x: yiled last sum,last=last,sum+last n=n+1 if __name__=="__main__": f=fib(6) print(f) f2=fib2(6) for i in f2: print(i) pass #output 8 1 1 2 3 5 8
二. 生成器的实现
生成器其实用起来还是比较简单的,但是不理解原理的时候,用的时候是不是虚虚的。
1.python函数的工作原理
python解释器实际上是用c来写的。解释器会用C实现的函数(PyEval_EvalFramEx)去执行函数。
这个 PyEval_EvalFramEx 首先会创建一个栈帧(Stack Frame)对象,就是那种记录上下文的堆栈。注意python里一切皆对象哦。
然后会将代码也变成字节码对象。查看一个函数的字节码:
#input def foo(): bar def bar(): pass import dis print(dis.dis(foo)) #output: 2 0 LOAD_GLOBAL 0 (bar) 2 POP_TOP 4 LOAD_CONST 0 (None) 6 RETURN_VALUE None
在调用函数之前,会创建那个栈帧对象,然后在上下文中,运行这个全局唯一的字节码。
当foo调用bar的时候,又会创建一个栈帧,然后将bar的控制权交给foo的栈帧对象。
所有栈帧都是分配在堆内存(不去释放,就一直在内存中)上,这就决定了栈帧可以独立于调用者存在。
什么意思呢?
就是在foo函数退出之后,我们仍然可以找到之前调用过的foo,或者它的子函数bar的栈帧,并没有和静态语言一样函数运行完了之后就被释放。
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式