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来迭代. 常用可迭代对象有 ...
随机推荐
- Docker容器技术-基础与架构
一.什么是容器 容器是对应用程序及其依赖关系的封装. 1.容器的优点 容器与主机的操作系统共享资源,提高了效率,性能损耗低 容器具有可移植性 容器是轻量的,可同时运行数十个容器,模拟分布式系统 不必花 ...
- Nagios 服务安装
Nagios 环境部署 安装服务包 操作系统:Linux Centos 6.4 32位 安装包:nagios-3.4.3.tar.gz 安装包:nagios-plugins-1.4.13.tar.gz ...
- gitLab 傻瓜式使用教程
第一步,先去gitLab网上注册一下gitLab 进网站注册出来是这个界面: 2016082993103QQ20160829-1.png 然后进行人机验证(这个没啥困难的0.0) 2016082998 ...
- MySQL锁机制和PHP锁机制
模拟准备--如何模拟高并发访问一个脚本:apache安装文件的bin/ab.exe可以模拟并发量 -c 模拟多少并发量 -n 一共请求多少次 http://请求的脚本例如:cmd: apache安装路 ...
- 利用CXF框架开发webservice
开发服务端代码 1. web.xml文件中添加cxf的servlet 2. 定义接口 @WebService(targetNamespace="http://UserInfo.ws.com& ...
- How to use Jenkins
一.关键点 1.how to start the build server? do i need to start some app to do this? I don't believe so... ...
- HDU 4348 To the moon (主席树区间更新)
题意:首先给你n个数,开始时间为0,最后按照操作输出 给你四种操作: 1. C l r d : 在(l,r)区间都加上d,时间加一2. Q l r : 询问现在(l,r)的区间和3. H l r ...
- Https通信工具类
记录一个在微信开发中用到的https通信工具类,以后会用到的. 用于https通信的证书信任管理器 import java.security.cert.CertificateException; im ...
- Java日期时间输出格式优化
使用printf格式化日期 printf 方法可以很轻松地格式化时间和日期.使用两个字母格式,它以 %t 开头并且以下面表格中的一个字母结尾. 转 换 符 说 明 示 例 c 包括全部 ...
- JMeter正则表达式提取器说明
Apply to:应用范围 要检查的响应字段:样本数据源. 引用名称:其他地方引用时的变量名称,引用方法:${引用名称} 正则表达式:数据提取器,如上图的 "sysNo":&quo ...