day4 迭代器与生成器解析
一、迭代器
迭代器是访问集合元素的一种方式。其实迭代器就是一种列表,只是访问集合元素的时候比较特殊,具有一些特定功能,记忆功能,能够记住用户上一次的状态。迭代器是访问集合元素的一种方式。并且,迭代器只能前进,不能后退。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
特定:
(1).访问者不需要关心迭代器内部的文件,仅需通过next()方法不断去取下一个内容;
(2).不能随机访问集合中的某个值,只能从头到尾依次访问;
(3).访问到一半时不能往回退;
(4).便于循环比较大的数据集合,节省内存生成一个迭代器。
iter()用来声明迭代器,示例如下:
names = iter(["alex","sb",11,22,"gengchangxue"])
print(names.__next__())
print(names.__next__())
print(names.__next__())
print(names.__next__())
print(names.__next__())
print(names.__next__())
运行结果如下:
alex
sb
11
22
gengchangxue
Traceback (most recent call last):
File "/home/zhuzhu/day4/iterator.py", line 7, in <module>
print(names.__next__())
StopIteration
从上面结果可以看出,迭代器是使用__next__()方法来遍历集合中的每一个元素,当超过列表的长度的时候会出现错误,stoplteration(停止迭代)。上面集合有5个元素,我们去了6次,结果就报错。迭代器只能从元素的第一个值开始遍历,直到所有的元素遍历完为止。中间过程不能后退,也不能取中间某个特定位置的值。
迭代器中只有一个__next__()方法,用来去元素。
二、生成器generator
定义:一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就会变成生成器。
其实,生成器(generator)函数中包含yield,yield的作用与return作用类似,只是yield结束本地循环之后,记录程序运行的状态,能够保持在当前状态,当用户再一次调用的时候,会从这里开始,重新进行循环,并且,yield能够返回一个值给函数,并且yield与send结合还能够接收返回值。
def cash_money(amount):
while amount > 0:
amount -= 100
yield 100
print("败家子,又来取钱了!...")
atm = cash_money(600)
上面我们写了一个函数,并且调用这个函数,但是print()语句并没有执行。下面来看看atm的类型:
print(type(atm))
运行如下:
<class 'generator'>
可以看出,atm是一个生成器,生成器的调用要使用__next__()方法。实例如下:
def cash_money(amount):
while amount > 0:
amount -= 100
yield 100
print("败家子,又来取钱了!...")
atm = cash_money(600)
print(atm.__next__())
print(atm.__next__())
生成器的作用,我们之前学的程序都是串行的,从上到下进行执行,如果中间某个过程没有执行,那么会一直等待,但是我们使用yield就能够保持记忆功能。让程序其做其他的事情,作用之后在回来继续做这件事情,比如我们去做一个大保健,做完之后重新回来取钱。
def cash_money(amount):
while amount > 0:
amount -= 100
yield 100
print("败家子,又来取钱了!...")
atm = cash_money(600)
print(atm.__next__())
print(atm.__next__())
print("叫个大保健")
print(atm.__next__())
运行结果如下:
100
败家子,又来取钱了!...
100
叫个大保健
败家子,又来取钱了!...
100
yield就是保存函数的状态,可以让我们先去完成其他事情,然后继续执行。生成器在某些时候很有用,比如我们想保存之前用户的状态,以便用户下次登录能够知道之前的信息。比如银行的系统,用户取钱之后肯定要进行减去金额,并且保存之前操作的状态。
最新文章
- 最短路径问题——floyd算法
- windows下使用ffmpeg进行视频转换和截图。
- VS中基于对话框的MFC利用换肤改变边框颜色及格式
- js 的闭包
- 【转载】PostgreSQL分区表(Table Partitioning)应用
- node 与php整合
- CreateFile,ReadFile等API详解(或者说MSDN的翻译)
- Eclipse使用技巧总结(三)
- EXT中导出表格中的数据到Excel
- git pull error
- Luogu P1226 取余运算||快速幂_快速幂
- SpringBoot系列: 单元测试2
- 开通blog,记录学习历程
- iOS - 如何得到UIImage的大小
- scrapy简单分布式爬虫
- bzoj3693: 圆桌会议 二分图 hall定理
- java15
- 并发编程——ConcurrentHashMap#helpTransfer() 分析
- android中实现在ImageView上随意画线涂鸦
- (笔记)linux设备驱动--LED驱动
热门文章
- Emgu.CV.CvInvoke”的类型初始值设定项引发异常
- Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) A 水 B stl C stl D 暴力 E 树状数组
- laravel 5.1 单元测试 Cannot modify header information 错误
- js控制treeview默认展开
- centos7 mysql5.7.17源码安装
- JS笔记加强版3
- Jquery中find与each方法使用详解
- 莫队+分块 BZOJ 3809
- 爬取知乎话题async使用协程
- ORACLE ASM中查询表空间使用情况、数据文件路径、裸设备磁盘总大小剩余大小