• Python生成器 yield


    迭代器与list相比较,就for in句型循环拿数据而言:

      用list写很简洁,但如果list数据过大,会很消耗资源。

      用iteration 迭代器写,则不会消耗那么多资源。他会随用随取,用一个拿一个。但是你要会先写一个迭代器类,然后才能for in,这样就很不简洁。

    有没有既像list那样简洁,又像迭代器那样省资源的方法呢。yield 生成器来了:

    #非波那且数列:
    def func(max): #参数表示要返回前max个非波那且数
        #n是计数用,a b分别为第一和第二个肥波那切数
        n, a, b = 0, 0, 1
    
        while n < max:
            yield b
            a, b = b, a + b
            n += 1
    
    #以上就是一个生成器,写法比较简洁,用起来也很方便
    for i in func(5):
        print i
    
    #以上操作是依次打印出前五个肥波那切数。
    
    '''注意:'''
    '''
    func是函数,不可迭代
    func(5)是生成器,可迭代
    生成器与迭代器效果很相似,单纯调用func(5)没用,而是要调用他的next方法
    '''
    f = func(7)
    print f.next()
    print f.next()
    print f.next()
    #以上是打印出前三个肥波那切数的操作
    #反过来说,for in 操作会自动触发迭代器和生成器的next方法

    yield把func函数给变了,不是一般函数了。func中没写return,但是func(5)的话你会发现,返回了一个generation生成器对象。

    所以yield作用就是把函数变成一个生成器,可实现与iteration同样的效果,每次调用next方法,直到抛出异常停止。

     

  • 相关阅读:
    使用git svn工具进行svn 到git仓库的同步[持续更新]
    解决Linux无法存储svn密码
    spring boot @ResponseBody 注解情况下返回自定义类报错406
    解决mysql密码正确的情况下而无法连接的问题
    react项目实现国际化i18n
    github clone加速
    Centos模板机配置
    Xshell终端连接服务器慢,问题解决方法
    佛祖保佑永无 BUG 代码注释
    本地代理web端口
  • 原文地址:https://www.cnblogs.com/lipijin/p/3341987.html
Copyright © 2020-2023  润新知