迭代器 iterator  生成器 generator

1、手动遍历迭代器

2、代理迭代

解释:将迭代操作代理到容器内部的对象上

操作:使用__iter()__,  for 循环遍历对象时,会自动调用类特殊成员方法__iter()__

  1. class Foo(object):
  2.  
  3. def __init__(self, sq):
  4. self.sq = sq
  5.  
  6. def __iter__(self):
  7. return iter(self.sq)
  8.  
  9. obj = Foo([11,22,33,44])
  10.  
  11. for i in obj:
  12. print i

自定义可迭代的类

3、使用生成器创建新的迭代模式

生成器也是一种可迭代的对象

函数内使用了yeild ,则该函数就变成了一个生成器

生成器只能用于迭代操作 ,如 next()

for 循环 是一种迭代操作,其内部调用了next()

for循环语法内部做了什么?

  1. obj = iter([11,22,33,44])
  2.  
  3. while True:
  4. val = obj.next()
  5. print val

for 循环语法内部

4、实现迭代器协议

5、反向迭代

列表或字典等可以使用reversed()进行反向迭代;

自定义对象内部实现了__reversed__()__的特殊方法时,可以使用reversed(obj),反向迭代生效。

6、带有外部状态的生成器函数

自定义一个类,把生成器函数放到__iter__()方法中,例如

  1. from collections import deque
  2. class linehistory:
  3. def __init__(self, lines, histlen=3):
  4. self.lines = lines
  5. self.history = deque(maxlen=histlen)
  6. def __iter__(self):
  7. for lineno, line in enumerate(self.lines, 1):
  8. self.history.append((lineno, line))
  9. yield line
  10. def clear(self):
  11. self.history.clear()

生成器类

7、迭代器切片

使用 itertools.islice(iterator,start,end) 来对迭代器和生成器切片,返回一个可迭代的 islice 对象,同时 原来的迭代器会被消耗

如果需要之后再次访问这个迭代器,记得先把它里面的数据放入一个列表中

  1. def count(n):
  2. while True:
  3. yield n
  4. n += 1
  5. c = count(0)
  6.  
  7. imort itertools
  8. for i in itertools(c,0,3)
  9. print(i)
  10. >0
  11. >1
  12. >2

生成器切片

8、跳过可迭代对象的开始部分

itertools.dropwhile(func,itertor)  每次迭代的值会传入func,当func返回值为True时,丢弃该值,直到func返回值为false时,停止判断返回后面所有的值

  1. a.txt 前三行为注释
  2. #
  3. #
  4. #
  5. aaaaaaaa
  6. bbbbbbbb
  7. 去掉注释
  8. import itertools
  9. with open('a.txt') as f:
  10. for i in itertools.dropwhile(lambda line:line.startswith('#'),f):
  11. print(i)
  12.  
  13. >>aaaaaaaa
  14.  
  15. >>bbbbbbbb

使用dropwhile

9、排列组合的迭代

10、序列上索引值迭代

11、同时迭代多个序列

12、不同集合上元素的迭代

13、创建数据处理管道

14、展开嵌套的序列

判断元素可迭代后,递归yield生成器

  1. from collections import Iterable
  2. def flatten(items,ignore_type=(str,bytes)):
  3.  
  4. for i in items:
  5.  
  6. if isinstance(i,Iterable) and not isinstance(i,ignore_type):
  7.  
  8. yield from flatten(i)
  9.  
  10. else:
  11.  
  12. yield i
  13.  
  14. a=[1,2,[3,4,[5,6],7,8],9]
  15.  
  16. for i in flatten(a):
  17. print(i)

yield from

15、顺序迭代合并后的排序迭代对象

16、迭代器代替while无限循环

