迭代器和生成器是python学者们经常谈到的话题,我也不能免俗,因为实在值得总结一下。
迭代器
迭代器是对可迭代对象进行操作,通过next方法一次吐出一个元素的工具。我们用到的for..in..内部使用的就是迭代器功能。
如果要自定义一个迭代器类的话,需要满足下面的条件:
- 需要在类中定义__iter__方法返回self自身,表示这是一个迭代器;
- 需要定义next方法来返回迭代的值,其中应该包含StopIteration异常的判断
下面试着写一个自定义迭代器类的例子(模仿自Python高级编程一书):
class CustomIter(object): def __init__(self, step): self.step = step def __iter__(self): return self def next(self): if self.step == 0: return StopIteration self.step -=1 return self.step i = CustomIter(2) #此处如果换为for i in CustomIter(2),则不需要后续的next手工调用, #也不会出现StopIteration的异常,因为for循环内部实现了next调用 print i.next() print i.next() print i.next() 运行结果如下: 1 0 <type ‘exceptions.StopIteration‘>
迭代器实际是一种底层的特性和概念,但是为生成器提供了一种支持。
生成器
有记忆性的函数暂停和恢复执行的表现,使用yield替代return语句,表示每次返回一个值并暂停执行。当再次被外部next调用时,利用函数上下文自动从暂停的位置继续运行,直到再次遇到yield语句。
让我们从代码中理解上面没太听明白的话:
#!/usr/bin/env python #encoding:utf-8 def testGenerator(): for x in ("first", "second", "third"): print "this is " + x yield x #每次返回x之后,会停止 print "do other things" b = testGenerator() print b.next() print u"\n------再次执行next():------\n" #再次运行next print b.next() 运行结果如下: this is first first ------再次执行next():------ do other things this is second second
生成器的其他形式:
yield表达式,即在函数体中存在var = (yield),表示可以得到客户端调用send(生成器对象的方法)发送进来的数据
后面再说吧,头疼
时间: 2024-10-14 22:07:20