python基础教程(十一)
迭代器
本节进行迭代器的讨论。只讨论一个特殊方法---- __iter__ ,这个方法是迭代器规则的基础。
迭代器规则
迭代的意思是重复做一些事很多次---就像在循环中做的那样。__iter__ 方法返回一个迭代器,所谓迭代器就是具有next方法的对象,在调用next方法时,迭代器会返回它的下一个值。如果next方法被调用,但迭代器没有值可以返回,就会引发一个StopIteration异常。
这里是一个婓波那契数例,使用迭代器如下:

class Fibs:
def __init__(self):
self.a = 0
self.b = 1
def next(self):
self.a , self.b = self.b , self.a + self.b
return self.a
def __iter__(self):
return self >>> fibs = Fibs()
>>> for f in fibs:
if f > 1000:
print f
break #因为设置了break ,所以循环在这里停止。 1597

内建函数iter可以从可迭代的对象中获得迭代器。
>>> it = iter([1,2,3])
>>> it.next()
1
>>> it.next()
2
从迭代器得到序列
除了在迭代器和可迭代对象上进行迭代外,还能把它们转换为序列。在大部分能使用序列的情况下,能使用迭代器替换。

class TestIterator:
value = 0
def next(self):
self.value += 1
if self.value > 10: raise StopIteration
return self.value
def __iter__(self):
return self >>> ti = TestIterator()
>>> list(ti)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

生成器
生成器也叫 简单生成器,生成器可以帮助读者写出非常优雅的代码,当然,编写任何程序时不使用生成器也是可以的。
创建生成器
创建一个生成器就像创建函数一样简单。

>>> def flatten(nested):
for sublist in nested:
for element in sublist:
yield element >>> nested = [[1,2],[3,4],[5]]
#使用for循环
>>> for num in flatten(nested):
print num 1
2
3
4
5
#或使用list函数
>>> list(flatten(nested))
[1, 2, 3, 4, 5]

递归生成器
上面创建的生成器只能处理两层嵌套,为了处理嵌套使用了两个for循环,如果要处理任意层的嵌套呢?例如,可以每层嵌套需要增加一个for循环,但不知道有几层嵌套,所以必须把解决方案变得更灵活,现在可以用递归来解决。

>>> def fla(aa):
try:
for bb in aa:
for cc in fla(bb):
yield cc
except TypeError:
yield aa >>> list(fla([[[1],2],3,4,[5,[6,7]],8])) #注意括号层次比较多
[1, 2, 3, 4, 5, 6, 7, 8]

当fla被调用时有两种情况:基本情况和需要递归的情况
在基本的情况中,函数被告知展开一个元素,这种情部下,for循环会引发一个TypeError 异常,生成会产生一个元素。
如果展开的是一个列表,那么就需要特殊情况处理。程序必须遍历所有的子列表,并对它们调用fla。
-------------------
上面的做法有一个问题:如果aa 是一个类似于字符串的对象(字符串、Unicode、UserString等),那么它就是一个序列,不会引发TypeError,但是你不想对这样的对象进行迭代。
为了处理这种情况,则必须在生成器的开始处添加一个检查语句。试着将传入的对象和一个字符串拼接,看看会不会出现TypeError,这是检查一个对象是不是类似于字符串最简单快速的方法。

>>> def flatten(nested):
try:
#不要迭代类似字符串的对象
try:nested + ''
except TypeError: pass
else: raise TypeError
for sublist in nested:
for element in flatten(sublist):
yield element
except TypeError:
yield nested >>> list(flatten(['foo',['bar',['baz']]]))
['foo', 'bar', 'baz']

如果nested+’’ 引发了一个TypError ,它就会被忽略。如果没有引发TypeError,那么内层try语句就会引发一个它自己的TypeError异常。
生成器方法
生成器新属性是在开始运行后为生成器提供值的能力。表现为生成器和“外部世界”进行交流的渠道:
* 外部作用域访问生成器的send方法,就像访问next 方法一样,只不过前者使用一个参数(发送的“消息”---任意对象)
* 在内部则挂起生成器,yield现在作为表达式而不是语句使用,换句话说,当生成器重新运行的时候,yield方法返回一个值,也就是外部通过send方法发送的值。如果next 方法被使用,那么yield方法返回None.
下面简单的方例子来说明这种机制:

>>> def repeater(value):
while True:
new =(yield value)
if new is not None:value = new >>> r = repeater(42)
>>> r.next()
42
>>> r.send("hello, world!")
'hello, world!'

生成器的另两个方法:
* throw方法(使用异常类型调用,还有可选的值以及回溯对象)用于在生成器内引发一个异常(在yield表达式中)
* close 方法(调用时不用参数)用于停止生成器。
python基础教程(十一)的更多相关文章
- 改写《python基础教程》中的一个例子
		
一.前言 初学python,看<python基础教程>,第20章实现了将文本转化成html的功能.由于本人之前有DIY一个markdown转html的算法,所以对这个例子有兴趣.可仔细一看 ...
 - .Net程序员之Python基础教程学习----列表和元组 [First Day]
		
