zoukankan      html  css  js  c++  java
  • 飘逸的python

    发现还有非常多人对yield不理解,云里雾里,于是试着用文字表述.

    仅仅要函数含有yield语句,它就返回一个生成器.所以我们与其把其看成函数定义,不如看作是生成器定义.函数用return返回,而生成器用yield返回.
    接下来是yield的行为.

    比方

    def html():
        yield 'header'
        for i in range(5):
            yield i
        yield 'footer'
    
    h = html()#此时h变量就是一个生成器.
    for x in h:#遍历生成器
        print x
    
    怎么理解这个函数呢?
    使用"yield消除技术",用一个结果变量来收集yield的东西并返回.
    于是转换成

    def html():
        ret = []
        ret.append('header')
        for i in range(5):
            ret.append(i)
        ret.append('footer')
        return ret
    
    能够看到,yield语句没了,全部东西都在ret这个序列.

    生成器的强大魔法在于它是延迟运行的,在须要的时候它才去运行代码,它"记住"了yield的运行位置,获取下一个结果的时候从上一次yield的位置继续往下走.
    所以生成器相对于list,它每一个时刻仅仅保存一个当前结果,节省了内存,缺点是无法用下标索引,遍历一次就没了.还有一个优点是能够生成无穷序列,如cycle.

    须要注意的是,当我们调用函数的时候,它并不開始运行函数体代码,仅仅是返回一个生成器.
    比方
    def A():
        print 'hehe'
        yield 1
        yield 2
    
    当我们A()时,并不会print 'hehe',而仅仅有当我们遍历的时候,它才開始运行,从函数体第一行代码直到第一个yield,而后继续往下运行代码到下一个yield,如此下去.



  • 相关阅读:
    toString() 与 JSON.stringify()
    ajax+node实现图片上传
    scrollHeight与offsetHeight
    【CSS】纯css实现立体摆放图片效果
    【逻辑】赛出25匹马的前3名
    【js】数组去重时间复杂度为n的方法
    【css】css2实现两列三列布局的方法
    初始原型链(三)
    初始原型链(二)
    织梦网站后台管理网站栏目管理项不显示问题解决办法
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5118561.html
Copyright © 2011-2022 走看看