day13-迭代器及生成器
iterable:可迭代的;iterator:迭代器;
print(dir([ ])) #打印出列表所拥有的所有方法;
可迭代协议:只要含有__iter__方法的都是可迭代的。
迭代器协议:含有__iter__方法和__next__方法的就是迭代器。
对可迭代的对象调用__iter__方法就可以生成一个迭代器,for循环其实就是在使用迭代器。
迭代器的好处:
1、可以在容器类型中一个一个取值,会把所有的值都取到;
2、可以节省内存空间;
生成器
生成器函数:
只要含有yield关键字的函数都是生成器函数,yield功能和return功能类似,但不会结束函数。
调用生成器函数不会得到返回的具体的值,而是得到一个迭代器。
1 import time
2 def generator1():
3 a=1
4 print('定义了变量a')
5 yield a
6 b=2
7 print('定义了变量b')
8 yield b
9 g1=generator1()
10 print(g1) #打印g1发现g1只是生成器
11 print(g1.__next__())
12 print('-'*20) #华丽的分割线
13 time.sleep(3) #sleep看清执行过程
14 print(g1.__next__())
send方法
1、取值功能上和next相同
2、只是取下一个数据时,给上一个yield位置传递一个函数
注意事项:
#第一次使用生成器的时候,是用next取值;
#最后一个yield不能接收外部的值
计算移动平均值__预激协程的装饰器
def wrap1(func):#在调用被装饰生成器函数的时候首先用next激活生成器
def inner(*args,**kwargs):
g=func(*args,**kwargs)
next(g)
return g
return inner @wrap1
def averager():
count=0
sum1=0.0
aver=None
while True:
term=yield aver
sum1+=term
count+=1
aver=sum1/count g=averager()
#next(g),在装饰器中调用了next方法
print(g.send(10))
print(g.send(20))
print(g.send(30))
yield from 可迭代对象a
a迭代产生的每个值都直接传递给生成器的调用者
列表推导器和生成器表达式
list1=['egg%s'% i for i in range(10) ] #列表解析式
print(list1) laomuji=('egg%s'% i for i in range(10)) #生成器表达式
for i in laomuji:
print(i)
1、将列表推导器的[]换成()就变成了生成器表达式。
2、列表解析与生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存
3、Python不但使用迭代器协议,让for循环变得更加通用。大部分内置函数,也是使用迭代器协议访问对象的。例如, sum函数是Python的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协议,所以,我们可以直接这样计算一系列值的和:sum(x**2,for x in range(4))
day13-迭代器及生成器的更多相关文章
- day13迭代器与生成器
三个作业: # 1.编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码 login_dic = {'alex':False} def ...
- DAY13 迭代器与生成器
一.迭代器 定义:器:包含了多个值的容器 迭代:循环反馈(一次从容器中取出一个值) 迭代器:从装有多个值的容器中一次取出一个值给外界 优点:不依赖索引,完成取值 缺点:不能计算长度,不能指定位取值(只 ...
- python学习 day13 迭代器,生成器,枚举对象
一.复习 1.闭包:定义在函数内部的函数(被函数嵌套的函数) 2.装饰器:闭包的一个应用场景 -- 为一个函数添加新功能的工具 3.开放封闭原则:不能修改源代码,不能修改调用方式,但可以对外提供增加新 ...
- day13: 迭代器和生成器
1,思考所有可以被for循环的:list,tuple,set,dict,range,enumerate,f,str,差不多了,为何这些数据类型可以被for循环呢? 2,一个标准的装饰器函数 from ...
- python 全栈开发,Day13(迭代器,生成器)
一.迭代器 python 一切皆对象 能被for循环的对象就是可迭代对象 可迭代对象: str,list,tuple,dict,set,range 迭代器: f1文件句柄 dir打印该对象的所有操作方 ...
- 迭代器、生成器 day13
一 迭代器 迭代器的由来pythone2.2引进的,是一种序列(也是一种数据类型),也是为类对象提供一个序列的入口. for 循环str list tuple dict set 文件句柄可迭代: s ...
- day13 python学习 迭代器,生成器
1.可迭代:当我们打印 print(dir([1,2])) 在出现的结果中可以看到包含 '__iter__', 这个方法,#次协议叫做可迭代协议 包含'__iter__'方法的函数就是可迭代函数 ...
- Python_迭代器、生成器、列表推导式,生成器表达式
1.迭代器 (1)可迭代对象 s1 = ' for i in s1: print(i) 可迭代对象 示例结果: D:\Python36\python.exe "E:/Python/课堂视频/ ...
- Python 从零学起(纯基础) 笔记 之 迭代器、生成器和修饰器
Python的迭代器. 生成器和修饰器 1. 迭代器是访问集合元素的一种方式,从第一个到最后,只许前进不许后退. 优点:不要求事先准备好整个迭代过程中的所有元素,仅仅在迭代到某个元素时才计算该元素,而 ...
- Python之模块,迭代器与生成器
本节涉及内容: 1. 迭代器和生成器 2. 递归 3. 字符串格式化 4. 模块 内置模块 自定义模块 第三方模块 5. 序列化的模块 json pickle (一). 迭代器和生成器: 迭代器: ...
随机推荐
- 如何给CentOS 安装Vmware Tools
1.打开电脑中的VMware Workstation 软件,并启动安装了CentOS6.9系统的虚拟机 2.点击“”other”,在Username中输入root,在Password ...
- asp.net core 2.1认证
asp.net core 2.1认证 这篇文章基于asp.net core的CookieAuthenticationHandler来讲述. 认证和授权很相似,他们的英文也很相似,一个是Authenti ...
- DAY17、常用模块
一.time模块 1.时间戳(timestamp):time.time() #可以作为数据的唯一标识 是相对于1970-1-1-0:0:0时间插值 2.延迟线程的运行:time.sleep ...
- Vue子组件与父组件之间的通信
1.环境搭建 下载 vue-cli:npm install -g vue-cli 初始化项目:vue init webpack vue-demo 进入vue-demo文件夹:cd vue-demo 下 ...
- nodejs开发辅助工具nodemon
前面的话 修改代码后,需要重新启动 Express 应用,所做的修改才能生效.若之后的每次代码修改都要重复这样的操作,势必会影响开发效率,本文将详细介绍Nodemon,它会监测项目中的所有文件,一旦发 ...
- js基础-字符串常用属性合集
/* * * 实例方法---->必须要通过new的方式创建的对象(实例对象)来调用的方法 * 静态方法---->直接通过大写的构造函数的名字调用的方法(直接通过大写的对象名字调 ...
- Spring Boot程序获取tomcat启动端口
package com.geostar.geostack.git_branch_manager.config; import org.springframework.beans.factory.ann ...
- zookeeper的单实例和伪集群部署
原文链接: http://gudaoyufu.com/?p=1395 zookeeper工作方式 ZooKeeper 是一个开源的分布式协调服务,由雅虎创建,是 Google Chubby 的开源实现 ...
- spring boot junit controller
MockMvc 来自Spring Test,它允许您通过一组方便的builder类向 DispatcherServlet 发送HTTP请求,并对结果作出断言.请注意,@AutoConfigureMoc ...
- CF226D The table
题目链接 题意 给出一个\(n\times m\)的矩阵,可以把某些行和某些列上面的数字变为相反数.问修改那些行和哪些列可以使得所有行和所有列之和都为非负数. 思路 每次将负数的行或者列变为相反数.因 ...