zoukankan      html  css  js  c++  java
  • 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方法,直到抛出异常停止。

     

  • 相关阅读:
    mac使用vnc远程登录ubuntu16.04桌面
    last的用法
    MAC笔记本安装telnet
    lsyncd自动同步配置
    四则运算——安卓版
    敏捷开发方法综述
    数组2——数组首尾相接,求最大子数组
    数组1——求一个数组的最大子数组
    《构建之法》阅读笔记04
    学习进度条——第四周
  • 原文地址:https://www.cnblogs.com/lipijin/p/3341987.html
Copyright © 2011-2022 走看看