1.可迭代:
当我们打印

print(dir([1,2]))   在出现的结果中可以看到包含

  1. '__iter__', 这个方法,#次协议叫做可迭代协议
  2.  
  3. 包含'__iter__'方法的函数就是可迭代函数
  1. 字符串、列表、元组、字典、集合都可以被for循环,说明他们都是可迭代的
  2.  
  3. 2.迭代器 iterator
  1. l = [1,2,3,4]
  2. l_iter = l.__iter__() #迭代器的生成
  3. item = l_iter.__next__() #迭代器的使用,用此方法一一钓鱼迭代器中的数值
  4. print(item)
  5. item = l_iter.__next__()
  6. print(item)
  7. item = l_iter.__next__()
  8. print(item)
  9. item = l_iter.__next__()
  10. print(item)
  11. item = l_iter.__next__()
  12. print(item)
    #迭代器取值的三种方法
    1.item.__next() 传统方法
  13.  
  14. 2 for循环中取值
    for i in range(10):
      print(item.__next__()) #取出里边的10个值
  1. for i in item.__next__() #将里边所用的值在循环中取出
      print(i)
  2.  
  3. 3. printlist(item)) list 方法强转成列表在迭代器中取出值
  4.  

这是一段会报错的代码,如果我们一直取next取到迭代器里已经没有元素了,就会抛出一个异常StopIteration,告诉我们,列表中已经没有有效的元素了。

这个时候,我们就要使用异常处理机制来把这个异常处理掉。

  1. l = [1,2,3,4]
  2. li=l.__iter__()
  3. while True:
  4. try:
  5. item=li.__next__()
  6. print(item)
  7. except StopIteration:#这里要输入的是报错的内容 ,出现这个错误时执行以下内容
    print('超出索引')
  8. break

3.判断是否是迭代器

  1. print('__next__' in dir(range(12))) #查看'__next__'是不是在range()方法执行之后内部是否有__next__ 当他为真时证明是可迭代的,
  2. print('__iter__' in dir(range(12))) #查看'__next__'是不是在range()方法执行之后内部是否有__next__ 当两个结果都为True时,就是迭代器
  3.  
  4. from collections import Iterator
  5. print(isinstance(range(100000000),Iterator)) #验证range执行之后得到的结果不是一个迭代器

4.生成器

如果在某些情况下,我们也需要节省内存,就只能自己写。我们自己写的这个能实现迭代器功能的东西就叫生成器。

Python中提供的生成器:

1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次从它离开的地方继续执行

2.生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表

生成器Generator:

  本质:迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现)

  特点:惰性运算,开发者自定义

生成器函数

一个包含yield关键字的函数就是一个生成器函数。yield可以为我们从函数中返回值,但是yield又不同于return,return的执行意味着程序的结束,调用生成器函数不会得到返回的具体的值,而是得到一个可迭代的对象。每一次获取这个可迭代对象的值,就能推动函数的执行,获取新的返回值。直到函数执行结束。

  1. def func(): #这就是一个简单的生成器函数
  2. for i in range(1000):
  3. yield ('生产了%s件衣服'%i) 注意这里使用的是yield 返回数据 而不是return
  4. j=func()
  5. print(j.__iter__())
  6. print(j.__iter__())
  7. print(j.__iter__())
  1. import time
  2. def func():
  3. with open('file3','r',encoding="utf8") as f3:
  4. f3.seek(0, 2)#这个位置一定要放在外边因为只有第一次是将光标放在最后,后续就不再操作了,否则
  5. while True:
  6. a=f3.read() #如果放在它上边 while循环中,就会读不到新加的内容
  7. if not a: #这里跟最后一个yield 要注意位置和条件
  8. time.sleep(0.1)
  9. continue
  10. yield a
  11. g=func()
  12. for i in g:
  13. print(i)

生成器监听文件,seek的位置,yield需返回的值

  1. def everage():
  2. sum=0
  3. count=0
  4. average=None
  5. while True: #这里一定要写,因为send这种传入后要往下走到下一个yield,所以需要循环
  6. a=yield average
  7. sum+=a
  8. count+=1
  9. average=sum/count
  10. g=everage()
  11. print(g.__next__())# 要先执行这一步,因为用send不能给刚启动的生成器传参数
  12. print(g.send(12))

计算移动平均值,用send穿参数,记住在那里才能用send

  1.  

