python高级编程-Part1 生成器和迭代器

    迭代器和生成器是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(生成器对象的方法)发送进来的数据

    后面再说吧,头疼

本文出自 “无名” 博客,请务必保留此出处http://xdzw608.blog.51cto.com/4812210/1601317

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。