python cook 2
迭代器 iterator 生成器 generator
1、手动遍历迭代器
2、代理迭代
解释:将迭代操作代理到容器内部的对象上
操作:使用__iter()__, for 循环遍历对象时,会自动调用类特殊成员方法__iter()__
class Foo(object): def __init__(self, sq):
self.sq = sq def __iter__(self):
return iter(self.sq) obj = Foo([11,22,33,44]) for i in obj:
print i
自定义可迭代的类
3、使用生成器创建新的迭代模式
生成器也是一种可迭代的对象
函数内使用了yeild ,则该函数就变成了一个生成器
生成器只能用于迭代操作 ,如 next()
for 循环 是一种迭代操作,其内部调用了next()
for循环语法内部做了什么?
obj = iter([11,22,33,44]) while True:
val = obj.next()
print val
for 循环语法内部
4、实现迭代器协议
略
5、反向迭代
列表或字典等可以使用reversed()进行反向迭代;
自定义对象内部实现了__reversed__()__的特殊方法时,可以使用reversed(obj),反向迭代生效。
6、带有外部状态的生成器函数
自定义一个类,把生成器函数放到__iter__()方法中,例如
from collections import deque
class linehistory:
def __init__(self, lines, histlen=3):
self.lines = lines
self.history = deque(maxlen=histlen)
def __iter__(self):
for lineno, line in enumerate(self.lines, 1):
self.history.append((lineno, line))
yield line
def clear(self):
self.history.clear()
生成器类
7、迭代器切片
使用 itertools.islice(iterator,start,end) 来对迭代器和生成器切片,返回一个可迭代的 islice 对象,同时 原来的迭代器会被消耗
如果需要之后再次访问这个迭代器,记得先把它里面的数据放入一个列表中
def count(n):
while True:
yield n
n += 1
c = count(0) imort itertools
for i in itertools(c,0,3)
print(i)
>0
>1
>2
生成器切片
8、跳过可迭代对象的开始部分
itertools.dropwhile(func,itertor) 每次迭代的值会传入func,当func返回值为True时,丢弃该值,直到func返回值为false时,停止判断返回后面所有的值
a.txt 前三行为注释
#
#
#
aaaaaaaa
bbbbbbbb
去掉注释
import itertools
with open('a.txt') as f:
for i in itertools.dropwhile(lambda line:line.startswith('#'),f):
print(i) >>aaaaaaaa >>bbbbbbbb
使用dropwhile
9、排列组合的迭代
10、序列上索引值迭代
11、同时迭代多个序列
12、不同集合上元素的迭代
13、创建数据处理管道
14、展开嵌套的序列
判断元素可迭代后,递归yield生成器
from collections import Iterable
def flatten(items,ignore_type=(str,bytes)): for i in items: if isinstance(i,Iterable) and not isinstance(i,ignore_type): yield from flatten(i) else: yield i a=[1,2,[3,4,[5,6],7,8],9] for i in flatten(a):
print(i)
yield from
15、顺序迭代合并后的排序迭代对象
16、迭代器代替while无限循环
python cook 2的更多相关文章
- Python Cook函数笔记 【第一章】
2017年4月28日 19:29:52 解压赋值给多个变量 可迭代的对象(list,tuple,string,文件对象,迭代器,生成器等),都可以进行解压赋值给多个对象. #!/usr/bin/env ...
- python cook 整理
1.字符串分割 单个分隔符 'abc'.split('b') >> ['a','c'] 多个分隔符 re.split(r'[b,d]','abcde') >>&g ...
- Python强大的格式化format
原文地址:http://www.jb51.net/article/63672.htm 自python2.6开始,新增了一种格式化字符串的函数str.format(),可谓威力十足.那么,他跟之前的%型 ...
- Python零散函数
1. python json.dumps() json.dump()的区别 注意cat ,是直接输出文件的内容 load和loads都是实现"反序列化",区别在于(以Python为 ...
- python相关资料链接
后续的博客更新,会涉及到很多的python及python的框架相关的内容,这里将自己收藏的一些关于python相关资料的链接做一个整理,算是一个导航索引吧... PS:其中有些链接对应的技术团队文章, ...
- python代码执行bash命令 -- python3 cook book
python代码执行bash命令相关 -- python3 cook book refer: https://python3-cookbook.readthedocs.io/zh_CN/latest/ ...
- python征程3.1(列表,迭代,函数,dic,set,的简单应用)
1.列表的切片. 1.对list进行切片.'''name=["wangshuai","wangchuan","wangjingliang", ...
- python Django session/cookie
一, Cookie #cookie # def cook1(request): # print(request.COOKIES) # 查看cooke # # print(request.get_sig ...
- Python标准库14 数据库 (sqlite3)
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python自带一个轻量级的关系型数据库SQLite.这一数据库使用SQL语言.S ...
随机推荐
- 前端 --- 2 css
一. CSS的几种引入方式 1.行内样式 2.内部样式 写在网页的<head></head>标签对的<style></style>标签对中 3.外部样式 ...
- 16 级高代 II 思考题十的多种证明
16 级高代 II 思考题十 设 $V$ 是数域 $\mathbb{K}$ 上的 $n$ 维线性空间, $\varphi$ 是 $V$ 上的线性变换, 证明: $\varphi$ 的极小多项式 $m ...
- ImageView控件有关问题
了解了一下ImageView控件,这个控件本身及其属性倒没有什么特别之处.只是在看<第一行代码>时,郭大神写到创建drawable-xhdpi文件有些问题,首先先说drawable和mip ...
- oracle数据库的一个表中,怎么设置字段的默认值
如果表已经存在,用如下方法设置默认值. alter table 表名 modify 字段名 default 默认值; 如test表中设置address字段为'浙江省',可用如下语句: alter ta ...
- Linux系统PWM驱动【转】
本文转载自:https://blog.csdn.net/BorntoX/article/details/51879786 硬件平台:IMX6 内核版本:kernel3.0.35 在linux内核中有一 ...
- How can I move a MySQL database from one server to another?
My favorite way is to pipe a sqldump command to a sql command. You can do all databases or a specifi ...
- dfs序七个经典问题
update-2018.07.23: 原文问题五思路描述有误,已更正. 参考自:<数据结构漫谈>-许昊然 dfs序是树在dfs先序遍历时的序列,将树形结构转化成序列问题处理. dfs有一个 ...
- ES6中对象
ES6允许把声明的变量直接赋值给对象,我们看下面的例子. let name="Zachary"; let skill= 'web'; let obj= {name,skill}; ...
- lvs笔记
LVS是Linux Virtual Server的简写,意为Linux虚拟服务器,是虚拟的服务器集群系统,可在UNIX/LINUX平台下实现负载均衡集群功能.该项目在1998年5月由章文嵩博士组织成立 ...
- Qt中中文字符 一劳永逸的解决方法
QT中中文字符问题,有没有一劳永逸的解决方法? 目前遇到有以下问题 1.字符串中有中文时,编译提示"常量中含有换行符" 2.在控制台窗口输出中文时无法正常显示,中文全部显示为? 目 ...