一. 通用序列操作: 其实对于列表,元组 都属于序列化数据,可以通过下表来访问的.下面就来看看序列的基本操作吧. 1.1 索引: 序列中的所有元素的下标是从0开始递增的. 如果索引的长度的是N,那么所 ...
 - python基础教程笔记—即时标记(详解)
		
最近一直在学习python,语法部分差不多看完了,想写一写python基础教程后面的第一个项目.因为我在网上看到的别人的博客讲解都并不是特别详细,仅仅是贴一下代码,书上内容照搬一下,对于当时刚学习py ...
 - python基础教程(一)
		
之所以选择py交易有以下几点:1.python是胶水语言(跨平台),2.python无所不能(除了底层),3.python编写方便(notepad++等文本编辑器就能搞事情),4.渗透方面很多脚本都是 ...
 - Python基础教程2上的一处打印缺陷导致的代码不完整#1
		
#1对代码的完善的 出现打印代码处缺陷截图: 图片上可以看到,定义的request根本没有定义它就有了.这个是未定义的,会报错的,这本书印刷问题,这个就是个坑,我也是才发现.花了点时间脱坑. 现在发完 ...
 - python基础教程(第二版)
		
开始学习python,根据Python基础教程,把里面相关的基础章节写成对应的.py文件 下面是github上的链接 python基础第1章基础 python基础第2章序列和元组 python基础第3 ...
 - python基础教程1:入门基础知识
		
写在系列前,一点感悟 没有梳理总结的知识毫无价值,只有系统地认真梳理了才能形成自己的知识框架,否则总是陷入断片儿似的学习-遗忘循环中. 学习方法真的比刻苦"傻学"重要多了,而最重要 ...
 - Python基础教程-第3版(文字版) 超清文字-非扫描版 [免积分、免登录]
		
此处免费下载,无需账号,无需登录,无需积分.收集自互联网,侵权通知删除. 点击下载:Python基础教程-第3版 备用下载:Python基础教程-第3版
 - Python基础教程学习笔记:第一章 基础知识
		
Python基础教程 第二版 学习笔记 1.python的每一个语句的后面可以添加分号也可以不添加分号:在一行有多条语句的时候,必须使用分号加以区分 2.查看Python版本号,在Dos窗口中输入“p ...
 - 【Python】Python基础教程系列目录
		
Python是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. 在现在的工作及开发当中,Python的使用越来越广泛,为了方便大家的学习,Linux大学 特推出了 <Python基 ...
 
随机推荐
- jmeter压力测试报告 - DEMO
			
XXX压力测试报告 时间:2015-08-04 测试人员:xxx 目录 XXX压力测试报告... 1 一 测试 ...
 - SQL Prompt 破解之道
			
1. 下载SQL Prompt 5.3.4.1,是个压缩包,里面有三个文件 免登录免积分下载地址:http://download.csdn.net/detail/caizz520/4557385 1) ...
 - 将csv格式的文件数据导入mysql中
			
示例如下: load data infile 'test.csv'into table `test`fields terminated by ',' optionally enclosed by '& ...
 - html5 01 随记
			
一 HTML 是一种制作网站的标记语言 二.HTML基本语法 HTML 标签 html标签是html中的最基本单位 也是最重要的部分 通常使用尖角号 开始"<"和结束&qu ...
 - Collections 的 synchronized XXX方法
			
摘要 static <T> Collection<T> synchronizedCollection(Collection<T> c) 返回指定 collectio ...
 - javascript实现朴素贝叶斯分类与决策树ID3分类
			
今年毕业时的毕设是有关大数据及机器学习的题目.因为那个时间已经步入前端的行业自然选择使用JavaScript来实现其中具体的算法.虽然JavaScript不是做大数据处理的最佳语言,相比还没有优势,但 ...
 - python爬煎蛋妹子图--20多行代码搞定煎蛋妹子图库
			
如果说一个人够无聊的话... 就会做一些十分美(wei)丽(suo)的事情啦哈哈哈... 好的,话不多说,进入正题. 正如标题所示,我们今天的目标很简单: 代码要少,妹子要好. 步骤如下: 1. 首先 ...
 - Go语言学习笔记(六)net
			
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 net import "net" net包提供了可移植的网络I/O接口,包括TCP/IP.UD ...
 - pentaho之kettle篇---kettle基本操作
			
今天先来做一个简单的kettle的例子. 打开输入,选择CSV文件输入. 双击CSV文件输入图标,可以看见如下: 步骤名称:就是你这一步的名字,可以任意取,原则就是要明白,清楚这一步是做了什么操作. ...
 - [ZYNQ-7]PS处理PL外部中断的简单实例的剖析    (参考米联miz702n)
			
Zynq的ARM通过GIC中断控制器来接收核仲裁所有的中断.由于中断向量表只有4Bytes大小,仅仅正好存放一条跳转语句,因此当产生一个外部中断时,中断处理的大致过程:PC内容保存到LR_IRQ用于中 ...