Python 函数之迭代器和生成器
1、迭代器
迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退,迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件
特点:
- 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
- 不能随机访问集合中的某个值 ,只能从头到尾依次访问
- 访问到一半时不能往回退
- 便于循环比较大的数据集合,节省内存
创建一个迭代器:
name = iter(['evescn', 'root', 'gmkk']) print(name)
print(name.__next__())
print(name.__next__())
print(name.__next__()) print("-------------------") # 如何迭代的读入文件
f = open("test.txt") for line in f:
print(line.strip()) # 输出结果
<list_iterator object at 0x00000000027CA8D0>
evescn
root
gmkk
-------------------
evescn
root
gmkk
2、生成器generator
如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:
g = (x * x for x in range(10)) for i in g:
print(i) # 输出结果
0
1
4
9
16
25
36
49
64
81
定义:一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就会变成生成器
创建一个生成器:
def cash_money(amount):
while amount > 0:
amount -= 100
print("又来取钱了")
yield 100
# print("又来取钱了") atm = cash_money(500)
print(type(atm))
print("取走了", next(atm))
print("取走了", next(atm))
print("取走了", next(atm))
print("取走了", next(atm))
print("取走了", next(atm)) # 输出结果
<class 'generator'>
又来取钱了
取走了 100
又来取钱了
取走了 100
又来取钱了
取走了 100
又来取钱了
取走了 100
又来取钱了
取走了 100
yield的作用:可以使函数中断,并保存中断状态,中断后,代码可以继续往下执行,重新调用这个函数时,从上次yield(中断)的下一句开始执行。
3、yield在单线程下实现并发运算的效果
import time def consumer(name):
print("%s准备吃包子了" %name)
while True:
baozi = yield
print("第%s盘包子来了,包子被%s吃了" %(baozi, name)) def producer(name):
c1 = consumer("evescn")
c2 = consumer("gmkk")
c1.__next__()
c2.__next__() print("厨师开始做包子了")
for i in range(10):
time.sleep(1)
print("做了2个包子")
c1.send(i+1)
c2.send(i+1) producer("root") # 输出结果
evescn准备吃包子了
gmkk准备吃包子了
厨师开始做包子了
做了2个包子
第1盘包子来了,包子被evescn吃了
第1盘包子来了,包子被gmkk吃了
做了2个包子
第2盘包子来了,包子被evescn吃了
第2盘包子来了,包子被gmkk吃了
做了2个包子
第3盘包子来了,包子被evescn吃了
第3盘包子来了,包子被gmkk吃了
做了2个包子
第4盘包子来了,包子被evescn吃了
第4盘包子来了,包子被gmkk吃了
做了2个包子
第5盘包子来了,包子被evescn吃了
第5盘包子来了,包子被gmkk吃了
做了2个包子
第6盘包子来了,包子被evescn吃了
第6盘包子来了,包子被gmkk吃了
做了2个包子
第7盘包子来了,包子被evescn吃了
第7盘包子来了,包子被gmkk吃了
做了2个包子
第8盘包子来了,包子被evescn吃了
第8盘包子来了,包子被gmkk吃了
做了2个包子
第9盘包子来了,包子被evescn吃了
第9盘包子来了,包子被gmkk吃了
做了2个包子
第10盘包子来了,包子被evescn吃了
第10盘包子来了,包子被gmkk吃了
Python 函数之迭代器和生成器的更多相关文章
- python is、==区别;with;gil;python中tuple和list的区别;Python 中的迭代器、生成器、装饰器
1. is 比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同 == 比较的是两个对象的内容是否相等 2. with语句时用于对try except finally 的优 ...
- python设计模式之迭代器与生成器详解(五)
前言 迭代器是设计模式中的一种行为模式,它提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示.python提倡使用生成器,生成器也是迭代器的一种. 系列文章 python设计模 ...
- Python 闭包、迭代器、生成器、装饰器
Python 闭包.迭代器.生成器.装饰器 一.闭包 闭包:闭包就是内层函数对外层函数局部变量的引用. def func(): a = "哈哈" def func2(): prin ...
- Python开发——函数【迭代器、生成器、三元表达式、列表解析】
递归和迭代 小明问路篇解释说明 递归:小明——>小红——>小于——>小东:小东——>小于——>小红——>小明 小明向小红问路,因小红不知道,所以向小于问路,因小于不 ...
- 【python基础】迭代器和生成器函数
1.迭代器协议: 1.迭代器协议是指:对象必须提供一个 __next__() 方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代(只能往后走不能往前退) ...
- Python函数系列-迭代器,生成器
一 迭代器 一 迭代的概念 #迭代器即迭代的工具,那什么是迭代呢?#迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 while True: #只是单纯地重复,因而不 ...
- Python学习笔记:输入输出,注释,运算符,变量,数字类型,序列,条件和循环控制,函数,迭代器与生成器,异常处理
输入输出 输入函数input()和raw_input() 在Python3.x中只有input()作为输入函数,会将输入内容自动转换str类型: 在Python2.x中有input()和raw_inp ...
- Python中的迭代器和生成器
本文以实例详解了python的迭代器与生成器,具体如下所示: 1. 迭代器概述: 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后 ...
- Python学习--07迭代器、生成器
迭代 如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration). Python里使用for...in来迭代. 常用可迭代对象有 ...
随机推荐
- 在vim下按ctrl+s后界面卡住
用惯了window编辑器的我们,在使用linux vim编辑器时会不会遇到这个问题:在编辑时总是会不小心按下Ctrl+S,然后整个终端都没有反应了?其实在Linux下 Ctrl+S是有特殊的用途的,不 ...
- PHP辅攻_[学习资料收集]PHP连接SQLServer2005方法
PHP连接SQLServer2005 1.修改php.ini将extension=php_mssql.dll的注释删除保存. 修改php.in将mssql.secure_connection = Of ...
- scp 和 pscp
今天在做项目遇到了两个问题,做一些总结. 1.在项目中,防火墙的的相关配置是关于cisco企业级防火墙的配置,并不是window防火墙. 2. 在Linux上, scp linux文件 ...
- QGIS 编译
QGIS 编译 在编译的过程中花费了很长时间,特别是编译Debug版本.release版本的编译可以从晚上找到很多的资料,但是Debug的编译相对较少.在Debug编译的过程中,需要单独build工程 ...
- Android系统--输入系统(一)必备的Linux知识_inotify和epoll
Android系统--输入系统(一)必备的Linux知识_inotify和epoll 引入 1. 笔记本电脑插入外接键盘,两个键盘都可以使用 a. 键盘即插即用--如何检测键盘的接入和拔出 hotpl ...
- 吴恩达深度学习笔记(五) —— 优化算法:Mini-Batch GD、Momentum、RMSprop、Adam、学习率衰减
主要内容: 一.Mini-Batch Gradient descent 二.Momentum 四.RMSprop 五.Adam 六.优化算法性能比较 七.学习率衰减 一.Mini-Batch Grad ...
- MyEclipse Could not create the view: An unexpected exception was thrown解决方案
问题:电脑突然断电,myeclipse非正常关闭,“Package Explorer”非正常显示,出现错误“Could not create the view: An unexpected excep ...
- 项目打包部署到tomcat操作步骤
对于项目部署到tomcat中,需进行一下步骤: 1.对于项目打war包,方式有以下几种:install一下 找到war包的路径即可 另外:在eclipse中,选中项目 1.1 选中Export 1 ...
- 1028: [JSOI2007]麻将
1028: [JSOI2007]麻将 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2638 Solved: 1168[Submit][Status] ...
- numpy加权平均
import numpy as np a = np.arange(15).reshape(3,5) a array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], ...