zoukankan      html  css  js  c++  java
  • Python之路【第二十八篇】:生成器与迭代器

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    #只要函数的代码里面出现了yield关键字,这个函数就不再是一个普通的函数了,叫做生成器函数
    #执行生成器函数,获取到的东西就叫做生成器
    #生成器的一个好处就是无需在内存中创键所有东西,什么时候需要什么时候创建
    '''
    def fun():
        yield 1
        yield 2
    
    r = fun()
    '''
    #fun是生成器函数,r是生成器,生成器具有生成一些东西的能力
    
    ###################生成器原理#######################
    '''
    #定义一个生成器函数
    def fun():
        print(11)
        yield 1
    
        print(22)
        yield 2
    
        print(33)
        yield 3
    
    #执行生成器函数,仅仅获取了一个生成器,不会输出任何值
    r = fun()
    
    
    #执行生成器的__next__方法,碰到yield就退出,这里的yield相当于普通函数里面的return,但是不一样,yield可以保存上一次的执行状态,而return 是直接退出的返回值是第一个yield的值
    ret = r.__next__()
    print(ret)
    
    #再次执行生成器的__next__方法,返回值是第二个yield的值
    ret = r.__next__()
    print(ret)
    '''
    ############################################################
    
    
    
    ########################生成器实现#######################
    
    def xrange(n):
        start = 0
        while True:
            if start > n:
                return
            yield start
            start += 1
    
    obj = xrange(5)
    
    n1 = obj.__next__()
    n2 = obj.__next__()
    n3 = obj.__next__()
    n4 = obj.__next__()
    n5 = obj.__next__()
    
    print(n1,n2,n3,n4,n5)
    
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    #生成器仅仅具有一种生成能力
    #如和将一个函数变为生成器,在函数里面出现了yield,这个函数就不再是普通的函数了,叫生成器函数,执行这个生成器函数就会得到一个生成器
    #迭代器具有访问能力,迭代器是一个一个进行迭代,只能一个一个往后找,不能往前找
    #迭代器特点:
    #访问者不需要关心迭代器内部的结构,仅需要通过next()方法不断去取下一个内容
    #不能随机的访问集合中的某个值,只能从头到尾依次访问
    #访问到一半时,不能往后退
    #便于循环比较大的数据集合,节省内存
    
    #迭代器本质上也是通过next一个一个去取,我们在用的时候直接用for循环迭代就可以了
    #生成器需要自己写,而迭代器直接用for循环就可以了
    
    def xrange(n):
        start = 0
        while True:
            if start > n:
                return
            yield start
            start += 1
    
    for x in xrange(10):
        print(x)
    

    生成器与迭代器综合练习:

    #! usr/bin/env python
    # -*-coding = utf-8 -*-
    
    #生成器
    
    def range(n):
        start = 0
        while True:
            if start < n:
                yield start
                start += 1
            else:
                return
    #迭代器
    for i in range(10):
        print(i)  

      对于生成器的理解要注意,在例程中,我们使用的是一些整数,既然是生成器,那么可不可以生成别的东西,比如类似于列表或者字典这样的数据结构,可以,如:

    li = [1,2,3,4,5]
    for item i li:
        yield{
            'index':item
        }
    

     比如上面类似的写法,也是个生成器,不过生成器中的数据结构是字典形式的 

      

    转载于:https://www.cnblogs.com/ronghe/p/9259014.html

  • 相关阅读:
    跨域资源共享 CORS 详解以及IIS中的配置方法
    c#创建文件夹时无法访问路径,路径拒绝访问
    C#接口在派生类和外部类中的调用
    .NET/C#识别用户访问设备
    另一个SqlParameterCollection中已包含SqlParameter
    Java中throw和throws的区别
    MySQL与Oracle的语法区别详细对比
    hibernte中用criteria实现not in功能的方法
    使用Hibernate SQLQuery执行原生SQL
    hibernate查询数据表char类型字段只返回一个字符
  • 原文地址:https://www.cnblogs.com/twodog/p/12136578.html
Copyright © 2011-2022 走看看