day13 python学习 迭代器,生成器
1.可迭代:
当我们打印
print(dir([1,2])) 在出现的结果中可以看到包含
'__iter__', 这个方法,#次协议叫做可迭代协议 包含'__iter__'方法的函数就是可迭代函数
字符串、列表、元组、字典、集合都可以被for循环,说明他们都是可迭代的。 2.迭代器 iterator
l = [1,2,3,4]
l_iter = l.__iter__() #迭代器的生成
item = l_iter.__next__() #迭代器的使用,用此方法一一钓鱼迭代器中的数值
print(item)
item = l_iter.__next__()
print(item)
item = l_iter.__next__()
print(item)
item = l_iter.__next__()
print(item)
item = l_iter.__next__()
print(item)
#迭代器取值的三种方法
1.item.__next() 传统方法 2 在for循环中取值
for i in range(10):
print(item.__next__()) #取出里边的10个值
for i in item.__next__() #将里边所用的值在循环中取出
print(i) 3. print(list(item)) 用 list 方法强转成列表在迭代器中取出值
这是一段会报错的代码,如果我们一直取next取到迭代器里已经没有元素了,就会抛出一个异常StopIteration,告诉我们,列表中已经没有有效的元素了。
这个时候,我们就要使用异常处理机制来把这个异常处理掉。
l = [1,2,3,4]
li=l.__iter__()
while True:
try:
item=li.__next__()
print(item)
except StopIteration:#这里要输入的是报错的内容 ,出现这个错误时执行以下内容
print('超出索引')
break
3.判断是否是迭代器
print('__next__' in dir(range(12))) #查看'__next__'是不是在range()方法执行之后内部是否有__next__ 当他为真时证明是可迭代的,
print('__iter__' in dir(range(12))) #查看'__next__'是不是在range()方法执行之后内部是否有__next__ 当两个结果都为True时,就是迭代器
from collections import Iterator
print(isinstance(range(100000000),Iterator)) #验证range执行之后得到的结果不是一个迭代器
4.生成器
如果在某些情况下,我们也需要节省内存,就只能自己写。我们自己写的这个能实现迭代器功能的东西就叫生成器。
Python中提供的生成器:
1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次从它离开的地方继续执行
2.生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表
生成器Generator:
本质:迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现)
特点:惰性运算,开发者自定义
生成器函数
一个包含yield关键字的函数就是一个生成器函数。yield可以为我们从函数中返回值,但是yield又不同于return,return的执行意味着程序的结束,调用生成器函数不会得到返回的具体的值,而是得到一个可迭代的对象。每一次获取这个可迭代对象的值,就能推动函数的执行,获取新的返回值。直到函数执行结束。
def func(): #这就是一个简单的生成器函数
for i in range(1000):
yield ('生产了%s件衣服'%i) 注意这里使用的是yield 返回数据 而不是return
j=func()
print(j.__iter__())
print(j.__iter__())
print(j.__iter__())
import time
def func():
with open('file3','r',encoding="utf8") as f3:
f3.seek(0, 2)#这个位置一定要放在外边因为只有第一次是将光标放在最后,后续就不再操作了,否则
while True:
a=f3.read() #如果放在它上边 while循环中,就会读不到新加的内容
if not a: #这里跟最后一个yield 要注意位置和条件
time.sleep(0.1)
continue
yield a
g=func()
for i in g:
print(i)
生成器监听文件,seek的位置,yield需返回的值
def everage():
sum=0
count=0
average=None
while True: #这里一定要写,因为send这种传入后要往下走到下一个yield,所以需要循环
a=yield average
sum+=a
count+=1
average=sum/count
g=everage()
print(g.__next__())# 要先执行这一步,因为用send不能给刚启动的生成器传参数
print(g.send(12))
计算移动平均值,用send穿参数,记住在那里才能用send
day13 python学习 迭代器,生成器的更多相关文章
- Python学习——迭代器&生成器&装饰器
一.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素.迭代器仅 ...
- python函数-迭代器&生成器
python函数-迭代器&生成器 一.迭代器 1 可迭代协议 迭代:就是类似for循环,将某个数据集内的数据可以“一个挨着一个取出来” 可迭代协议: ① 协议内容:内部实现__iter__方法 ...
- Python学习-迭代器、生成器
一.迭代器 1. 可迭代对象 我们知道字符串.列表.元组.字典.集合都可以使用for语句进行循环遍历,然后输出每一个元素,这些都是可迭代对象. 检查对象是否是可迭代对象可以用两种方式去判断: (1)使 ...
- Python基础-迭代器&生成器&装饰器
本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 我现在有个需求,看 ...
- Python学习二(生成器和八皇后算法)
看书看到迭代器和生成器了,一般的使用是没什么问题的,不过很多时候并不能用的很习惯 书中例举了经典的八皇后问题,作为一个程序员怎么能够放过做题的机会呢,于是乎先自己来一遍,于是有了下面这个ugly的代码 ...
- 【python】迭代器&生成器
源Link:http://www.cnblogs.com/huxi/archive/2011/07/01/2095931.html 迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素 ...
- python学习之生成器
4.6 生成器Generrator 生成器本质就是迭代器.python社区生成器与迭代器是一种. 生成器与迭代器的唯一区别:生成器是我们自己用python代码构建的 4.6.1生成器初识 py ...
- python学习------迭代器协议和生成器
一.递归和迭代 递归:自己调用自己 举例解释:问路 A问B康明网络科技怎么走,B说我不是很清楚,我帮你问问C,C说我也不知道.我问问D,D说 就在兴隆.之后D返回结果给C,C返回结果给B,B返回结 ...
- python学习之- 生成器/迭代器
列表生成式写法: [ i*2 for i in range(10) ]也可以带函数 [ fun(i) for i in range(10) ] 生成器:一边循环一边计算的机制称为生成器.在常用函数中, ...
随机推荐
- 3-23 Rspec自动化测试(开始练习)
闰年程序 leap_year_spec.rb require_relative './leap_year' describe "Leap Year" do it "201 ...
- codeforces 484a//Bits// Codeforces Round #276(Div. 1)
题意:给出区间[ll,rr],求中间一个数二进制表示时一的个数最多. 写出ll和rr的二进制,设出现第一个不同的位置为pos(从高位到低位),找的数为x,那么为了使x在[ll,rr]内,前pos-1个 ...
- 43 HTML CSS
第一部分: 1.meta 标签中:meta 标签中 <meta http-equvi = "refresh" content="2;URL= https://www ...
- Professional layer CodeForces - 1103D (状压,gcd)
大意: 给定$n$元素序列$a$, 现在想要让$gcd(a_1,a_2,...,a_n)=1$. 对于每个$a_i$可以除以一个不超过$k$的因子, 代价为$e_i$, 假设一共选择了$x$个元素去除 ...
- PHP:第一章——PHP中的算术运算符/递增、递减运算符/赋值运算符
算术运算符 //$a=10; $b=5; //取反: //echo -$a;//输出:-10: //加法: //echo $a+$b;//输出:15 //减法: //echo $a-$b;//输出:5 ...
- onmouseover和onmouseout的bug
脑子不好用了,一点东西要看几遍才能记住,学过的东西也要好几遍,悲哀. 习惯了jquery的hover,或者看过hover源码,或者是正美的<框架设计>,onmouseover和onmous ...
- 快速切题 cf118A
这教导人们一定要看题,要看题,元音包含了‘y’,完毕,要看题啊 #include <cstring> #include <cstdio> #include <cctype ...
- tensorflow 模型保存后的加载路径问题
import tensorflow as tf #保存模型 saver = tf.train.Saver() saver.save(sess, "e://code//python//test ...
- spring学习笔记Core Technologies
Spring 框架最重要的是Ioc(Inversion of Control)容器,在这个基础之上衍生出了AOP(Aspect-Oriented Programming)技术,80/20法则,这货可以 ...
- linux定时任务:crontab命令
crontab命令被用来提交和管理用户的需要周期性执行的任务,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查 ...