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中的自定义函数学习笔记
Sep 23 Python
Python线程中对join方法的运用的教程
Apr 09 Python
深入理解Python装饰器
Jul 27 Python
python 类对象和实例对象动态添加方法(分享)
Dec 31 Python
python批量替换多文件字符串问题详解
Apr 22 Python
python实现简单聊天室功能 可以私聊
Jul 12 Python
Python使用type关键字创建类步骤详解
Jul 23 Python
pygame实现俄罗斯方块游戏(AI篇2)
Oct 29 Python
windows上彻底删除jupyter notebook的实现
Apr 13 Python
Python局部变量与全局变量区别原理解析
Jul 14 Python
几款Python编译器比较与推荐(小结)
Oct 15 Python
彻底弄懂Python中的回调函数(callback)
Jun 25 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获取服务器信息的实现代码
2013/02/04 PHP
php函数指定默认值方法的小例子
2013/12/04 PHP
php数组保存文本与文本反编成数组实例
2014/11/13 PHP
ThinkPHP实现生成和校验验证码功能
2017/04/28 PHP
js querySelector和getElementById通过id获取元素的区别
2012/04/20 Javascript
javascript实现TreeView 无刷新展开的实例代码
2013/07/13 Javascript
一个获取第n个元素节点的js函数
2014/09/02 Javascript
js实现文本框中输入文字页面中div层同步获取文本框内容的方法
2015/03/03 Javascript
fastclick插件导致日期(input[type="date"])控件无法被触发该如何解决
2015/11/09 Javascript
php基于redis处理session的方法
2016/03/14 Javascript
Ajax 加载数据 练习代码
2017/01/05 Javascript
Element-UI Table组件上添加列拖拽效果实现方法
2018/04/14 Javascript
Vue瀑布流插件的使用示例
2018/09/19 Javascript
详解vuex状态管理模式
2018/11/01 Javascript
使用Node.js实现一个多人游戏服务器引擎
2019/03/13 Javascript
Python基于递归算法实现的汉诺塔与Fibonacci数列示例
2018/04/18 Python
pycharm下查看python的变量类型和变量内容的方法
2018/06/26 Python
Python爬虫实现爬取百度百科词条功能实例
2019/04/05 Python
Keras 利用sklearn的ROC-AUC建立评价函数详解
2020/06/15 Python
如何使用python-opencv批量生成带噪点噪线的数字验证码
2020/12/21 Python
AmazeUI导航的示例代码
2020/08/14 HTML / CSS
美国一家主打母婴用品的团购网站:zulily
2017/09/19 全球购物
HearthSong官网:儿童户外玩具、儿童益智玩具
2017/10/16 全球购物
凯蒂·佩里个人女鞋品牌:Katy Perry Collections
2019/04/04 全球购物
俄罗斯皮肤健康中心:Pharmacosmetica.ru
2020/02/22 全球购物
Belstaff英国官方在线商店:Belstaff.co.uk
2021/02/09 全球购物
Blank NYC官网:夹克、牛仔裤等
2020/12/16 全球购物
路德维希•贝克(LUDWIG BECK)中文官网:德国大型美妆百货
2020/09/19 全球购物
财务会计专业应届毕业生求职信
2013/10/18 职场文书
工商企业管理应届生求职信
2013/11/03 职场文书
文秘专业大学生求职信
2013/11/10 职场文书
心理健康心得体会
2014/01/02 职场文书
企业金融服务方案
2014/06/03 职场文书
《藏戏》教学反思
2016/02/23 职场文书
oracle通过存储过程上传list保存功能
2021/05/12 Oracle
MySQL REVOKE实现删除用户权限
2021/06/18 MySQL