python 生成器和迭代器的原理解析


Posted in Python onOctober 12, 2019

一、生成器简介

在python中,生成器是根据某种算法边循环边计算的一种机制。主要就是用于操作大量数据的时候,一般我们会将操作的数据读入内存中处理,可以计算机的内存是比较宝贵的资源,我认为的当要处理的数据超过内存四分之一的大小时就应该使用生成器。

二、生成器有什么特点?

1.和传统的容器相比,生成器更节省内存。

2.延迟计算,在我们需要结果时就调用一下生成器的next()方法即可。

3.可迭代,你可以像遍历list一样,遍历生成器

三、如何创建生成器?

在python中有两种方式创建生成器:生成器表达式 和 生成器函数。

生成器表达式

gen1 = (x for x in range(10))

生成器函数

生成式函数和普通函数只有一个区别,普通函数使用return返回结果,而生成器函数使用yield返回结果。
yield的特点在于,它并不是结束函数,而是在返回结果后将函数处于一种挂起状态,等待再次next函数的调用,然后从上次挂起的地方(yield)继续执行。

def gen():
a = 1
yield a
b = 2
yield b
c = 3
yield c

g = gen()

print(next(g))
print(next(g))
print(next(g))
print(next(g))

四、迭代器简介

迭代器是一个包含有限数量值的对象。

迭代器是一个可以被迭代的对象,可以遍历迭代器中的所有值。

从技术上讲,在Python中,迭代器是实现迭代器协议的对象,该协议由方法__iter__()和__next__()组成。

可迭代的数据类型

列表、元组、字典和集合都是可迭代的对象,可以从其中获得迭代器。

所有这些对象都可用iter()方法获取迭代器:

示例

从元组中获取一个迭代器,遍历并打印每个值:

mytuple = ("飞机", "汽车", "高铁")
myit = iter(mytuple)

print(next(myit))
print(next(myit))
print(next(myit))

五、创建迭代器

一个对象要创建迭代器,变成可迭代的,必须实现方法:__iter__()和__next__()。

__iter__()方法必须始终返回迭代器对象本身。

__next__()方法必须返回序列中的下一项。

示例

创建一个返回数字的迭代器,从1开始,每个序列项递增1(返回1、2、3、4、5等):

class MyNumbers:
def __iter__(self):
self.a = 1
return self

def __next__(self):
x = self.a
self.a += 1
return x

myclass = MyNumbers()
myiter = iter(myclass)

print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python正则分组的应用
Nov 10 Python
测试、预发布后用python检测网页是否有日常链接
Jun 03 Python
Python查看多台服务器进程的脚本分享
Jun 11 Python
Python中还原JavaScript的escape函数编码后字符串的方法
Aug 22 Python
使用优化器来提升Python程序的执行效率的教程
Apr 02 Python
python中列表和元组的区别
Dec 18 Python
Python模拟脉冲星伪信号频率实例代码
Jan 03 Python
python实现人脸识别经典算法(一) 特征脸法
Mar 13 Python
Pandas标记删除重复记录的方法
Apr 08 Python
python基于C/S模式实现聊天室功能
Jan 09 Python
详解Python中字符串前“b”,“r”,“u”,“f”的作用
Dec 18 Python
python 如何在 Matplotlib 中绘制垂直线
Apr 02 Python
python 表格打印代码实例解析
Oct 12 #Python
Django+uni-app实现数据通信中的请求跨域的示例代码
Oct 12 #Python
python3.7将代码打包成exe程序并添加图标的方法
Oct 11 #Python
python 多进程并行编程 ProcessPoolExecutor的实现
Oct 11 #Python
Python 中list ,set,dict的大规模查找效率对比详解
Oct 11 #Python
Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】
Oct 11 #Python
Python 进程操作之进程间通过队列共享数据,队列Queue简单示例
Oct 11 #Python
You might like
PHP Global变量定义当前页面的全局变量实现探讨
2013/06/05 PHP
PHP静态文件生成类实例
2014/11/29 PHP
求得div 下 img的src地址的js代码
2007/02/28 Javascript
关于javascript DOM事件模型的两件事
2010/07/22 Javascript
用jQuery中的ajax分页实现代码
2011/09/20 Javascript
JavaScript实现带标题的图片轮播特效
2015/05/20 Javascript
EasyUI布局 高度自适应
2016/06/04 Javascript
jQuery+CSS实现简单切换菜单示例
2016/07/27 Javascript
js将table的每个td的内容自动赋值给其title属性的方法
2016/10/13 Javascript
Node.js连接mongodb实例代码
2017/06/06 Javascript
VUE2 前端实现 静态二级省市联动选择select的示例
2018/02/09 Javascript
nodeJs爬虫的技术点总结
2018/05/13 NodeJs
微信小程序-form表单提交代码实例
2019/04/29 Javascript
js实现窗口全屏示例详解
2019/09/17 Javascript
vue excel上传预览和table内容下载到excel文件中
2019/12/10 Javascript
使用vue打包进行云服务器上传的问题
2020/03/02 Javascript
python3中set(集合)的语法总结分享
2017/03/24 Python
pandas.dataframe中根据条件获取元素所在的位置方法(索引)
2018/06/07 Python
python scatter函数用法实例详解
2020/02/11 Python
在PyCharm中实现添加快捷模块
2020/02/12 Python
git查看、创建、删除、本地、远程分支方法详解
2020/02/18 Python
Python中使用socks5设置全局代理的方法示例
2020/04/15 Python
python如何安装下载后的模块
2020/07/03 Python
Python爬虫抓取指定网页图片代码实例
2020/07/24 Python
python 读取、写入txt文件的示例
2020/09/27 Python
Html5写一个简单的俄罗斯方块小游戏
2019/12/03 HTML / CSS
方太官方网上商城:销售方太抽油烟机、燃气灶、消毒柜等
2017/01/17 全球购物
展会邀请函范文
2014/01/26 职场文书
公证委托书模板
2014/04/03 职场文书
关于运动会的广播稿50字
2014/10/17 职场文书
2014年医院后勤工作总结
2014/12/06 职场文书
缅怀先烈主题班会
2015/08/14 职场文书
node.js如何自定义实现一个EventEmitter
2021/07/16 Javascript
浅析CSS在DevTools 中架构演变
2021/10/05 HTML / CSS
Python中如何处理常见报错
2022/01/18 Python
Win11安全功能升级:内置防网络钓鱼功能
2022/04/08 数码科技