zoukankan      html  css  js  c++  java
  • (23)迭代器、生成器

    *可迭代对象
    list,tuple,dict,str,generator(生成器)

    *迭代器
    迭代器肯定是iterable类型的对象,它是包含有next(Python 2) 方法或者__next__(Python 3) 方法和__iter__(返回self)方法的一个特殊对象,可以对这样一个对象进行for loop循环访问。
    对于实现next方法需要注意的是,当没有下一个元素的时候必须抛出StopIteration异常。
    当遍历一个迭代器的时候,它会修改内部状态,导致你只能向前获取下一个元素,不能通过迭代器访问后面一个元素;也就是说当你通过迭代器访问了一个元素以后,在当前循环中不能后退继续访问该元素了,除非你重新生产迭代器对象进行遍历。
    另外需要注意的是在迭代器中next方法是return下一个元素的值,不像下面介绍的生成器yield一个元素。

    class Iterator_: 
       def __init__(self, s, e):  
           self.current = s  
           self.end = e  
       def __iter__(self): 
           return self 
       def next(self): 
           if self.current < self.end: 
               self.index = self.current 
               self.current += 1 
               return self.index 
           else: 
               raise StopIteration 
    it = Iterator_(5, 8) 
    for i in it:  
        print "iterator:" + str(i) 
    #never print 
    for i in it:  
        print "second iterator:" + str(i) 
    #print again 
    it = Iterator_(5, 8) 
    for i in it:  
        print "second iterator:" + str(i) 
    #输出 
    iterator:5 
    iterator:6 
    iterator:7 
    second iterator:5 
    second iterator:6 
    second iterator:7 

    * 生成器
    对于一个生成器它一定是一个迭代器,可以通过for loop进行访问其中的元素,但是一个迭代器却很明显的不一定是生成器。
    定义迭代器有两种方式,第一个是使用yield关键词,另外一个是生成器表达式"()"。
    对于一个方法在方法体里加上yield关键词就变成了生成器。yield作用就是返回一个生成器,它会保存当前函数状态,
    记录下一次函数被调用next的时候运行状态。当函数没有下一次运行状态的时候,再继续调用next方法,这个时候StopIteration异常就被抛出。
    print "generator" 
    #first way  
    my_generator = (x for x in range(3)) 
    for i in my_generator: 
        print i 
    #second way 
    def Generator_(l): 
       n = 0  
       size = len(l) 
       while n < size: 
           yield l[n]    
           n += 1 
     
    ge = Generator_([1, 2, 3])  
    for g in ge:  
        print "generator:" + str(g) 

  • 相关阅读:
    IoC之Ninject
    C#中的扩展方法
    Office 2016 Pro Plus Project 专业版 Visio 专业版 64 位vol版本方便KMS小马oem
    Microsoft Office 2016 简体中文 Vol 版镜像下载
    svn 被锁住 冲突 Can't revert without reverting children
    定时检查服务批处理,发现服务停止立即启动服务
    C++中关于[]静态数组和new分配的动态数组的区别分析
    IP地址与无符号整数值相互转换
    算法:整数与ip地址转换
    将字符串表示的IP地址转变为整形表示
  • 原文地址:https://www.cnblogs.com/toby2chen/p/8465016.html
Copyright © 2011-2022 走看看