python cook 2的更多相关文章

  1. Python Cook函数笔记 【第一章】

    2017年4月28日 19:29:52 解压赋值给多个变量 可迭代的对象(list,tuple,string,文件对象,迭代器,生成器等),都可以进行解压赋值给多个对象. #!/usr/bin/env ...

  2. python cook 整理

    1.字符串分割 单个分隔符    'abc'.split('b')  >> ['a','c'] 多个分隔符    re.split(r'[b,d]','abcde') >>&g ...

  3. Python强大的格式化format

    原文地址:http://www.jb51.net/article/63672.htm 自python2.6开始,新增了一种格式化字符串的函数str.format(),可谓威力十足.那么,他跟之前的%型 ...

  4. Python零散函数

    1. python json.dumps() json.dump()的区别 注意cat ,是直接输出文件的内容 load和loads都是实现"反序列化",区别在于(以Python为 ...

  5. python相关资料链接

    后续的博客更新,会涉及到很多的python及python的框架相关的内容,这里将自己收藏的一些关于python相关资料的链接做一个整理,算是一个导航索引吧... PS:其中有些链接对应的技术团队文章, ...

  6. python代码执行bash命令 -- python3 cook book

    python代码执行bash命令相关 -- python3 cook book refer: https://python3-cookbook.readthedocs.io/zh_CN/latest/ ...

  7. python征程3.1(列表,迭代,函数,dic,set,的简单应用)

    1.列表的切片. 1.对list进行切片.'''name=["wangshuai","wangchuan","wangjingliang", ...

  8. python Django session/cookie

    一, Cookie #cookie # def cook1(request): # print(request.COOKIES) # 查看cooke # # print(request.get_sig ...

  9. Python标准库14 数据库 (sqlite3)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python自带一个轻量级的关系型数据库SQLite.这一数据库使用SQL语言.S ...

随机推荐

  1. ERROR: unable to bind listening socket for address '127.0.0.1:9000': Address already in use (98) [30-Jan-2018 16:12:27] ERROR: FPM initialization failed解决方法

    1.php启动之后发现访问nginx出现502错误,检查nginx.conf发现指定的php socket不存在 2.解决方法nginx修改陈这样,直接把绿色部门的socket写成本地地址+端口就可以 ...

  2. Logger级别和输出的地方

    转载自http://blog.csdn.net/u014756827/article/details/52475990 log4j日志配置 关键字: apache log4j 1.配置根Logger: ...

  3. cf水题

    题意:输入多组数据,有的数据代表硬币的长宽,有的数据代表钱包的长宽,问你当这组数据代表钱包的长宽时,能不能把它前面出现的所有硬币全部装下. 思路:只要钱包的长宽大于前面出现的所有硬币的长宽就可以装下, ...

  4. 呼叫中心获取sip数据报文

    1.下载sngrep并且安装: 运行 ./sngrep 进入呼叫列表,空格选中呼叫流,进入 2.呼叫信息 回车进入原始窗口 空格选中两条消息流,回车进入消息差异窗口 F8设置

  5. 论文笔记之:Learning Cross-Modal Deep Representations for Robust Pedestrian Detection

    Learning Cross-Modal Deep Representations for Robust Pedestrian Detection 2017-04-11  19:40:22  Moti ...

  6. arm中断体系结构

     ARM处理器中有7种类型的异常,按优先级从高到低的排列如下:                   复位异常(Reset).     数据异常(Data Abort).     快速中断异常(FIQ) ...

  7. kubernetes 实战4_命令_Configure Pods and Containers

    Configure Service Accounts for Pods A service account provides an identity for processes that run in ...

  8. 用spring tool suite插件创建spring boot项目时报An internal error occurred during: "Building UI model". com/google/common/

    本文为博主原创,未经允许不得转载 在用spring tool suite创建spring boot项目时,报一下异常: 查阅很多资料之后发现是因为装的spring tool suite的版本与ecli ...

  9. [luogu]P1852跳跳棋

    题目重点是每次不能跳过两个棋子 即对于每一个棋子的状态(a,b,c) (a<b<c) 最多有两种移动的方式 1.中间往两边跳 (a,b,c)-->(2b-a,a,c)或(a,c,2b ...

  10. Android 4.0之后的日历控件拥挤的解决办法

    本意是想做成这个样子的控件: 发现使用datepicker之后,效果完全不同,把整个日历都显示出来了.非常拥挤. 在datepicker中加入android:calendarViewShown=&qu ...