day13 python学习 迭代器,生成器的更多相关文章

  1. Python学习——迭代器&生成器&装饰器

    一.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素.迭代器仅 ...

  2. python函数-迭代器&生成器

    python函数-迭代器&生成器 一.迭代器 1 可迭代协议 迭代:就是类似for循环,将某个数据集内的数据可以“一个挨着一个取出来” 可迭代协议: ① 协议内容:内部实现__iter__方法 ...

  3. Python学习-迭代器、生成器

    一.迭代器 1. 可迭代对象 我们知道字符串.列表.元组.字典.集合都可以使用for语句进行循环遍历,然后输出每一个元素,这些都是可迭代对象. 检查对象是否是可迭代对象可以用两种方式去判断: (1)使 ...

  4. Python基础-迭代器&生成器&装饰器

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 我现在有个需求,看 ...

  5. Python学习二(生成器和八皇后算法)

    看书看到迭代器和生成器了,一般的使用是没什么问题的,不过很多时候并不能用的很习惯 书中例举了经典的八皇后问题,作为一个程序员怎么能够放过做题的机会呢,于是乎先自己来一遍,于是有了下面这个ugly的代码 ...

  6. 【python】迭代器&生成器

    源Link:http://www.cnblogs.com/huxi/archive/2011/07/01/2095931.html 迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素 ...

  7. python学习之生成器

    4.6 生成器Generrator ​ 生成器本质就是迭代器.python社区生成器与迭代器是一种. ​ 生成器与迭代器的唯一区别:生成器是我们自己用python代码构建的 4.6.1生成器初识 py ...

  8. python学习------迭代器协议和生成器

    一.递归和迭代 递归:自己调用自己 举例解释:问路   A问B康明网络科技怎么走,B说我不是很清楚,我帮你问问C,C说我也不知道.我问问D,D说 就在兴隆.之后D返回结果给C,C返回结果给B,B返回结 ...

  9. python学习之- 生成器/迭代器

    列表生成式写法: [ i*2 for i in range(10) ]也可以带函数 [ fun(i) for i in range(10) ] 生成器:一边循环一边计算的机制称为生成器.在常用函数中, ...

随机推荐

  1. mysql--------四种索引类型

    一.索引的类型 mysql索引的四种类型:主键索引.唯一索引.普通索引和全文索引.通过给字段添加索引可以提高数据的读取速度,提高项目的并发能力和抗压能力.索引优化时mysql中的一种优化方式.索引的作 ...

  2. Mac百度云盘不限速操作步骤

    第一步:下载所需工具:(①②步我放在同一个文件夹,可一起下载,链接失效请留言) 工具地址:链接: https://pan.baidu.com/s/1raicYzM 密码: ve3n ①下载Aria2G ...

  3. 2-16 MySQL字段约束-索引-外键

    一:字段修饰符 1:null和not null修饰符 我们通过这个例子来看看 mysql> create table worker(id int not null,name varchar(8) ...

  4. C++面试问题详解

    1.定义一个全局变量放在.cpp文件还是.h文件,原因是什么 在cpp文件中定义变量,h文件用来声明变量的作用域,使用extern声明的变量可以在本编译单元或其他编译单元中使用. 举例如下: a.h文 ...

  5. python 爬取妹子图

    作为一个python还没入门的小白,搞懂这段代码实在是很不容易,还要去学html的知识(#黑脸) 因此我加上了注释,比较好读懂点 #coding=utf-8 import time import re ...

  6. ABAP基础二:ALV基础之ALV的简单编辑

    前两天有个打印需求变更,需要在ALV显示列表中添加两个字段,可编辑,而我自己用的是函数:REUSE_ALV_GRID_DISPLAY_LVC 因为之前做可编辑基本都是固定套路,定义类,画屏幕.... ...

  7. LD_PRELOAD的偷梁换柱之能

    作者: net66 原创 本文网址:http://www.cnblogs.com/net66/p/5609026.html 发布日期:2015 年 06月 22日 一.LD_PRELOAD是什么 LD ...

  8. ArrayList与List<T>笔记

    ArrayList与List<T>笔记 ArrayList是在System.Collections命名空间的一个类, 通过Add的方法添加一个项, 当进到这个类的元数据时, 可以看到这个方 ...

  9. 日期控件:My97DatePicker

    My97DatePicker是一款非常灵活好用的日期控件.使用非常简单. 1.下载My97DatePicker组件包 下载地址:http://download.csdn.net/detail/emov ...

  10. 《Python》 内置函数补充、匿名函数、递归初识

    一.内置函数补充: 1.数据结构相关(24): 列表和元祖(2):list.tuple list:将一个可迭代对象转化成列表(如果是字典,默认将key作为列表的元素). tuple:将一个可迭代对象转 ...